当前位置:   article > 正文

Dubbo 融合 Nacos 成为注册中心_dubbo-registry-nacos

dubbo-registry-nacos

快速上手

Dubbo 融合 Nacos 成为注册中心的操作步骤非常简单,大致步骤可分为“增加 Maven 依赖”以及“配置注册中心“。

增加 Maven 依赖

只需要依赖Dubbo客户端即可,关于推荐的使用版本,请参考Dubbo官方文档或者咨询Dubbo开发人员:

  1. <dependencies>
  2. ...
  3. <dependency>
  4. <groupId>com.alibaba</groupId>
  5. <artifactId>dubbo</artifactId>
  6. <version>3.0.5</version>
  7. </dependency>
  8. <!-- Dubbo Nacos registry dependency -->
  9. <dependency>
  10. <groupId>com.alibaba</groupId>
  11. <artifactId>dubbo-registry-nacos</artifactId>
  12. <version>3.0.5</version>
  13. </dependency>
  14. <!-- Alibaba Spring Context extension -->
  15. <dependency>
  16. <groupId>com.alibaba.spring</groupId>
  17. <artifactId>spring-context-support</artifactId>
  18. <version>1.0.11</version>
  19. </dependency>
  20. ...
  21. </dependencies>

配置注册中心

假设您 Dubbo 应用使用 Spring Framework 装配,将有两种配置方法可选,分别为:Dubbo Spring 外部化配置以及 Spring XML 配置文件以及,笔者强烈推荐前者。

Dubbo Spring 外部化配置

Dubbo Spring 外部化配置是由 Dubbo 2.5.8 引入的新特性,可通过 Spring Environment 属性自动地生成并绑定 Dubbo 配置 Bean,实现配置简化,并且降低微服务开发门槛。

假设您 Dubbo 应用的使用 Nacos 作为注册中心,并且其服务器 IP 地址为:10.20.153.10,同时,该注册地址作为 Dubbo 外部化配置属性存储在 dubbo-config.properties 文件,如下所示:

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

随后,重启您的 Dubbo 应用,Dubbo 的服务提供和消费信息在 Nacos 控制台中可以显示:

image-20181213103845976-4668726.png | left | 747x284

如图所示,服务名前缀为 providers: 的信息为服务提供者的元信息,consumers: 则代表服务消费者的元信息。点击“详情”可查看服务状态详情:

image-20181213104145998-4668906.png | left | 747x437

如果您正在使用 Spring XML 配置文件装配 Dubbo 注册中心的话,请参考下一节。

Spring XML 配置文件

同样,假设您 Dubbo 应用的使用 Nacos 作为注册中心,并且其服务器 IP 地址为:10.20.153.10,并且装配 Spring Bean 在 XML 文件中,如下所示:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  5. 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">
  6. <!-- 提供方应用信息,用于计算依赖关系 -->
  7. <dubbo:application name="dubbo-provider-xml-demo" />
  8. <!-- 使用 Nacos 注册中心 -->
  9. <dubbo:registry address="nacos://10.20.153.10:8848" />
  10. <!-- 如果要使用自己创建的命名空间可以使用下面配置 -->
  11. <!-- <dubbo:registry address="nacos://10.20.153.10:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932" /> -->
  12. ...
  13. </beans>

重启 Dubbo 应用后,您同样也能发现服务提供方和消费方的注册元信息呈现在 Nacos 控制台中:

image-20181213113049185-4671849.png | left | 747x274

您是否觉得配置或切换 Nacos 注册中心超级 Easy 呢?如果您仍旧意犹未尽或者不甚明白的话,可参考以下完整的示例。

完整示例

以上图片中的元数据源于 Dubbo Spring 注解驱动示例以及 Dubbo Spring XML 配置驱动示例,下面将分别介绍两者,您可以选择自己偏好的编程模型。在正式讨论之前,先来介绍两者的预备工作,因为它们皆依赖 Java 服务接口和实现。同时,请确保本地(127.0.0.1)环境已启动 Nacos 服务

示例接口与实现

完整代码归档位置: https://github.com/nacos-group/nacos-examples/tree/master/nacos-dubbo-example

首先定义示例接口,如下所示:

  1. package com.alibaba.nacos.example.dubbo.service;
  2. public interface DemoService {
  3. String sayName(String name);
  4. }

提供以上接口的实现类:

  1. package com.alibaba.nacos.example.dubbo.service;
  2. import com.alibaba.dubbo.config.annotation.Service;
  3. import com.alibaba.dubbo.rpc.RpcContext;
  4. import org.springframework.beans.factory.annotation.Value;
  5. /**
  6. * Default {@link DemoService}
  7. * https://nacos.io/zh-cn/docs/use-nacos-with-dubbo.html
  8. * @since 2.6.5
  9. */
  10. @Service(version = "${demo.service.version}")
  11. public class DefaultService implements DemoService {
  12. @Value("${demo.service.name}")
  13. private String serviceName;
  14. public String sayName(String name) {
  15. RpcContext rpcContext = RpcContext.getContext();
  16. return String.format("Service [name :%s , port : %d] %s(\"%s\") : Hello,%s",
  17. serviceName,
  18. rpcContext.getLocalPort(),
  19. rpcContext.getMethodName(),
  20. name,
  21. name);
  22. }
  23. }

接口与实现准备妥当后,下面将采用注解驱动和 XML 配置驱动各自实现。

Spring 注解驱动示例

Dubbo 2.5.7 重构了 Spring 注解驱动的编程模型。

服务提供方注解驱动实现
  • 定义 Dubbo 提供方外部化配置属性源 - provider-config.properties
  1. ## application
  2. dubbo.application.name = dubbo-provider-demo
  3. ## Nacos registry address
  4. dubbo.registry.address = nacos://127.0.0.1:8848
  5. ##如果要使用自己创建的命名空间可以使用下面2种方式
  6. #dubbo.registry.address = nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
  7. #dubbo.registry.parameters.namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
  8. ## Dubbo Protocol
  9. dubbo.protocol.name = dubbo
  10. dubbo.protocol.port = -1
  11. # Provider @Service version
  12. demo.service.version=1.0.0
  13. demo.service.name = demoService
  14. dubbo.application.qosEnable=false
  • 实现服务提供方引导类 - DemoServiceProviderBootstrap
  1. package com.alibaba.nacos.example.dubbo.provider;
  2. import com.alibaba.nacos.example.dubbo.service.DemoService;
  3. import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
  4. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  5. import org.springframework.context.annotation.PropertySource;
  6. import java.io.IOException;
  7. /**
  8. * {@link DemoService} provider demo
  9. * https://nacos.io/zh-cn/docs/use-nacos-with-dubbo.html
  10. */
  11. @EnableDubbo(scanBasePackages = "com.alibaba.nacos.example.dubbo.service")
  12. @PropertySource(value = "classpath:/provider-config.properties")
  13. public class DemoServiceProviderBootstrap {
  14. public static void main(String[] args) throws IOException {
  15. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
  16. context.register(DemoServiceProviderBootstrap.class);
  17. context.refresh();
  18. System.out.println("DemoService provider is starting...");
  19. System.in.read();
  20. }
  21. }

其中注解 @EnableDubbo 激活 Dubbo 注解驱动以及外部化配置,其 scanBasePackages 属性扫描指定 Java 包,将所有标注 @Service 的服务接口实现类暴露为 Spring Bean,随即被导出 Dubbo 服务。

@PropertySource 是 Spring Framework 3.1 引入的标准导入属性配置资源注解,它将为 Dubbo 提供外部化配置。

服务消费方注解驱动实现
  • 定义 Dubbo 消费方外部化配置属性源 - consumer-config.properties
  1. ## Dubbo Application info
  2. dubbo.application.name = dubbo-consumer-demo
  3. ## Nacos registry address
  4. dubbo.registry.address = nacos://127.0.0.1:8848
  5. ##如果要使用自己创建的命名空间可以使用下面2种方式
  6. #dubbo.registry.address = nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
  7. #dubbo.registry.parameters.namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
  8. # @Reference version
  9. demo.service.version= 1.0.0
  10. dubbo.application.qosEnable=false

同样地,dubbo.registry.address 属性指向 Nacos 注册中心,其他 Dubbo 服务相关的元信息通过 Nacos 注册中心获取。

  • 实现服务消费方引导类 - DemoServiceConsumerBootstrap
  1. package com.alibaba.nacos.example.dubbo.consumer;
  2. import com.alibaba.nacos.example.dubbo.service.DemoService;
  3. import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
  4. import org.apache.dubbo.config.annotation.DubboReference;
  5. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  6. import org.springframework.context.annotation.PropertySource;
  7. import javax.annotation.PostConstruct;
  8. import java.io.IOException;
  9. /**
  10. * {@link DemoService} consumer demo
  11. * https://nacos.io/zh-cn/docs/use-nacos-with-dubbo.html
  12. */
  13. @EnableDubbo
  14. @PropertySource(value = "classpath:/consumer-config.properties")
  15. public class DemoServiceConsumerBootstrap {
  16. @DubboReference(version = "${demo.service.version}")
  17. private DemoService demoService;
  18. @PostConstruct
  19. public void init() {
  20. for (int i = 0; i < 10; i++) {
  21. System.out.println(demoService.sayName("Nacos"));
  22. }
  23. }
  24. public static void main(String[] args) throws IOException {
  25. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
  26. context.register(DemoServiceConsumerBootstrap.class);
  27. context.refresh();
  28. context.close();
  29. }
  30. }

同样地,@EnableDubbo 注解激活 Dubbo 注解驱动和外部化配置,不过当前属于服务消费者,无需指定 Java 包名扫描标注 @Service 的服务实现。

@Reference 是 Dubbo 远程服务的依赖注入注解,需要服务提供方和消费端约定接口(interface)、版本(version)以及分组(group)信息。在当前服务消费示例中,DemoService 的服务版本来源于属性配置文件 consumer-config.properties

@PostConstruct 部分代码则说明当 DemoServiceConsumerBootstrap Bean 初始化时,执行十次 Dubbo 远程方法调用。

运行注解驱动示例

在本地启动两次 DemoServiceProviderBootstrap,注册中心将出现两个健康服务:

image-20181213123909636-4675949.png | left | 747x38

再运行 DemoServiceConsumerBootstrap,运行结果如下:

  1. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  2. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  3. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  4. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  5. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  6. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  7. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  8. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  9. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  10. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos

运行无误,并且服务消费方使用了负载均衡策略,将十次 RPC 调用平均分摊到两个 Dubbo 服务提供方实例中。

Spring XML 配置驱动示例

Spring XML 配置驱动是传统 Spring 装配组件的编程模型。

服务提供方 XML 配置驱动
  • 定义服务提供方 XML 上下文配置文件 - /META-INF/spring/dubbo-provider-context.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  5. 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">
  6. <!-- 提供方应用信息,用于计算依赖关系 -->
  7. <dubbo:application name="dubbo-provider-xml-demo"/>
  8. <!-- 使用 Nacos 注册中心 -->
  9. <dubbo:registry address="nacos://127.0.0.1:8848"/>
  10. <!-- 如果要使用自己创建的命名空间可以使用下面配置 -->
  11. <!-- <dubbo:registry address="nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932" /> -->
  12. <!-- 用dubbo协议在随机端口暴露服务 -->
  13. <dubbo:protocol name="dubbo" port="-1"/>
  14. <!-- 声明需要暴露的服务接口 -->
  15. <dubbo:service interface="com.alibaba.nacos.example.dubbo.service.DemoService" ref="demoService" version="2.0.0"/>
  16. <!-- 和本地bean一样实现服务 -->
  17. <bean id="demoService" class="com.alibaba.nacos.example.dubbo.service.DefaultService"/>
  18. </beans>
  • 实现服务提供方引导类 - DemoServiceProviderXmlBootstrap
  1. package com.alibaba.nacos.example.dubbo.provider;
  2. import com.alibaba.dubbo.demo.service.DemoService;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import java.io.IOException;
  5. /**
  6. * {@link DemoService} provider demo XML bootstrap
  7. */
  8. public class DemoServiceProviderXmlBootstrap {
  9. public static void main(String[] args) throws IOException {
  10. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
  11. context.setConfigLocation("/META-INF/spring/dubbo-provider-context.xml");
  12. context.refresh();
  13. System.out.println("DemoService provider (XML) is starting...");
  14. System.in.read();
  15. }
  16. }
服务消费方 XML 配置驱动
  • 定义服务消费方 XML 上下文配置文件 - /META-INF/spring/dubbo-consumer-context.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  5. 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">
  6. <!-- 提供方应用信息,用于计算依赖关系 -->
  7. <dubbo:application name="dubbo-consumer-xml-demo"/>
  8. <!-- 使用 Nacos 注册中心 -->
  9. <dubbo:registry address="nacos://127.0.0.1:8848"/>
  10. <!-- 如果要使用自己创建的命名空间可以使用下面配置 -->
  11. <!-- <dubbo:registry address="nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932" /> -->
  12. <!-- 引用服务接口 -->
  13. <dubbo:reference id="demoService" interface="com.alibaba.nacos.example.dubbo.service.DemoService" version="2.0.0"/>
  14. </beans>
  • 实现服务消费方引导类 - DemoServiceConsumerXmlBootstrap
  1. package com.alibaba.nacos.example.dubbo.consumer;
  2. import com.alibaba.dubbo.demo.service.DemoService;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import java.io.IOException;
  5. /**
  6. * {@link DemoService} consumer demo XML bootstrap
  7. */
  8. public class DemoServiceConsumerXmlBootstrap {
  9. public static void main(String[] args) throws IOException {
  10. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
  11. context.setConfigLocation("/META-INF/spring/dubbo-consumer-context.xml");
  12. context.refresh();
  13. System.out.println("DemoService consumer (XML) is starting...");
  14. DemoService demoService = context.getBean("demoService", DemoService.class);
  15. for (int i = 0; i < 10; i++) {
  16. System.out.println(demoService.sayName("Nacos"));
  17. }
  18. context.close();
  19. }
  20. }
运行 XML 配置驱动示例

同样地,先启动两个 DemoServiceProviderXmlBootstrap 引导类,观察 Nacos 注册中心服务提供者变化:

image-20181213125527201-4676927.png | left | 747x33

XML 配置驱动的服务版本为 2.0.0,因此注册服务无误。

再运行服务消费者引导类 DemoServiceConsumerXmlBootstrap,观察控制台输出内容:

  1. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  2. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  3. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  4. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  5. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  6. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  7. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  8. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  9. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos
  10. Service [name :demoService , port : 20880] sayName("Nacos") : Hello,Nacos

结果同样运行和负载均衡正常,不过由于当前示例尚未添加属性 demo.service.name 的缘故,因此,“name”部分信息输出为 null

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号