Nacos(九)之Dubbo 融合 Nacos 成为注册中心
轉載自??Dubbo 融合 Nacos 成為注冊中心
Nacos 作為 Dubbo 生態系統中重要的注冊中心實現,本文將會介紹如何進行 Dubbo 對接 Nacos 注冊中心的工作。
預備工作
請確保后臺已經啟動 Nacos 服務,可先行參考?Nacos 快速入門。
快速上手
Dubbo 融合 Nacos 成為注冊中心的操作步驟非常簡單,大致步驟可分為“增加 Maven 依賴”以及“配置注冊中心“。
增加 Maven 依賴
只需要依賴Dubbo客戶端即可,關于推薦的使用版本,請參考Dubbo官方文檔或者咨詢Dubbo開發人員:
<dependencies>...<!-- Dubbo dependency --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>[latest version]</version></dependency><!-- 使用Spring裝配方式時可選: --><dependency><groupId>com.alibaba.spring</groupId><artifactId>spring-context-support</artifactId><version>[latest version]</version></dependency>...</dependencies>配置注冊中心
假設您 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 ##如果要使用自己創建的命名空間可以使用下面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 ...隨后,重啟您的 Dubbo 應用,Dubbo 的服務提供和消費信息在 Nacos 控制臺中可以顯示:
如圖所示,服務名前綴為?providers:?的信息為服務提供者的元信息,consumers:?則代表服務消費者的元信息。點擊“詳情”可查看服務狀態詳情:
如果您正在使用 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" /><!-- 如果要使用自己創建的命名空間可以使用下面配置 --><!-- <dubbo:registry address="nacos://10.20.153.10:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932" /> -->... </beans>重啟 Dubbo 應用后,您同樣也能發現服務提供方和消費方的注冊元信息呈現在 Nacos 控制臺中:
您是否絕對配置或切換 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
- 實現服務提供方引導類 -?DemoServiceProviderBootstrap
其中注解?@EnableDubbo?激活 Dubbo 注解驅動以及外部化配置,其?scanBasePackages?屬性掃描指定 Java 包,將所有標注?@Service?的服務接口實現類暴露為 Spring Bean,隨即被導出 Dubbo 服務。
@PropertySource?是 Spring Framework 3.1 引入的標準導入屬性配置資源注解,它將為 Dubbo 提供外部化配置。
服務消費方注解驅動實現
- 定義 Dubbo 消費方外部化配置屬性源 -?consumer-config.properties
同樣地,dubbo.registry.address?屬性指向 Nacos 注冊中心,其他 Dubbo 服務相關的元信息通過 Nacos 注冊中心獲取。
- 實現服務消費方引導類 -?DemoServiceConsumerBootstrap
同樣地,@EnableDubbo?注解激活 Dubbo 注解驅動和外部化配置,不過當前屬于服務消費者,無需指定 Java 包名掃描標注?@Service?的服務實現。
@Reference?是 Dubbo 遠程服務的依賴注入注解,需要服務提供方和消費端約定接口(interface)、版本(version)以及分組(group)信息。在當前服務消費示例中,DemoService?的服務版本來源于屬性配置文件?consumer-config.properties。
@PostConstruct?部分代碼則說明當?DemoServiceConsumerBootstrap?Bean 初始化時,執行十次 Dubbo 遠程方法調用。
運行注解驅動示例
在本地啟動兩次?DemoServiceProviderBootstrap,注冊中心將出現兩個健康服務:
再運行?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
- 實現服務提供方引導類 -?DemoServiceProviderXmlBootstrap
服務消費方 XML 配置驅動
- 定義服務消費方 XML 上下文配置文件 -?/META-INF/spring/dubbo-consumer-context.xml
- 實現服務消費方引導類 -?DemoServiceConsumerXmlBootstrap
運行 XML 配置驅動示例
同樣地,先啟動兩個?DemoServiceProviderXmlBootstrap?引導類,觀察 Nacos 注冊中心服務提供者變化:
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”,加油打氣鏈接:
- 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
總結
以上是生活随笔為你收集整理的Nacos(九)之Dubbo 融合 Nacos 成为注册中心的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纨绔子弟的意思是什么意思
- 下一篇: Nacos(十)之Kubernetes