Dubbo 融合 Nacos 成为注册中心
Nacos 作為 Dubbo 生態(tài)系統(tǒng)中重要的注冊中心實現(xiàn),其中?dubbo-registry-nacos?則是 Dubbo 融合 Nacos 注冊中心的實現(xiàn)。
預備工作
當您將?dubbo-registry-nacos?整合到您的 Dubbo 工程之前,請確保后臺已經(jīng)啟動 Nacos 服務(wù)。如果您尚且不熟悉 Nacos 的基本使用的話,可先行參考?Nacos 快速入門:https://nacos.io/en-us/docs/quick-start.html。建議使用?Nacos?0.6.1?以上的版本。
快速上手
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.2</version></dependency> <!-- Keep latest Nacos client version --><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>[0.6.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?后,您無需顯示地編程實現(xiàn)服務(wù)發(fā)現(xiàn)和注冊邏輯,實際實現(xiàn)由該三方包提供,接下來配置 Naocs 注冊中心。
配置注冊中心
假設(shè)您 Dubbo 應用使用 Spring Framework 裝配,將有兩種配置方法可選,分別為:Dubbo Spring 外部化配置以及 Spring XML 配置文件以及 ,筆者強烈推薦前者。
Dubbo Spring 外部化配置
Dubbo Spring 外部化配置是由 Dubbo?2.5.8?引入的新特性,可通過 Spring?Environment?屬性自動地生成并綁定 Dubbo 配置 Bean,實現(xiàn)配置簡化,并且降低微服務(wù)開發(fā)門檻。
假設(shè)您 Dubbo 應用的使用 Zookeeper 作為注冊中心,并且其服務(wù)器 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 ...假設(shè)您的 Nacos Server 同樣運行在服務(wù)器?10.20.153.10?上,并使用默認 Nacos 服務(wù)端口?8848,您只需將?dubbo.registry.address?屬性調(diào)整如下:
## 其他屬性保持不變## Nacos registry address dubbo.registry.address = nacos://10.20.153.10:8848 ...隨后,重啟您的 Dubbo 應用,Dubbo 的服務(wù)提供和消費信息在 Nacos 控制臺中可以顯示:
如圖所示,服務(wù)名前綴為?providers:?的信息為服務(wù)提供者的元信息,consumers:?則代表服務(wù)消費者的元信息。點擊“詳情”可查看服務(wù)狀態(tài)詳情:
如果您正在使用 Spring XML 配置文件裝配 Dubbo 注冊中心的話,請參考下一節(jié)。
Spring XML 配置文件
同樣,假設(shè)您 Dubbo 應用的使用 Zookeeper 作為注冊中心,并且其服務(wù)器 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"><!-- 提供方應用信息,用于計算依賴關(guān)系 --><dubbo:application name="dubbo-provider-xml-demo" /><!-- 使用 Zookeeper 注冊中心 --><dubbo:registry address="zookeeper://10.20.153.10:2181" />... </beans>與?Dubbo Spring 外部化配置?配置類似,只需要調(diào)整?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"><!-- 提供方應用信息,用于計算依賴關(guān)系 --><dubbo:application name="dubbo-provider-xml-demo" /><!-- 使用 Nacos 注冊中心 --><dubbo:registry address="nacos://10.20.153.10:8848" />... </beans>重啟 Dubbo 應用后,您同樣也能發(fā)現(xiàn)服務(wù)提供方和消費方的注冊元信息呈現(xiàn)在 Nacos 控制臺中:
您是否絕對配置或切換 Nacos 注冊中心超級 Easy 呢?如果您仍舊意猶未盡或者不甚明白的話,可參考以下完整的示例。
完整示例
以上圖片中的元數(shù)據(jù)源于 Dubbo Spring 注解驅(qū)動示例以及 Dubbo Spring XML 配置驅(qū)動示例,下面將分別介紹兩者,您可以選擇自己偏好的編程模型。在正式討論之前,先來介紹兩者的預備工作,因為它們皆依賴 Java 服務(wù)接口和實現(xiàn)。同時,請確保本地(127.0.0.1)環(huán)境已啟動 Nacos 服務(wù)。
示例接口與實現(xiàn)
首先定義示例接口,如下所示:
package com.alibaba.dubbo.demo.service;/*** DemoService** @since 2.6.5*/ public interface DemoService {String sayName(String name);}提供以上接口的實現(xiàn)類:
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);} }接口與實現(xiàn)準備妥當后,下面將采用注解驅(qū)動和 XML 配置驅(qū)動各自實現(xiàn)。
Spring 注解驅(qū)動示例
Dubbo?2.5.7?重構(gòu)了 Spring 注解驅(qū)動的編程模型。
服務(wù)提供方注解驅(qū)動實現(xiàn)
- 定義 Dubbo 提供方外部化配置屬性源 -?provider-config.properties
- 實現(xiàn)服務(wù)提供方引導類 -?DemoServiceProviderBootstrap
其中注解?@EnableDubbo?激活 Dubbo 注解驅(qū)動以及外部化配置,其?scanBasePackages?屬性掃描指定 Java 包,將所有標注?@Service?的服務(wù)接口實現(xiàn)類暴露為 Spring Bean,隨即被導出 Dubbo 服務(wù)。
@PropertySource?是 Spring Framework 3.1 引入的標準導入屬性配置資源注解,它將為 Dubbo 提供外部化配置。
服務(wù)消費方注解驅(qū)動實現(xiàn)
- 定義 Dubbo 消費方外部化配置屬性源 -?consumer-config.properties
同樣地,dubbo.registry.address?屬性指向 Nacos 注冊中心,其他 Dubbo 服務(wù)相關(guān)的元信息通過 Nacos 注冊中心獲取。
- 實現(xiàn)服務(wù)消費方引導類 -?DemoServiceConsumerBootstrap
同樣地,@EnableDubbo?注解激活 Dubbo 注解驅(qū)動和外部化配置,不過當前屬于服務(wù)消費者,無需指定 Java 包名掃描標注?@Service?的服務(wù)實現(xiàn)。
@Reference?是 Dubbo 遠程服務(wù)的依賴注入注解,需要服務(wù)提供方和消費端約定接口(interface)、版本(version)以及分組(group)信息。在當前服務(wù)消費示例中,DemoService?的服務(wù)版本來源于屬性配置文件?consumer-config.properties。
@PostConstruct?部分代碼則說明當?DemoServiceConsumerBootstrap?Bean 初始化時,執(zhí)行十次 Dubbo 遠程方法調(diào)用。
運行注解驅(qū)動示例
在本地啟動兩次?DemoServiceProviderBootstrap,注冊中心將出現(xiàn)兩個健康服務(wù):
再運行?DemoServiceConsumerBootstrap,運行結(jié)果如下:
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)運行無誤,并且服務(wù)消費方使用了負載均衡策略,將十次 RPC 調(diào)用平均分攤到兩個 Dubbo 服務(wù)提供方實例中。
Spring XML 配置驅(qū)動示例
Spring XML 配置驅(qū)動是傳統(tǒng) Spring 裝配組件的編程模型。
服務(wù)提供方 XML 配置驅(qū)動
- 定義服務(wù)提供方 XML 上下文配置文件 -?/META-INF/spring/dubbo-provider-context.xml
- 實現(xiàn)服務(wù)提供方引導類 -?DemoServiceProviderXmlBootstrap
服務(wù)消費方 XML 配置驅(qū)動
- 定義服務(wù)消費方 XML 上下文配置文件 -?/META-INF/spring/dubbo-consumer-context.xml
- 實現(xiàn)服務(wù)消費方引導類 -?DemoServiceConsumerXmlBootstrap
運行 XML 配置驅(qū)動示例
同樣地,先啟動兩個?DemoServiceProviderXmlBootstrap?引導類,觀察 Nacos 注冊中心服務(wù)提供者變化:
XML 配置驅(qū)動的服務(wù)版本為?2.0.0,因此注冊服務(wù)無誤。
再運行服務(wù)消費者引導類?DemoServiceConsumerXmlBootstrap,觀察控制臺輸出內(nèi)容:
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)結(jié)果同樣運行和負載均衡正常,不過由于當前示例尚未添加屬性?demo.service.name?的緣故,因此,“name”部分信息輸出為?null。更多內(nèi)容請參考:https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos。
如果您關(guān)注或喜愛 Dubbo 以及 Nacos 等開源工程,不妨為它們點 “star”,加油打氣鏈接:
- Apache Dubbo:https://github.com/apache/dubbo
- Dubbo Nacos Registry:https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos
- Alibaba Nacos:https://github.com/alibaba/nacos
?
原文:http://dubbo.apache.org/zh-cn/blog/dubbo-registry-nacos-integration.html
總結(jié)
以上是生活随笔為你收集整理的Dubbo 融合 Nacos 成为注册中心的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dubbo 注解驱动(Annotatio
- 下一篇: spring-boot 中实现标准 re