本篇內(nèi)容介紹了“Dubbo怎么實(shí)現(xiàn)Spring Cloud服務(wù)治理 ”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)企業(yè)建站,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),專注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁設(shè)計(jì),有多年建站和網(wǎng)站代運(yùn)營經(jīng)驗(yàn),設(shè)計(jì)師為客戶打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢和貼心的售后服務(wù)。對(duì)于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)中不同領(lǐng)域進(jìn)行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶行業(yè)的需求,以靈動(dòng)的思維在網(wǎng)頁中充分展現(xiàn),通過對(duì)客戶行業(yè)精準(zhǔn)市場(chǎng)調(diào)研,為客戶提供的解決方案。
由于 Spring 官方宣布 Spring Cloud Edgware(下文簡稱為 “E” 版) 將在 2019 年 8 月 1 日后停止維護(hù)13,因此,目前 Dubbo Spring Cloud 發(fā)布版本并未對(duì) “E” 版提供支持,僅為 “F” 版 和 “G” 版開發(fā),同時(shí)也建議和鼓勵(lì) Spring Cloud 用戶更新至 “F” 版 或 “G” 版。
同時(shí),Dubbo Spring Cloud 基于 Apache Dubbo Spring Boot 2.7.x 開發(fā)(最低 Java 版本為 1.8),提供完整的 Dubbo 注解驅(qū)動(dòng)、外部化配置以及 Production-Ready 的特性,點(diǎn)擊查看詳情。
以下表格將說明 Dubbo Spring Cloud 版本關(guān)系映射關(guān)系:
Spring Cloud | Spring Cloud Alibaba | Spring Boot | Dubbo Spring Boot |
Finchley | 0.2.2.RELEASE | 2.0.x | 2.7.1 |
Greenwich | 2.2.1.RELEASE | 2.1.x | 2.7.1 |
Edgware | 0.1.2.RELEASE | 1.5.x | :x: Dubbo Spring Cloud 不支持該版本 |
由于 Dubbo Spring Cloud 構(gòu)建在原生的 Spring Cloud 之上,其服務(wù)治理方面的能力可認(rèn)為是 Spring Cloud Plus,不僅完全覆蓋 Spring Cloud 原生特性,而且提供更為穩(wěn)定和成熟的實(shí)現(xiàn),特性比對(duì)如下表所示:
功能組件 | Spring Cloud | Dubbo Spring Cloud |
分布式配置(Distributed configuration) | Git、Zookeeper、Consul、JDBC | Spring Cloud 分布式配置 + Dubbo 配置中心(Dubbo 2.7 開始支持配置中心,可自定義適配) |
服務(wù)注冊(cè)與發(fā)現(xiàn)(Service registration and discovery) | Eureka、Zookeeper、Consul | Spring Cloud 原生注冊(cè)中心(Spring Cloud 原生注冊(cè)中心,除 Eureka、Zookeeper、Consul 之外,還包括 Spring Cloud Alibaba 中的 Nacos)+ Dubbo 原生注冊(cè)中心 |
負(fù)載均衡(Load balancing) | Ribbon(隨機(jī)、輪詢等算法) | Dubbo 內(nèi)建實(shí)現(xiàn)(隨機(jī)、輪詢等算法 + 權(quán)重等特性) |
服務(wù)熔斷(Circuit Breakers) | Spring Cloud Hystrix | Spring Cloud Hystrix + Alibaba Sentinel 等(Sentinel 已被 Spring Cloud 項(xiàng)目納為 Circuit Breaker 的候選實(shí)現(xiàn)) |
服務(wù)調(diào)用(Service-to-service calls) | Open Feign、RestTemplate | Spring Cloud 服務(wù)調(diào)用 + Dubbo @Reference |
鏈路跟蹤(Tracing) | Spring Cloud Sleuth + Zipkin | Zipkin、opentracing 等 |
Dubbo Spring Cloud 基于 Spring Cloud Commons 抽象實(shí)現(xiàn) Dubbo 服務(wù)注冊(cè)與發(fā)現(xiàn),應(yīng)用只需增添外部化配置屬性 “dubbo.registry.address = spring-cloud://localhost
”,就能輕松地橋接到所有原生 Spring Cloud 注冊(cè)中心,包括: - Nacos - Eureka - Zookeeper - Consul
注:Dubbo Spring Cloud 將在下個(gè)版本支持 Spring Cloud 注冊(cè)中心與 Dubbo 注冊(cè)中心并存,提供雙注冊(cè)機(jī)制,實(shí)現(xiàn)無縫遷移
默認(rèn)情況,Spring Cloud Open Feign 以及 @LoadBalancedRestTemplate
作為 Spring Cloud 的兩種服務(wù)調(diào)用方式。Dubbo Spring Cloud 為其提供了第三種選擇,即 Dubbo 服務(wù)將作為 Spring Cloud 服務(wù)調(diào)用的同等公民出現(xiàn),應(yīng)用可通過 Apache Dubbo 注解 @Service
和 @Reference
暴露和引用 Dubbo 服務(wù),實(shí)現(xiàn)服務(wù)間多種協(xié)議的通訊。同時(shí),也可以利用 Dubbo 泛化接口輕松實(shí)現(xiàn)服務(wù)網(wǎng)關(guān)。
Dubbo Spring Cloud 引入了全新的服務(wù)治理特性 - 服務(wù)自?。⊿ervice Introspection),其設(shè)計(jì)目的在于最大化減輕注冊(cè)中心負(fù)載,去 Dubbo 注冊(cè)元信息中心化。假設(shè)一個(gè) Spring Cloud 應(yīng)用引入 Dubbo Spring Boot Starter,并暴露 N 個(gè) Dubbo 服務(wù),以 Dubbo Nacos 注冊(cè)中心 為例,當(dāng)前應(yīng)用將注冊(cè) N+1 個(gè) Nacos 應(yīng)用,除 Spring Cloud 應(yīng)用本身之前,其余 N 個(gè)應(yīng)用均來自于 Dubbo 服務(wù),當(dāng) N 越大時(shí),注冊(cè)中心負(fù)載越重。
因此,Dubbo Spring Cloud 應(yīng)用對(duì)注冊(cè)中心的負(fù)載相當(dāng)于傳統(tǒng) Dubbo 的 N 分之一,在不增加基礎(chǔ)設(shè)施投入的前提下,理論上,使其集群規(guī)模擴(kuò)大 N 倍。當(dāng)然,未來的 Dubbo 也將提供服務(wù)自省的能力。
盡管 Dubbo Spring Cloud 完全地保留了原生 Spring Cloud 服務(wù)調(diào)用特性,不過 Dubbo 服務(wù)治理的能力是 Spring Cloud Open Feign 所不及的,如高性能、高可用以及負(fù)載均衡穩(wěn)定性等方面。因此,建議開發(fā)人員將 Spring Cloud Open Feign 或者 @LoadBalancedRestTemplate
遷移為 Dubbo 服務(wù)。
考慮到遷移過程并非一蹴而就,因此,Dubbo Spring Cloud 提供了方案,即 @DubboTransported
注解。該注解能夠幫助服務(wù)消費(fèi)端的 Spring Cloud Open Feign 接口以及 @LoadBalanced
RestTemplate
Bean 底層走 Dubbo 調(diào)用(可切換 Dubbo 支持的協(xié)議),而服務(wù)提供方則只需在原有 @RestController
類上追加 Dubbo @Servce
注解(需要抽取接口)即可,換言之,在不調(diào)整 Feign 接口以及 RestTemplate
URL 的前提下,實(shí)現(xiàn)無縫遷移。如果遷移時(shí)間充分的話,建議使用 Dubbo 服務(wù)重構(gòu)系統(tǒng)中的原生 Spring Cloud 服務(wù)的定義。
開發(fā) Dubbo Spring Cloud 應(yīng)用的方法與傳統(tǒng) Dubbo 或 Spring Cloud 應(yīng)用類似,按照以下步驟就能完整地實(shí)現(xiàn)Dubbo 服務(wù)提供方和消費(fèi)方的應(yīng)用,完整的示例代碼請(qǐng)?jiān)L問一下資源:
Dubbo 服務(wù)提供方應(yīng)用
Dubbo 服務(wù)消費(fèi)方應(yīng)用
Dubbo 服務(wù)接口是服務(wù)提供方與消費(fèi)方的遠(yuǎn)程通訊契約,通常由普通的 Java 接口(interface)來聲明,如 EchoService
接口:
public interface EchoService { String echo(String message); }
為了確保契約的一致性,推薦的做法是將 Dubbo 服務(wù)接口打包在第二方或者第三方的 artifact(jar)中,如以上接口就存放在 artifact spring-cloud-dubbo-sample-api 之中。
對(duì)于服務(wù)提供方而言,不僅通過依賴 artifact 的形式引入 Dubbo 服務(wù)接口,而且需要將其實(shí)現(xiàn)。對(duì)應(yīng)的服務(wù)消費(fèi)端,同樣地需要依賴該 artifact,并以接口調(diào)用的方式執(zhí)行遠(yuǎn)程方法。接下來進(jìn)一步討論怎樣實(shí)現(xiàn) Dubbo 服務(wù)提供方和消費(fèi)方。
spring-cloud-dubbo-server-sample
Maven 工程首先,創(chuàng)建 artifactId
名為 spring-cloud-dubbo-server-sample
的 Maven 工程,并在其 pom.xml
文件中增添 Dubbo Spring Cloud 必要的依賴:
org.springframework.cloud spring-cloud-dubbo-sample-api ${project.version} org.springframework.boot spring-boot-actuator org.springframework.cloud spring-cloud-starter-dubbo org.springframework.cloud spring-cloud-starter-alibaba-nacos-discovery 以上依賴 artifact 說明如下:
spring-cloud-dubbo-sample-api
: 提供EchoService
接口的 artifact
spring-boot-actuator
: Spring Boot Production-Ready artifact,間接引入spring-boot
artifact
spring-cloud-starter-dubbo
: Dubbo Spring Cloud Starterartifact
,間接引入dubbo-spring-boot-starter
等 artifact
spring-cloud-starter-alibaba-nacos-discovery
: Nacos Spring Cloud 服務(wù)注冊(cè)與發(fā)現(xiàn)artifact
值得注意的是,以上 artifact 未指定版本(version),因此,還需顯示地聲明
:
org.springframework.cloud spring-cloud-alibaba-dependencies 2.2.1.RELEASE pom import 注:以上完整的 Maven 依賴配置,請(qǐng)參考
spring-cloud-dubbo-server-sample
pom.xml
文件完成以上步驟之后,下一步則是實(shí)現(xiàn) Dubbo 服務(wù)。
實(shí)現(xiàn) Dubbo 服務(wù)
EchoService
作為暴露的 Dubbo 服務(wù)接口,服務(wù)提供方spring-cloud-dubbo-server-sample
需要將其實(shí)現(xiàn):@org.apache.dubbo.config.annotation.Service class EchoServiceImpl implements EchoService { @Override public String echo(String message) { return "[echo] Hello, " + message; } }其中,
@org.apache.dubbo.config.annotation.Service
是 Dubbo 服務(wù)注解,僅聲明該 Java 服務(wù)(本地)實(shí)現(xiàn)為 Dubbo 服務(wù)。 因此,下一步需要將其配置 Dubbo 服務(wù)(遠(yuǎn)程)。配置 Dubbo 服務(wù)提供方
在暴露 Dubbo 服務(wù)方面,推薦開發(fā)人員外部化配置的方式,即指定 Java 服務(wù)實(shí)現(xiàn)類的掃描基準(zhǔn)包。
注:Dubbo Spring Cloud 繼承了 Dubbo Spring Boot 的外部化配置特性,也可以通過標(biāo)注
@DubboComponentScan
來實(shí)現(xiàn)基準(zhǔn)包掃描同時(shí),Dubbo 遠(yuǎn)程服務(wù)需要暴露網(wǎng)絡(luò)端口,并設(shè)定通訊協(xié)議,完整的 YAML 配置如下所示:
dubbo: scan: # dubbo 服務(wù)掃描基準(zhǔn)包 base-packages: org.springframework.cloud.alibaba.dubbo.bootstrap protocol: # dubbo 協(xié)議 name: dubbo # dubbo 協(xié)議端口( -1 表示自增端口,從 20880 開始) port: -1 spring: application: # Dubbo 應(yīng)用名稱 name: spring-cloud-alibaba-dubbo-server cloud: nacos: # Nacos 服務(wù)發(fā)現(xiàn)與注冊(cè)配置 discovery: server-addr: 127.0.0.1:8848以上 YAML 內(nèi)容,上半部分為 Dubbo 的配置:
dubbo.scan.base-packages
: 指定 Dubbo 服務(wù)實(shí)現(xiàn)類的掃描基準(zhǔn)包
dubbo.protocol
: Dubbo 服務(wù)暴露的協(xié)議配置,其中子屬性name
為協(xié)議名稱,port
為協(xié)議端口( -1 表示自增端口,從 20880 開始)
dubbo.registry
: Dubbo 服務(wù)注冊(cè)中心配置,其中子屬性address
的值 "spring-cloud://localhost",說明掛載到 Spring Cloud 注冊(cè)中心下半部分則是 Spring Cloud 相關(guān)配置:
spring.application.name
: Spring 應(yīng)用名稱,用于 Spring Cloud 服務(wù)注冊(cè)和發(fā)現(xiàn)。 > 該值在 Dubbo Spring Cloud 加持下被視作dubbo.application.name
,因此,無需再顯示地配置dubbo.application.name
spring.cloud.nacos.discovery
: Nacos 服務(wù)發(fā)現(xiàn)與注冊(cè)配置,其中子屬性 server-addr 指定 Nacos 服務(wù)器主機(jī)和端口以上完整的 YAML 配置文件,請(qǐng)參考
spring-cloud-dubbo-server-sample
bootstrap.yaml
文件完成以上步驟后,還需編寫一個(gè) Dubbo Spring Cloud 引導(dǎo)類。
引導(dǎo) Dubbo Spring Cloud 服務(wù)提供方應(yīng)用
Dubbo Spring Cloud 引導(dǎo)類與普通 Spring Cloud 應(yīng)用并無差別,如下所示:
@EnableDiscoveryClient @EnableAutoConfiguration public class DubboSpringCloudServerBootstrap { public static void main(String[] args) { SpringApplication.run(DubboSpringCloudServerBootstrap.class); } }在引導(dǎo)
DubboSpringCloudServerBootstrap
之前,請(qǐng)?zhí)崆皢?dòng) Nacos 服務(wù)器。 當(dāng)DubboSpringCloudServerBootstrap
啟動(dòng)后,將應(yīng)用spring-cloud-dubbo-server-sample
將出現(xiàn)在 Nacos 控制臺(tái)界面。當(dāng) Dubbo 服務(wù)提供方啟動(dòng)后,下一步實(shí)現(xiàn)一個(gè) Dubbo 服務(wù)消費(fèi)方。
實(shí)現(xiàn) Dubbo 服務(wù)消費(fèi)方
由于 Java 服務(wù)就
EchoService
、服務(wù)提供方應(yīng)用spring-cloud-dubbo-server-sample
以及 Nacos 服務(wù)器均已準(zhǔn)備完畢。Dubbo 服務(wù)消費(fèi)方 只需初始化服務(wù)消費(fèi)方 Maven 工程spring-cloud-dubbo-client-sample
以及消費(fèi) Dubbo 服務(wù)。初始化
spring-cloud-dubbo-client-sample
Maven 工程與服務(wù)提供方 Maven 工程類,需添加相關(guān) Maven 依賴:
org.springframework.cloud spring-cloud-alibaba-dependencies 2.2.1.RELEASE pom import org.springframework.cloud spring-cloud-dubbo-sample-api ${project.version} org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-actuator org.springframework.cloud spring-cloud-starter-dubbo org.springframework.cloud spring-cloud-starter-alibaba-nacos-discovery 與應(yīng)用
spring-cloud-dubbo-server-sample
不同的是,當(dāng)前應(yīng)用依賴spring-boot-starter-web
,表明它屬于 Web Servlet 應(yīng)用。注:以上完整的 Maven 依賴配置,請(qǐng)參考
spring-cloud-dubbo-client-sample
pom.xml
文件配置 Dubbo 服務(wù)消費(fèi)方
Dubbo 服務(wù)消費(fèi)方配置與服務(wù)提供方類似,當(dāng)前應(yīng)用
spring-cloud-dubbo-client-sample
屬于純服務(wù)消費(fèi)方,因此,所需的外部化配置更精簡:dubbo: cloud: subscribed-services: spring-cloud-alibaba-dubbo-server spring: application: # Dubbo 應(yīng)用名稱 name: spring-cloud-alibaba-dubbo-client cloud: nacos: # Nacos 服務(wù)發(fā)現(xiàn)與注冊(cè)配置 discovery: server-addr: 127.0.0.1:8848對(duì)比應(yīng)用
spring-cloud-dubbo-server-sample
,除應(yīng)用名稱spring.application.name
存在差異外,spring-cloud-dubbo-client-sample
新增了屬性dubbo.cloud.subscribed-services
的設(shè)置,并且該值為服務(wù)提供方應(yīng)用 "spring-cloud-dubbo-server-sample"。
dubbo.cloud.subscribed-services
: 用于服務(wù)消費(fèi)方訂閱服務(wù)提供方的應(yīng)用名稱的列表,若需訂閱多應(yīng)用,使用 "," 分割。 不推薦使用默認(rèn)值為 "*",它將訂閱所有應(yīng)用。當(dāng)應(yīng)用使用屬性
dubbo.cloud.subscribed-services
默認(rèn)值時(shí),日志中將會(huì)輸出一行警告:> > Current application will subscribe all services(size:x) in registry, a lot of memory and CPU cycles may be used,
> > thus it's strongly recommend you using the externalized property 'dubbo.cloud.subscribed-services' to specify the services
由于當(dāng)前應(yīng)用屬于 Web 應(yīng)用,它會(huì)默認(rèn)地使用 8080 作為 Web 服務(wù)端口,如果需要自定義,可通過屬性
server.port
調(diào)整。注:以上完整的 YAML 配置文件,請(qǐng)參考
spring-cloud-dubbo-client-sample
bootstrap.yaml
文件引導(dǎo) Dubbo Spring Cloud 服務(wù)消費(fèi)方應(yīng)用
為了減少實(shí)現(xiàn)步驟,以下引導(dǎo)類將 Dubbo 服務(wù)消費(fèi)以及引導(dǎo)功能合二為一:
@EnableDiscoveryClient @EnableAutoConfiguration @RestController public class DubboSpringCloudClientBootstrap { @Reference private EchoService echoService; @GetMapping("/echo") public String echo(String message) { return echoService.echo(message); } public static void main(String[] args) { SpringApplication.run(DubboSpringCloudClientBootstrap.class); }不僅如此,
DubboSpringCloudClientBootstrap
也作為 REST Endpoint,通過暴露/echo
Web 服務(wù),消費(fèi) DubboEchoService
服務(wù)。因此, 可通過curl
命令執(zhí)行 HTTP GET 方法:$ curl http://127.0.0.1:8080/echo?message=%E5%B0%8F%E9%A9%AC%E5%93%A5%EF%BC%88mercyblitz%EF%BC%89HTTP 響應(yīng)為:
[echo] Hello, 小馬哥(mercyblitz)以上結(jié)果說明應(yīng)用
spring-cloud-dubbo-client-sample
通過消費(fèi) Dubbo 服務(wù),返回服務(wù)提供方spring-cloud-dubbo-server-sample
運(yùn)算后的內(nèi)容。“Dubbo怎么實(shí)現(xiàn)Spring Cloud服務(wù)治理 ”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
網(wǎng)頁題目:Dubbo怎么實(shí)現(xiàn)SpringCloud服務(wù)治理
分享URL:http://weahome.cn/article/jjocho.html