今年年初時,阿里巴巴開源的高性能服務框架
dubbo
又開始了新一輪的更新,還加入了Apache孵化器
。原先項目使用了spring cloud
以後,已經比較少用dubbo
。目前又抽調回原來的行業應用部門,可能還會使用dubbo
進行服務調用。趁着編寫教材的機會來進行學習下。並且目前Dubbo
也出了springboot
的starter
項目了,藉着SpringBoot
的東風,集成起來很方便,基本上就一個依賴包引入的問題了。廢話很少說,開始吧~html
對於沒有接觸過Dubbo
的同窗,能夠先了解下相關知識。java
Dubbo 是阿里巴巴公司一個開源的高性能服務框架,致力於提供高性能和透明化的 RPC 遠程服務調用方案,以及 SOA 服務治理方案,使得應用可經過高性能 RPC 實現服務的輸出、輸入功能和 Spring 框架無縫集成。Dubbo 包含遠程通信、集羣容錯和自動發現三個核心部分。git
它提供透明化的遠程方法調用,實現像調用本地方法同樣調用遠程方法,只需簡單配置,沒有任何 API 侵入。同時它具有軟負載均衡及容錯機制,可在內網替代 F5 等硬件負載均衡器,下降成本,減小單點。它能夠實現服務自動註冊與發現,再也不須要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的 IP 地址,而且可以平滑添加或刪除服務提供者。github
2011 年底,阿里巴巴在 GitHub 上開源了基於 Java 的分佈式服務治理框架 Dubbo,以後它成爲了國內該類開源項目的佼佼者,許多開發者對其表示青睞。同時,前後有很多公司在實踐中基於 Dubbo 進行分佈式系統架構。目前在 GitHub 上,它的 fork、star 數均已破萬。web
Dubbo核心功能:redis
Dubbo架構算法
部署階段spring
運行階段數據庫
調用關係說明apache
Dubbo 架構具備如下幾個特色,分別是連通性、健壯性、伸縮性、以及向將來架構的升級性。
當服務集羣規模進一步擴大,帶動IT治理結構進一步升級,須要實現動態部署,進行流動計算,現有分佈式服務架構不會帶來阻力。下圖是將來可能的一種架構:
節點角色說明
節點 | 角色說明 |
---|---|
Deployer |
自動部署服務的本地代理 |
Repository |
倉庫用於存儲服務應用發佈包 |
Scheduler |
調度中心基於訪問壓力自動增減服務提供者 |
Admin |
統一管理控制檯 |
Registry |
服務註冊與發現的註冊中心 |
Monitor |
統計服務的調用次數和調用時間的監控中心 |
你們可訪問官網文檔:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html,裏面有詳細說明和使用說明的。這裏就再也不闡述了。
基於官方的
incubator-dubbo-spring-boot-project
項目,在SpringBoot
中集成起來很簡單。
注意:因爲本系列仍是使用1.5.x
版本進行講解,因此使用的版本爲0.1.x
。若使用SpringBoot2.x
的同窗,可使用0.2.x
版本。
這裏爲了方便,直接建立了一個接口工程,spring-boot-dubbo-api
。
IHelloService.java
/** * 定義一個接口 * @author oKong * */ public interface IHelloService { String hello(String name); }
建立一個spring-boot-dubbo-provider
工程。 0.引入pom依賴。
<!-- 引入api --> <dependency> <groupId>cn.lqdev.learning</groupId> <artifactId>spring-boot-dubbo-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- 引入dubbo依賴 --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.1.1</version> </dependency> <!-- 引入redis做爲註冊中心 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
注意:這裏直接選用了redis
做爲註冊中心使用。默認是zookeeper
。
1.編寫接口實現類。 HelloServiceImpl.java
/** * 定義一個服務實現類 * @author oKong * */ // 這裏注意 此類@service是dubbo的 @Service( version = "${demo.service.version}", //版本 application = "${dubbo.application.id}", //應用ID protocol = "${dubbo.protocol.id}", //協議id registry = "${dubbo.registry.id}")//註冊中心id @Slf4j public class HelloServiceImpl implements IHelloService { @Override public String hello(String name) { log.info("dubbo提供者,參數name:{}", name); return "hello " + name + ",this is a dubbo provider!"; } }
說明下:這裏的@Service
是包路徑com.alibaba.dubbo.config.annotation.Service
下的註解類,其指定了接口版本、協議id、註冊中心id等基本信息。這裏注意仍是版本號有用,由於會一個接口多版本共存問題,因此通常上都會設置版本信息的。 2.設置配置文件信息,添加dubbo
相關信息,好比註冊中心類型,地址等。
# 應用名稱 便於識別 dubbo.application.id=spring-boot-dubbo-provider dubbo.application.name=spring-boot-dubbo-provider server.port=8686 # 設置版本 demo.service.version=1.0.0 #協議 可選dubbo redis、http、thrift等 dubbo.protocol.id=dubbo dubbo.protocol.name=dubbo dubbo.protocol.port=20880 #設置掃描路徑 被註解@service和@Reference 等 dubbo.scan.basePackages=cn.lqdev.learning.springboot.dubbo.provider.service # 註冊中心配置 dubbo.registry.id=okong-registry #註冊中心類型 這裏使用redis做爲註冊中心 # zookeeper://127.0.0.1:2181 dubbo.registry.address=redis://127.0.0.1:6379 # 設置用戶名密碼 如有的話 #dubbo.registry.username=oKong #dubbo.registry.password=oKong # 設置redis參數 # 鏈接池中的最大空閒鏈接 dubbo.registry.parameters.max.idle=8 # 鏈接池最大鏈接數(使用負值表示沒有限制) dubbo.registry.parameters.max-active=8 # 鏈接池最大阻塞等待時間(使用負值表示沒有限制) dubbo.registry.parameters.max-wait=-1 # 鏈接池中的最大空閒鏈接 dubbo.registry.parameters.max-idle=8 # 鏈接池中的最小空閒鏈接 dubbo.registry.parameters.min-idle=0
注意:這裏爲了方便,直接使用了Redis
做爲了註冊中心。對於redis
鏈接相關配置參數,能夠經過dubbo.registry.parameters.xxx
的形式來進行設置,因爲parameters
是個Map
對象,因此添加的key是不會進行大小寫轉換的,填寫了什麼就是什麼。具體的registry
配置對象,能夠查看com.alibaba.dubbo.config.RegistryConfig
類。而對於redis
相關參數配置,能夠查看com.alibaba.dubbo.registry.redis.RedisRegistry
類。
其餘的註冊中心,也是相似的,你們可在包com.alibaba.dubbo.registry
找到都要的註冊中心配置類。
3.啓動類編寫。
DubboProviderApplication.java
/** * dubbo-提供者 * @author oKong * */ @SpringBootApplication @Slf4j public class DubboProviderApplication { public static void main(String[] args) throws Exception { //因爲dubbo提供者只是單純提供服務的 能夠爲一個非web環境 new SpringApplicationBuilder(DubboProviderApplication.class).web(false).run(args); log.info("spring-boot-dubbo-provider啓動!"); } }
4.啓動應用,能夠訪問下redis
服務,能夠看見已經有服務列表信息了。
建立spring-boot-dubbo-consumer
工程。 0.引入pom依賴
<!-- 引入api --> <dependency> <groupId>cn.lqdev.learning</groupId> <artifactId>spring-boot-dubbo-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- 引入dubbo依賴 --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.1.1</version> </dependency> <!-- 引入redis做爲註冊中心 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
1.配置文件添加註冊中心及服務版本相關信息
# 應用名稱 便於識別 dubbo.application.id=spring-boot-dubbo-consumer dubbo.application.name=spring-boot-dubbo-consumer server.port=9696 #設置掃描路徑 被註解@service和@Reference 等 dubbo.scan.basePackages=cn.lqdev.learning.springboot.dubbo.consumer # 註冊中心配置 dubbo.registry.id=okong-registry #註冊中心類型 這裏使用redis做爲註冊中心 # zookeeper://127.0.0.1:2181 dubbo.registry.address=redis://127.0.0.1:6379 # 設置用戶名密碼 如有的話 #dubbo.registry.username=oKong #dubbo.registry.password=oKong # 設置redis參數 # 鏈接池中的最大空閒鏈接 dubbo.registry.parameters.max.idle=8 # 鏈接池最大鏈接數(使用負值表示沒有限制) dubbo.registry.parameters.max-active=8 # 鏈接池最大阻塞等待時間(使用負值表示沒有限制) dubbo.registry.parameters.max-wait=-1 # 鏈接池中的最大空閒鏈接 dubbo.registry.parameters.max-idle=8 # 鏈接池中的最小空閒鏈接 dubbo.registry.parameters.min-idle=0
2.啓動類編寫
DubboConsumerApplication.java
/** * dubbo-消費者實例 * @author oKong * */ @SpringBootApplication @Slf4j public class DubboConsumerApplication { public static void main(String[] args) throws Exception { SpringApplication.run(DubboConsumerApplication.class, args); log.info("spring-boot-dubbo-consumer啓動!"); } }
3.編寫一個rest
api接口服務,進行服務調用。
/** * 調用實例 * @author oKong * */ @RestController @Slf4j public class DemoController { /** * 申明爲一個reference,其實就是設置一個bean類了, * 將原來xml配置替換成註解而已 * <dubbo:reference id=「xxxService」 interface=「com.xxx.XxxService」 /> */ @Reference(version = "1.0.0") IHelloService helloService; @GetMapping("/hello") public String hello(String name) { log.info("調用提供者服務,參數name:{}", name); return helloService.hello(name); } }
4.啓動應用,訪問:http://127.0.0.1:9696/hello?name=oKong ,能夠看見服務調用成功了。
官方監控默認支持了zookeeper。並且官方文檔也說了,對於
redis
橋接實現只爲開源版本提供,其可靠性依賴於 Redis 自己的可靠性。建議你們仍是使用zookeeper
吧,redis
仍是做爲緩存使用吧。
監控臺地址:https://github.com/apache/incubator-dubbo-ops 你們可自行安裝說明進行編譯運行下。
新的監控界面:
加入了Apache孵化器
後,界面都是英文的了。。。仍是原來的看的舒服呀!
本章節主要介紹了
dubbo
的集成和簡單的使用。具體其餘的使用其實和原先是同樣的,並無什麼區別。建議你們仍是去看看官方文檔,目前改版後內容豐富多了,乾貨不少,建議仍是去看看。這下終因而中文版的了,看的不頭疼了,⊙﹏⊙‖∣
目前互聯網上不少大佬都有
SpringBoot
系列教程,若有雷同,請多多包涵了。原創不易,碼字不易,還但願你們多多支持。若文中有所錯誤之處,還望提出,謝謝。
499452441
lqdevOps
我的博客:http://blog.lqdev.cn
完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-29
原文地址:http://blog.lqdev.cn/2018/09/28/springboot/chapter-twenty-nine/