Framework RPC Distribuido Apache Dubbo (Aprendizaje)

Tabla de contenido

1. Proceso de evolución de la arquitectura de software

1.1 Arquitectura monolítica

1.2 Arquitectura vertical

1.3 Arquitectura SOA (Arquitectura Orientada a Servicios)

1.4 Arquitectura de microservicios

2. Descripción general de Apache Dubbo

2.1 Introducción

2.2 Arquitectura Dubbo

3. Centro de registro de servicios Zookeeper

3.1 Introducción a Zookeeper

3.2 Instalar Zookeeper

3.3 Iniciar y detener Zookeeper

4. Inicio rápido de Dubbo

4.1 Desarrollo de proveedores de servicios

4.2 Desarrollo de consumidores de servicios


1. Proceso de evolución de la arquitectura de software

        El desarrollo de la arquitectura de software ha experimentado el proceso de evolución desde arquitectura única, arquitectura vertical, arquitectura SOA hasta arquitectura de microservicio.

1.1 Arquitectura monolítica

Descripción de la arquitectura: Todas las funciones se concentran en un solo proyecto (All in one).

Ventajas de la arquitectura: arquitectura simple, bajo costo de desarrollo inicial, ciclo de desarrollo corto, adecuado para proyectos pequeños.

Desventajas de la arquitectura: todas las funciones están integradas en un proyecto, lo que no es fácil de desarrollar, expandir y mantener para proyectos a gran escala; la pila de tecnología es limitada y solo se puede usar un lenguaje para el desarrollo; la expansión del rendimiento del sistema solo se puede hecho mediante la expansión de los nodos del clúster, lo cual es costoso.

1.2 Arquitectura vertical

Descripción de la arquitectura: Dividir según el negocio para formar pequeños proyectos individuales.

Ventajas arquitectónicas: la pila de tecnología es escalable (diferentes sistemas pueden escribirse en diferentes lenguajes de edición).

Desventajas de la arquitectura: las funciones se concentran en un proyecto, lo que no favorece el desarrollo, la expansión y el mantenimiento; la expansión del sistema solo se puede hacer a través de clústeres; redundancia funcional, redundancia de datos y fuerte acoplamiento entre proyectos.

1.3 Arquitectura SOA (Arquitectura Orientada a Servicios)

        Arquitectura SOA, es decir, arquitectura orientada a servicios. Los componentes (servicios) de aplicaciones de granularidad gruesa acoplados libremente se pueden implementar, combinar y usar de manera distribuida a través de la red de acuerdo con los requisitos. Un servicio suele existir en un proceso del sistema operativo de forma independiente.

        Desde un punto de vista funcional, la lógica comercial se abstrae en servicios reutilizables y la regeneración comercial rápida se realiza a través de la orquestación de servicios. El propósito es transformar las funciones comerciales inherentes originales en servicios comerciales generales y lograr una reutilización rápida de la lógica comercial.

Descripción de la arquitectura: extraiga funciones o módulos repetidos en componentes, proporcione servicios externos y use ESB (Enterprise Service Bus) como puente de comunicación entre proyectos y servicios.

Ventajas de la arquitectura: las funciones o módulos repetidos se extraen como servicios para mejorar la eficiencia del desarrollo; alta reutilización; alta capacidad de mantenimiento.

Desventajas de la arquitectura: El negocio de cada sistema es diferente, y es difícil confirmar que las funciones o módulos estén duplicados; la granularidad de los servicios extraídos es grande; el acoplamiento entre sistemas y servicios es alto.

1.4 Arquitectura de microservicios

Dividido en capa de interfaz de usuario, capa de servicio, capa de datos.

Descripción de la arquitectura: la capa de servicio del sistema está completamente separada y extraída como microservicios uno por uno. La granularidad de la extracción es más fina, siguiendo el principio único y adoptando un protocolo de marco ligero para la transmisión.

Ventajas de la arquitectura: la granularidad de la división del servicio es más fina, lo que conduce a mejorar la eficiencia del desarrollo; se pueden formular esquemas de optimización correspondientes para diferentes servicios; es adecuada para la era de Internet y el ciclo de iteración del producto es más corto.

Desventajas de la arquitectura: una granularidad demasiado fina conduce a demasiados servicios y altos costos de mantenimiento; el costo técnico del desarrollo del sistema distribuido es alto, lo que representa un gran desafío para el equipo.

2. Descripción general de Apache Dubbo

2.1 Introducción

        Apache Dubbo es un framework Java RPC de alto rendimiento. Su predecesor es el framework Java RPC ligero y de código abierto de Alibaba, que se puede integrar perfectamente con Spring. En 2018, Alibaba donó este framework a la Fundación Apache.

¿Qué son los RPC?

        El nombre completo de RPC es llamada a procedimiento remoto, es decir, llamada a procedimiento remoto. Por ejemplo, hay dos servidores A y B. Una aplicación se implementa en el servidor A y una aplicación se implementa en el servidor B. La aplicación en el servidor A desea llamar al método proporcionado por la aplicación en el servidor B. Dado que las dos aplicaciones son no en el mismo espacio de memoria, no se pueden llamar directamente, por lo que es necesario expresar la semántica de la llamada y transmitir los datos de la llamada a través de la red.

        Cabe señalar que RPC no es una tecnología específica, sino que se refiere a todo el proceso de llamada remota de la red.

        RPC es un concepto generalizado, estrictamente hablando, todos los métodos de llamada a procedimientos remotos pertenecen a la categoría de RPC. Varios lenguajes de desarrollo tienen su propio marco RPC. Hay muchos marcos RPC en Java, y RMI, Hessian, Dubbo, etc. son ampliamente utilizados.

Dirección del sitio web oficial: http://dubbo.apache.org

Dubbo proporciona tres capacidades principales: invocación de métodos remotos orientados a la interfaz, tolerancia inteligente a fallas y balanceo de carga, y registro y descubrimiento de servicios automáticos.

2.2 Arquitectura Dubbo

Diagrama de arquitectura:

Descripción del rol del nodo:

nodo

Nombre de rol
Proveedor El proveedor del servicio expuesto
Consumidor El consumidor del servicio que invoca el servicio remoto.
Registro Registro para registro y descubrimiento de servicios
Monitor Un centro de monitoreo que cuenta las llamadas de servicio y los tiempos de llamada
Envase contenedor de ejecución de servicio

        Las líneas punteadas son todos los accesos asíncronos, y las líneas continuas son todos los accesos síncronos. Las líneas punteadas azules: funciones completadas al inicio. Las líneas punteadas rojas (líneas continuas) son todas las funciones ejecutadas durante la ejecución del programa.

Descripción de la relación de llamadas:

  1. El contenedor de servicios es responsable de iniciar, cargar y ejecutar el proveedor de servicios;
  2. Cuando el proveedor de servicios inicia, registra los servicios que brinda con el centro de registro;
  3. Cuando el consumidor del servicio comienza, se suscribe al centro de registro para los servicios que necesita;
  4. El centro de registro devuelve la lista de direcciones del proveedor de servicios al consumidor. Si hay un cambio, el centro de registro enviará los datos del cambio al consumidor en función de la conexión larga;
  5. El consumidor del servicio, de la lista de direcciones de proveedores, selecciona un proveedor para llamar en función del algoritmo de equilibrio de carga suave y, si la llamada falla, selecciona otro proveedor para llamar;
  6. Los consumidores y proveedores de servicios acumulan el número de llamadas y el tiempo de llamada en la memoria y envían regularmente datos estadísticos al centro de monitoreo cada minuto.

3. Centro de registro de servicios Zookeeper

        Como se puede ver en el diagrama de arquitectura Dubbo anterior, el Registro (centro de registro de servicios) juega un papel vital en él. Dubbo recomienda oficialmente usar Zookeeper como registro de servicios.

3.1 Introducción a Zookeeper

        Zookeeper es un subproyecto de Apache Hadoop. Es un servicio de directorio de tipo árbol que admite cambio push. Es adecuado como centro de registro para los servicios de Dubbo. Tiene una alta potencia industrial y se puede utilizar en entornos de producción y se recomienda.
        Para comprender el servicio de directorio en árbol de Zookeeper, primero veamos el sistema de archivos de nuestra computadora (también una estructura de directorio en árbol):

        Mi computadora se puede dividir en varias letras de unidad (como C, D, E, etc.) y se pueden crear varios directorios debajo de cada letra de unidad. Se pueden crear archivos y subdirectorios debajo de cada directorio y, finalmente, se forma un árbol. estructura tipo. A través de este directorio con estructura de árbol, podemos almacenar archivos en diferentes categorías, lo que nos resulta conveniente para buscar más adelante. Y cada archivo en el disco tiene una ruta de acceso única, por ejemplo: C:\Windows\kkb\hello.txt.

        Servicio de directorio del árbol Zookeeper:

 Descripción del flujo:


  • Cuando se inicia el proveedor de servicios (Proveedor): escriba su propia dirección URL en el directorio /dubbo/com.foo.BarService/providers
  • Cuando se inicia el consumidor del servicio (Consumidor): suscríbase a la dirección URL del proveedor en el directorio /dubbo/com.foo.BarService/providers
    . Y escriba su propia dirección URL en el directorio /dubbo/com.foo.BarService/consumers
  • Cuando se inicia el Centro de Monitoreo (Monitor): suscríbase a todas
    las direcciones URL de proveedores y consumidores en el directorio /dubbo/com.foo.BarService

3.2 Instalar Zookeeper

Dirección de descarga: http://archive.apache.org/dist/zookeeper/

        La versión de Zookeeper utilizada en este curso es 3.4.6. Una vez completada la descarga, puede obtener un archivo comprimido llamado zookeeper-3.4.6.tar.gz.

Pasos de instalación:

El primer paso: instalar jdk (omitido)

Paso 2: Cargue el paquete comprimido zookeeper (zookeeper-3.4.6.tar.gz) al sistema Linux

Paso 3: Descomprima el paquete comprimido tar -zxvf zookeeper-3.4.6.tar.gz -C /usr

Paso 4: ingrese al directorio zookeeper-3.4.6 y cree el directorio de datos mkdir data

Paso 5: ingrese al directorio conf y cambie el nombre de zoo_sample.cfg a zoo.cfg cd confmv zoo_sample.cfg zoo.cfg

Paso 6: abra el archivo zoo.cfg y modifique el atributo de datos: dataDir=/usr/zookeeper-3.4.6/data

3.3 Iniciar y detener Zookeeper

Ingrese al directorio bin de Zookeeper,

Comando de inicio de servicio: ./zkServer.sh start
Comando de detención de servicio: ./zkServer.sh stop
Ver estado del servicio: ./zkServer.sh status
Conexión de cliente: ./zkCli.sh

4. Inicio rápido de Dubbo

        Como marco RPC, la función central de Dubbo es realizar llamadas remotas a través de redes. Esta sección es para crear dos aplicaciones, una como proveedor de servicios y otra como consumidor de servicios. A través de Dubbo, se realiza el método para que el consumidor del servicio llame de forma remota al proveedor del servicio.

4.1 Desarrollo de proveedores de servicios

Pasos de desarrollo:

(1) Cree un proyecto maven (el método de empaquetado es war) dubbodemo_provider e importe las siguientes coordenadas en el archivo pom.xml

<properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <maven.compiler.source>1.8</maven.compiler.source>
 <maven.compiler.target>1.8</maven.compiler.target>
 <spring.version>5.0.5.RELEASE</spring.version>
</properties>
<dependencies>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>${spring.version}</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>${spring.version}</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>${spring.version}</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>${spring.version}</version>
 </dependency>
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>${spring.version}</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jms</artifactId>
  <version>${spring.version}</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>${spring.version}</version>
 </dependency>
 <!-- dubbo相关 -->
 <dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>dubbo</artifactId>
  <version>2.6.0</version>
 </dependency>
 <dependency>
  <groupId>org.apache.zookeeper</groupId>
  <artifactId>zookeeper</artifactId>
  <version>3.4.7</version>
 </dependency>
 <dependency>
  <groupId>com.github.sgroschupf</groupId>
  <artifactId>zkclient</artifactId>
  <version>0.1</version>
 </dependency>
 <dependency>
  <groupId>javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.12.1.GA</version>
 </dependency>
 <dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.47</version>
 </dependency>
</dependencies>
<build>
 <plugins>
  <plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>2.3.2</version>
   <configuration>
    <source>1.8</source>
    <target>1.8</target>
   </configuration>
  </plugin>
  <plugin>
   <groupId>org.apache.tomcat.maven</groupId>
   <artifactId>tomcat7-maven-plugin</artifactId>
   <configuration>
    <!-- 指定端口 -->
    <port>8081</port>
    <!-- 请求路径 -->
    <path>/</path>
   </configuration>
  </plugin>
 </plugins>
</build>

(2) Configurar el archivo web.xml

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
 <display-name>Archetype Created Web Application</display-name>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext*.xml</param-value>
 </context-param>
 <listener>
  <listener-
class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
</web-app>

(3) Crear una interfaz de servicio

package com.lxs.service;
public interface HelloService {
  public String sayHello(String name);
}

(4) Crear una clase de implementación de servicio

package com.lxs.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.lxs.service.HelloService;
@Service
public class HelloServiceImpl implements HelloService {
  public String sayHello(String name) {
    return "hello " + name;
 }
}

Nota: Dubbo proporciona la anotación de servicio utilizada en la clase de implementación del servicio y se utiliza para publicar el servicio externamente
(5) Cree applicationContext-service.xml en src/main/resources

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样 -->
    <dubbo:application name="dubbodemo_provider" />
    <!-- 连接服务注册中心zookeeper ip为zookeeper所在服务器的ip地址-->
    <dubbo:registry address="zookeeper://192.168.134.129:2181"/>
    <!-- 注册 协议和port -->
    <dubbo:protocol name="dubbo" port="20881"></dubbo:protocol>
    <!-- 扫描指定包,加入@Service注解的类会被发布为服务 -->
    <dubbo:annotation package="com.lxs.service.impl" />
</beans>

(6) Iniciar el servicio

tomcat7:ejecutar

4.2 Desarrollo de consumidores de servicios

Pasos de desarrollo:

(1) Cree un proyecto maven (el método de empaquetado es guerra) dubbodemo_consumer, la configuración pom.xml es la misma que la del proveedor de servicios anterior, solo necesita cambiar el número de puerto del complemento Tomcat a 8082;

(2) Configurar el archivo web.xml

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
 <display-name>Archetype Created Web Application</display-name>
 <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-
class>
  <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:applicationContext-web.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>
</web-app>

(3) Copie la interfaz HelloService en el proyecto del proveedor de servicios al proyecto actual

(4) Controlador de escritura

package com.lxs.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.lxs.service.HelloService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/demo")
public class HelloController {
  @Reference
  private HelloService helloService;
  @RequestMapping("/hello")
  @ResponseBody
  public String getName(String name){
    //远程调用
    String result = helloService.sayHello(name);
    System.out.println(result);
    return result;
 }
}

Nota: HelloService inyectado en el controlador utiliza la anotación @Reference proporcionada por Dubbo

(5) Cree applicationContext-web.xml en src/main/resources

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样 -->
<dubbo:application name="dubbodemo-consumer" />
<!-- 连接服务注册中心zookeeper ip为zookeeper所在服务器的ip地址-->
<dubbo:registry address="zookeeper://192.168.134.129:2181"/>
<!-- 扫描的方式暴露接口 -->
<dubbo:annotation package="com.lxs.controller" />
</beans>

(6) Ejecute la prueba tomcat7:ejecutar inicio

Ingrese http://localhost:8082/demo/hello.do?name=Jack en el navegador para ver la salida del navegador.

Pensamiento 1: en el caso de la entrada de Dubbo anterior, copiamos la interfaz HelloService del proyecto del proveedor de servicios (dubbodemo_provider) al proyecto del consumidor de servicios (dubbodemo_consumer).¿Es apropiado este enfoque? ¿Hay una mejor manera?
Respuesta: Este enfoque es obviamente malo. La misma interfaz se copia dos veces, lo que no es propicio para el mantenimiento posterior. Una mejor manera es crear un proyecto maven por separado y crear esta interfaz en este proyecto maven. Los proyectos que necesitan confiar en esta interfaz solo necesitan
introducir coordenadas maven en el archivo pom.xml de su propio proyecto.
Pensamiento 2: en el proyecto del consumidor de servicios (dubbodemo_consumer), solo se hace referencia a la interfaz HelloService y no se proporciona ninguna clase de implementación. ¿Cómo hace Dubbo llamadas remotas?
Respuesta: La capa inferior de Dubbo se basa en la tecnología de proxy para crear un objeto de proxy para la interfaz HelloService, y la llamada remota se completa a través de este objeto de proxy. Puede ver la estructura interna de este objeto proxy a través de la función de depuración de la herramienta de desarrollo. Además, Dubbo implementa la capa inferior de transmisión de red basada en el marco Netty.
Pensamiento 3: En el caso de entrada de Dubbo anterior, usamos Zookeeper como el centro de registro de servicios. Los proveedores de servicios deben registrar su información de servicio con Zookeeper, y los consumidores de servicios deben suscribirse a los servicios que necesitan de Zookeeper. En este momento, los servicios de Zookeeper Se vuelve muy importante, ¿cómo prevenir el punto único de falla de Zookeeper?
Respuesta: Zookeeper en realidad admite el modo de clúster Los clústeres de Zookeeper se pueden configurar para lograr una alta disponibilidad de los servicios de Zookeeper y evitar puntos únicos de falla.

Framework RPC Distribuido Apache Dubbo (Aprendizaje)

¡El camino es largo y largo, buscaré arriba y abajo!

Supongo que te gusta

Origin blog.csdn.net/weixin_38817361/article/details/124262877
Recomendado
Clasificación