Dubbo integra Nacos para convertirse en un centro de registro

Comience rápidamente

Los pasos operativos para que Dubbo integre Nacos en un centro de registro son muy simples: los pasos se pueden dividir aproximadamente en "agregar dependencias de Maven" y "configurar el centro de registro".

Agregar dependencias de Maven

Solo necesita confiar en el cliente Dubbo. Para conocer la versión recomendada, consulte los documentos oficiales de Dubbo o consulte a los desarrolladores de Dubbo:

<dependencies>

    ...

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>3.0.5</version>
    </dependency>

    <!-- Dubbo Nacos registry dependency -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo-registry-nacos</artifactId>
        <version>3.0.5</version>
    </dependency>

    <!-- Alibaba Spring Context extension -->
    <dependency>
        <groupId>com.alibaba.spring</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>1.0.11</version>
    </dependency>
    ...
    
</dependencies>

Configurar el registro

Suponiendo que su aplicación Dubbo esté ensamblada usando Spring Framework, hay dos métodos de configuración para elegir: configuración externa de Dubbo Spring y archivo de configuración Spring XML, y el autor recomienda encarecidamente el primero.

Configuración externa de Dubbo Spring

La configuración externa de Dubbo Spring es  2.5.8 una nueva característica introducida por Dubbo, que puede  Environment generar y vincular automáticamente beans de configuración de Dubbo a través de propiedades Spring, simplificando la configuración y reduciendo el umbral para el desarrollo de microservicios.

Supongamos que su aplicación Dubbo utiliza Nacos como centro de registro y la dirección IP de su servidor es: 10.20.153.10y la dirección de registro se almacena en el archivo como propiedad de configuración de externalización de Dubbo  dubbo-config.properties , de la siguiente manera:

## application
dubbo.application.name = your-dubbo-application

## Nacos registry address
dubbo.registry.address = nacos://10.20.153.10:8848
##如果要使用自己创建的命名空间可以使用下面2种方式
#dubbo.registry.address = nacos://10.20.153.10:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
#dubbo.registry.parameters.namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
...

Luego, reinicie su aplicación Dubbo y la información de consumo y provisión de servicios de Dubbo se podrá mostrar en la consola de Nacos:

imagen-20181213103845976-4668726.png |  izquierda |  747x284

Como se muestra en la figura, la información con el prefijo del nombre del servicio es  providers: la metainformación del proveedor del servicio, consumers: que representa la metainformación del consumidor del servicio. Haga clic en " Detalles " para ver los detalles del estado del servicio:

imagen-20181213104145998-4668906.png |  izquierda |  747x437

Si está utilizando el archivo de configuración Spring XML para ensamblar el registro de Dubbo, consulte la siguiente sección.

Archivo de configuración XML de primavera

De manera similar, suponga que su aplicación Dubbo usa Nacos como centro de registro y la dirección IP de su servidor es: 10.20.153.10y ensambla Spring Bean en el archivo XML de la siguiente manera:

<?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:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="dubbo-provider-xml-demo"  />
 
    <!-- 使用 Nacos 注册中心 -->
    <dubbo:registry address="nacos://10.20.153.10:8848" />
    <!-- 如果要使用自己创建的命名空间可以使用下面配置 -->
    <!-- <dubbo:registry address="nacos://10.20.153.10:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932" /> -->
 	...
</beans>

Después de reiniciar la aplicación Dubbo, también puede encontrar que la metainformación de registro del proveedor de servicios y del consumidor se muestra en la consola de Nacos:

imagen-20181213113049185-4671849.png |  izquierda |  747x274

¿Crees que es muy fácil configurar o cambiar el registro de Nacos? Si aún no comprende o no comprende, puede consultar el siguiente ejemplo completo.

ejemplo completo

Los metadatos en la imagen de arriba provienen del ejemplo basado en anotaciones de Dubbo Spring y del ejemplo basado en configuración XML de Dubbo Spring. Los dos se presentarán a continuación y usted puede elegir su modelo de programación preferido. Antes de la discusión formal, presentemos el trabajo preliminar de ambos, porque ambos dependen de la interfaz y la implementación del servicio Java. Al mismo tiempo, asegúrese de que el 127.0.0.1entorno local () haya iniciado el servicio Nacos .

Ejemplo de interfaz e implementación

Ubicación completa del archivo de código:  https://github.com/nacos-group/nacos-examples/tree/master/nacos-dubbo-example

Primero defina la interfaz de ejemplo de la siguiente manera:

package com.alibaba.nacos.example.dubbo.service;

public interface DemoService {
    String sayName(String name);
}

Proporcione la clase de implementación de la interfaz anterior:


package com.alibaba.nacos.example.dubbo.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.dubbo.rpc.RpcContext;
import org.springframework.beans.factory.annotation.Value;

/**
 * Default {@link DemoService}
 *  https://nacos.io/zh-cn/docs/use-nacos-with-dubbo.html
 * @since 2.6.5
 */
@Service(version = "${demo.service.version}")
public class DefaultService implements DemoService {

    @Value("${demo.service.name}")
    private String serviceName;

    public String sayName(String name) {
        RpcContext rpcContext = RpcContext.getContext();
        return String.format("Service [name :%s , port : %d] %s(\"%s\") : Hello,%s",
                serviceName,
                rpcContext.getLocalPort(),
                rpcContext.getMethodName(),
                name,
                name);
    }
}

Una vez que la interfaz y la implementación estén listas, a continuación se utilizarán las implementaciones basadas en anotaciones y en configuración XML.

Ejemplo impulsado por anotaciones de primavera

Dubbo  2.5.7 refactoriza el modelo de programación basado en anotaciones de Spring.

Implementación basada en anotaciones del proveedor de servicios

  • Definir la fuente de la propiedad de configuración de externalización del proveedor de Dubbo - provider-config.properties
## application
dubbo.application.name = dubbo-provider-demo

## Nacos registry address
dubbo.registry.address = nacos://127.0.0.1:8848
##如果要使用自己创建的命名空间可以使用下面2种方式
#dubbo.registry.address = nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
#dubbo.registry.parameters.namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932

## Dubbo Protocol
dubbo.protocol.name = dubbo
dubbo.protocol.port = -1

# Provider @Service version
demo.service.version=1.0.0
demo.service.name = demoService

dubbo.application.qosEnable=false

  • Implementar la clase de arranque del proveedor de servicios - DemoServiceProviderBootstrap
package com.alibaba.nacos.example.dubbo.provider;

import com.alibaba.nacos.example.dubbo.service.DemoService;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.PropertySource;
import java.io.IOException;

/**
 * {@link DemoService} provider demo
 * https://nacos.io/zh-cn/docs/use-nacos-with-dubbo.html
 */
@EnableDubbo(scanBasePackages = "com.alibaba.nacos.example.dubbo.service")
@PropertySource(value = "classpath:/provider-config.properties")
public class DemoServiceProviderBootstrap {

    public static void main(String[] args) throws IOException {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(DemoServiceProviderBootstrap.class);
        context.refresh();
        System.out.println("DemoService provider is starting...");
        System.in.read();
    }
}

La anotación  @EnableDubbo activa el controlador de anotación de Dubbo y la configuración externa,  scanBasePackages escanea el paquete Java especificado en busca de sus propiedades y  @Service expone todas las clases de implementación de interfaz de servicio marcadas como Spring Beans, que luego se exportan a los servicios de Dubbo.

@PropertySource Es una anotación de recursos de configuración de atributos de importación estándar introducida por Spring Framework 3.1, que proporcionará configuración externa para Dubbo.

Implementación de consumidores de servicios basada en anotaciones

  • Definir la fuente de la propiedad de configuración de externalización del consumidor de Dubbo - consumer-config.properties
## Dubbo Application info
dubbo.application.name = dubbo-consumer-demo

## Nacos registry address
dubbo.registry.address = nacos://127.0.0.1:8848
##如果要使用自己创建的命名空间可以使用下面2种方式
#dubbo.registry.address = nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
#dubbo.registry.parameters.namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932

# @Reference version
demo.service.version= 1.0.0

dubbo.application.qosEnable=false

De manera similar, dubbo.registry.address el atributo apunta al centro de registro de Nacos y la metainformación relacionada con otros servicios de Dubbo se obtiene a través del centro de registro de Nacos.

  • Implementar la clase de arranque del consumidor de servicios - DemoServiceConsumerBootstrap
package com.alibaba.nacos.example.dubbo.consumer;


import com.alibaba.nacos.example.dubbo.service.DemoService;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.PropertySource;
import javax.annotation.PostConstruct;
import java.io.IOException;

/**
 * {@link DemoService} consumer demo
 * https://nacos.io/zh-cn/docs/use-nacos-with-dubbo.html
 */
@EnableDubbo
@PropertySource(value = "classpath:/consumer-config.properties")
public class DemoServiceConsumerBootstrap {

    @DubboReference(version = "${demo.service.version}")
    private DemoService demoService;

    @PostConstruct
    public void init() {
        for (int i = 0; i < 10; i++) {
            System.out.println(demoService.sayName("Nacos"));
        }
    }

    public static void main(String[] args) throws IOException {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(DemoServiceConsumerBootstrap.class);
        context.refresh();
        context.close();
    }
}

De manera similar, @EnableDubbo la anotación activa el controlador de anotación Dubbo y la configuración externa, pero actualmente pertenece al consumidor del servicio y no es necesario especificar la  @Service implementación del servicio de la anotación de escaneo del nombre del paquete Java.

@Reference Es la anotación de inyección de dependencia del servicio remoto de Dubbo, que requiere que el proveedor de servicios y el consumidor acuerden la interfaz, la versión y la información del grupo. En el ejemplo de consumo de servicio actual, DemoService la versión del servicio se deriva del archivo de configuración de propiedades  consumer-config.properties.

@PostConstruct Parte del código indica que cuando  DemoServiceConsumerBootstrap se inicializa el Bean, se ejecutan diez llamadas al método remoto de Dubbo.

Ejecute el ejemplo basado en anotaciones

Inícielo dos veces localmente  DemoServiceProviderBootstrapy habrá dos servicios de salud en el registro:

imagen-20181213123909636-4675949.png |  izquierda |  747x38

Ejecútelo nuevamente  DemoServiceConsumerBootstrap, el resultado es el siguiente:

Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos

La operación es correcta y el consumidor del servicio utiliza una estrategia de equilibrio de carga para distribuir uniformemente diez llamadas RPC a dos instancias del proveedor de servicios Dubbo.

Ejemplo impulsado por la configuración Spring XML

El controlador de configuración Spring XML es un modelo de programación para componentes tradicionales de ensamblaje Spring.

Controlador de configuración XML del proveedor de servicios

  • Definir el archivo de configuración de contexto XML del proveedor de servicios - /META-INF/spring/dubbo-provider-context.xml
<?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:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="dubbo-provider-xml-demo"/>

    <!-- 使用 Nacos 注册中心 -->
    <dubbo:registry address="nacos://127.0.0.1:8848"/>
    <!-- 如果要使用自己创建的命名空间可以使用下面配置 -->
    <!-- <dubbo:registry address="nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932" /> -->

    <!-- 用dubbo协议在随机端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="-1"/>

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.alibaba.nacos.example.dubbo.service.DemoService" ref="demoService" version="2.0.0"/>

    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="com.alibaba.nacos.example.dubbo.service.DefaultService"/>
</beans>
  • Implementar la clase de arranque del proveedor de servicios - DemoServiceProviderXmlBootstrap

package com.alibaba.nacos.example.dubbo.provider;

import com.alibaba.dubbo.demo.service.DemoService;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

/**
 * {@link DemoService} provider demo XML bootstrap
 */
public class DemoServiceProviderXmlBootstrap {

    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
        context.setConfigLocation("/META-INF/spring/dubbo-provider-context.xml");
        context.refresh();
        System.out.println("DemoService provider (XML) is starting...");
        System.in.read();
    }
}

Controlador de configuración XML del consumidor de servicios

  • Definir el archivo de configuración de contexto XML del consumidor de servicios - /META-INF/spring/dubbo-consumer-context.xml
<?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:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="dubbo-consumer-xml-demo"/>

    <!-- 使用 Nacos 注册中心 -->
    <dubbo:registry address="nacos://127.0.0.1:8848"/>
    <!-- 如果要使用自己创建的命名空间可以使用下面配置 -->
    <!-- <dubbo:registry address="nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932" /> -->

    <!-- 引用服务接口 -->
    <dubbo:reference id="demoService" interface="com.alibaba.nacos.example.dubbo.service.DemoService" version="2.0.0"/>

</beans>
  • Implementar la clase de arranque del consumidor de servicios - DemoServiceConsumerXmlBootstrap

package com.alibaba.nacos.example.dubbo.consumer;

import com.alibaba.dubbo.demo.service.DemoService;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

/**
 * {@link DemoService} consumer demo XML bootstrap
 */
public class DemoServiceConsumerXmlBootstrap {

    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
        context.setConfigLocation("/META-INF/spring/dubbo-consumer-context.xml");
        context.refresh();
        System.out.println("DemoService consumer (XML) is starting...");
        DemoService demoService = context.getBean("demoService", DemoService.class);
        for (int i = 0; i < 10; i++) {
            System.out.println(demoService.sayName("Nacos"));
        }
        context.close();
    }
}

Ejecute el ejemplo del controlador de configuración XML

De manera similar, primero inicie dos  DemoServiceProviderXmlBootstrap clases de arranque y observe los cambios del proveedor de servicios de registro de Nacos:

imagen-20181213125527201-4676927.png |  izquierda |  747x33

La versión del servicio controlada por la configuración XML es  2.0.0, por lo que no hay ningún error al registrar el servicio.

Luego ejecute la clase de inicio del consumidor del servicio  DemoServiceConsumerXmlBootstrapy observe la salida de la consola:

Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos

El resultado también se está ejecutando y el equilibrio de carga es normal, pero debido a que el ejemplo actual no ha agregado atributos  demo.service.name , la salida de la parte "nombre" de la información es  null.

Supongo que te gusta

Origin blog.csdn.net/leesinbad/article/details/132381414
Recomendado
Clasificación