阿里注冊中心nacos使用整合Dubbo-原創


阿里注冊中心nacos是今年開源的框架,一開始以為就是個zk。后面看了圖才明白他對標的竟然是consul\eureka,最重要是完美支持dubbo。我想今年開源它也是別有用意 。(目前nacos0.7版本)

Dubbo 融合 Nacos 成為注冊中心

Nacos 作為 Dubbo 生態系統中重要的注冊中心實現,其中 dubbo-registry-nacos 則是 Dubbo 融合 Nacos 注冊中心的實現。

預備工作

當您將 dubbo-registry-nacos 整合到您的 Dubbo 工程之前,請確保后台已經啟動 Nacos 服務。如果您尚且不熟悉 Nacos 的基本使用的話,可先行參考 Nacos 快速入門https://nacos.io/en-us/docs/quick-start.html

快速上手

Dubbo 融合 Nacos 成為注冊中心的操作步驟非常簡單,大致步驟可分為“增加 Maven 依賴”以及“配置注冊中心“。

增加 Maven 依賴

首先,您需要 dubbo-registry-nacos 的 Maven 依賴添加到您的項目中 pom.xml 文件中,並且強烈地推薦您使用 Dubbo 2.6.5

<dependencies> ... <!-- Dubbo Nacos registry dependency --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>0.0.1</version> </dependency> <!-- Dubbo dependency --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.5</version> </dependency> <!-- Alibaba Spring Context extension --> <dependency> <groupId>com.alibaba.spring</groupId> <artifactId>spring-context-support</artifactId> <version>1.0.2</version> </dependency> ... </dependencies> 

當項目中添加 dubbo-registry-nacos 后,您無需顯示地編程實現服務發現和注冊邏輯,實際實現由該三方包提供,接下來配置 Naocs 注冊中心。

配置注冊中心

假設您 Dubbo 應用使用 Spring Framework 裝配,將有兩種配置方法可選,分別為:Dubbo Spring 外部化配置以及 Spring XML 配置文件以及 ,筆者強烈推薦前者。

Dubbo Spring 外部化配置

Dubbo Spring 外部化配置是由 Dubbo 2.5.8 引入的新特性,可通過 Spring Environment 屬性自動地生成並綁定 Dubbo 配置 Bean,實現配置簡化,並且降低微服務開發門檻。

假設您 Dubbo 應用的使用 Zookeeper 作為注冊中心,並且其服務器 IP 地址為:10.20.153.10,同時,該注冊地址作為 Dubbo 外部化配置屬性存儲在 dubbo-config.properties 文件,如下所示:

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

## Zookeeper registry address
dubbo.registry.address = zookeeper://10.20.153.10:2181
...

假設您的 Nacos Server 同樣運行在服務器 10.20.153.10 上,並使用默認 Nacos 服務端口 8848,您只需將 dubbo.registry.address 屬性調整如下:

## 其他屬性保持不變

## Nacos registry address
dubbo.registry.address = nacos://10.20.153.10:8848
...

隨后,重啟您的 Dubbo 應用,Dubbo 的服務提供和消費信息在 Nacos 控制台中可以顯示:

image-20181213103845976

如圖所示,服務名前綴為 providers: 的信息為服務提供者的元信息,consumers: 則代表服務消費者的元信息。點擊“詳情”可查看服務狀態詳情:

image-20181213104145998

如果您正在使用 Spring XML 配置文件裝配 Dubbo 注冊中心的話,請參考下一節。

Spring XML 配置文件

同樣,假設您 Dubbo 應用的使用 Zookeeper 作為注冊中心,並且其服務器 IP 地址為:10.20.153.10,並且裝配 Spring Bean 在 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" /> <!-- 使用 Zookeeper 注冊中心 --> <dubbo:registry address="zookeeper://10.20.153.10:2181" /> ... </beans> 

與 Dubbo Spring 外部化配置 配置類似,只需要調整 address 屬性配置即可:

<?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" /> ... </beans> 

重啟 Dubbo 應用后,您同樣也能發現服務提供方和消費方的注冊元信息呈現在 Nacos 控制台中:

image-20181213113049185

您是否絕對配置或切換 Nacos 注冊中心超級 Easy 呢?如果您仍舊意猶未盡或者不甚明白的話,可參考以下完整的示例。

完整示例

以上圖片中的元數據源於 Dubbo Spring 注解驅動示例以及 Dubbo Spring XML 配置驅動示例,下面將分別介紹兩者,您可以選擇自己偏好的編程模型。在正式討論之前,先來介紹兩者的預備工作,因為它們皆依賴 Java 服務接口和實現。同時,請確保本地(127.0.0.1)環境已啟動 Nacos 服務。

示例接口與實現

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

package com.alibaba.dubbo.demo.service; /** * DemoService * * @since 2.6.5 */ public interface DemoService { String sayName(String name); } 

提供以上接口的實現類:

package com.alibaba.dubbo.demo.service; import com.alibaba.dubbo.config.annotation.Service; import com.alibaba.dubbo.rpc.RpcContext; import org.springframework.beans.factory.annotation.Value; /** * Default {@link DemoService} * * @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); } } 

接口與實現准備妥當后,下面將采用注解驅動和 XML 配置驅動各自實現。

Spring 注解驅動示例

Dubbo 2.5.7 重構了 Spring 注解驅動的編程模型。

服務提供方注解驅動實現

  • 定義 Dubbo 提供方外部化配置屬性源 - provider-config.properties
## application
dubbo.application.name = dubbo-provider-demo

## Nacos registry address
dubbo.registry.address = nacos://127.0.0.1:8848

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

# Provider @Service version
demo.service.version=1.0.0
demo.service.name = demoService
  • 實現服務提供方引導類 - DemoServiceProviderBootstrap
package com.alibaba.dubbo.demo.provider; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import com.alibaba.dubbo.demo.service.DemoService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.PropertySource; import java.io.IOException; /** * {@link DemoService} provider demo */ @EnableDubbo(scanBasePackages = "com.alibaba.dubbo.demo.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(); } } 

其中注解 @EnableDubbo 激活 Dubbo 注解驅動以及外部化配置,其 scanBasePackages 屬性掃描指定 Java 包,將所有標注 @Service 的服務接口實現類暴露為 Spring Bean,隨即被導出 Dubbo 服務。

@PropertySource 是 Spring Framework 3.1 引入的標准導入屬性配置資源注解,它將為 Dubbo 提供外部化配置。

服務消費方注解驅動實現

  • 定義 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

# @Reference version
demo.service.version= 1.0.0

同樣地,dubbo.registry.address 屬性指向 Nacos 注冊中心,其他 Dubbo 服務相關的元信息通過 Nacos 注冊中心獲取。

  • 實現服務消費方引導類 - DemoServiceConsumerBootstrap
package com.alibaba.dubbo.demo.consumer; import com.alibaba.dubbo.config.annotation.Reference; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import com.alibaba.dubbo.demo.service.DemoService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.PropertySource; import javax.annotation.PostConstruct; import java.io.IOException; /** * {@link DemoService} consumer demo */ @EnableDubbo @PropertySource(value = "classpath:/consumer-config.properties") public class DemoServiceConsumerBootstrap { @Reference(version = "${demo.service.version}") private DemoService demoService; @PostConstruct public void init() { for (int i = 0; i < 10; i++) { System.out.println(demoService.sayName("小馬哥(mercyblitz)")); } } public static void main(String[] args) throws IOException { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.register(DemoServiceConsumerBootstrap.class); context.refresh(); context.close(); } } 

同樣地,@EnableDubbo 注解激活 Dubbo 注解驅動和外部化配置,不過當前屬於服務消費者,無需指定 Java 包名掃描標注 @Service 的服務實現。

@Reference 是 Dubbo 遠程服務的依賴注入注解,需要服務提供方和消費端約定接口(interface)、版本(version)以及分組(group)信息。在當前服務消費示例中,DemoService 的服務版本來源於屬性配置文件 consumer-config.properties

@PostConstruct 部分代碼則說明當 DemoServiceConsumerBootstrap Bean 初始化時,執行十次 Dubbo 遠程方法調用。

運行注解驅動示例

在本地啟動兩次 DemoServiceProviderBootstrap,注冊中心將出現兩個健康服務:

image-20181213123909636

再運行 DemoServiceConsumerBootstrap,運行結果如下:

Service [name :demoService , port : 20880] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :demoService , port : 20881] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :demoService , port : 20880] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :demoService , port : 20880] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :demoService , port : 20881] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :demoService , port : 20881] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :demoService , port : 20880] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :demoService , port : 20880] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :demoService , port : 20881] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :demoService , port : 20881] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)

運行無誤,並且服務消費方使用了負載均衡策略,將十次 RPC 調用平均分攤到兩個 Dubbo 服務提供方實例中。

Spring XML 配置驅動示例

Spring XML 配置驅動是傳統 Spring 裝配組件的編程模型。

服務提供方 XML 配置驅動

  • 定義服務提供方 XML 上下文配置文件 - /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協議在隨機端口暴露服務 --> <dubbo:protocol name="dubbo" port="-1"/> <!-- 聲明需要暴露的服務接口 --> <dubbo:service interface="com.alibaba.dubbo.demo.service.DemoService" ref="demoService" version="2.0.0"/> <!-- 和本地bean一樣實現服務 --> <bean id="demoService" class="com.alibaba.dubbo.demo.service.DefaultService"/> </beans> 
  • 實現服務提供方引導類 - DemoServiceProviderXmlBootstrap
package com.alibaba.dubbo.demo.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();
    }
}

服務消費方 XML 配置驅動

  • 定義服務消費方 XML 上下文配置文件 - /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:reference id="demoService" interface="com.alibaba.dubbo.demo.service.DemoService" version="2.0.0"/> </beans> 
  • 實現服務消費方引導類 - DemoServiceConsumerXmlBootstrap
package com.alibaba.dubbo.demo.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("小馬哥(mercyblitz)")); } context.close(); } } 

運行 XML 配置驅動示例

同樣地,先啟動兩個 DemoServiceProviderXmlBootstrap 引導類,觀察 Nacos 注冊中心服務提供者變化:

image-20181213125527201

XML 配置驅動的服務版本為 2.0.0,因此注冊服務無誤。

再運行服務消費者引導類 DemoServiceConsumerXmlBootstrap,觀察控制台輸出內容:

Service [name :null , port : 20882] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :null , port : 20882] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :null , port : 20883] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :null , port : 20882] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :null , port : 20882] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :null , port : 20883] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :null , port : 20882] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :null , port : 20883] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :null , port : 20883] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)
Service [name :null , port : 20883] sayName("小馬哥(mercyblitz)") : Hello,小馬哥(mercyblitz)

結果同樣運行和負載均衡正常,不過由於當前示例尚未添加屬性 demo.service.name 的緣故,因此,“name”部分信息輸出為 null

如果您關注或喜愛 Dubbo 以及 Nacos 等開源工程,不妨為它們點 “star”,加油打氣鏈接:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM