Dubbo项目入门
Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯和負(fù)載均衡,以及服務(wù)自動注冊和發(fā)現(xiàn)。
它的特性如下
- 面向接口代理的高性能RPC調(diào)用
- 智能負(fù)載均衡
- 服務(wù)自動注冊與發(fā)現(xiàn)
- 高度可擴(kuò)展能力
- 運(yùn)行期流量調(diào)度
- 可視化的服務(wù)治理與運(yùn)維
Talk is cheap, Show me the code。現(xiàn)在來著手搭建一個Dubbo項(xiàng)目吧。
搭建一個xml配置的Dubbo項(xiàng)目
創(chuàng)建三個項(xiàng)目
-
service-api 服務(wù)提供者和服務(wù)消費(fèi)者共用的接口
-
service-consumer 服務(wù)消費(fèi)者
-
service-provider 服務(wù)提供者
共用的接口
先在service-api定義一個公用接口
public interface DemoService {String sayHello(String name); } 復(fù)制代碼服務(wù)提供者
服務(wù)提供者service-provider提供一個DemoService的實(shí)現(xiàn)類
public class DemoServiceImpl implements DemoService {public String sayHello(String name) {System.out.println("[" + LocalDate.now() + "] Hello " + name );return "Hello " + name;}} 復(fù)制代碼編寫xml配置文件
配置應(yīng)用名稱
<dubbo:application name="demo-provider"/> 復(fù)制代碼配置注冊中心
可以使用Multicast、Redis、Zookeeper、Simple這四個作為注冊中心。
<dubbo:registry address="multicast://224.5.6.7:1234"/> 復(fù)制代碼配置協(xié)議
默認(rèn)為dubbo
<dubbo:protocol name="dubbo" port="20880"/> 復(fù)制代碼定義bean
然后定義bean,以及將bean作為服務(wù)暴露出去
<bean id="demoService" class="com.learnDubbo.demo.provider.DemoServiceImpl"/><dubbo:service interface="com.learnDubbo.demo.DemoService" ref="demoService"/> 復(fù)制代碼main函數(shù)
編寫一個main函數(shù)用于啟動服務(wù)提供者
public static void main(String[] args) throws Exception {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-provider.xml");context.start();System.in.read();//用于阻塞函數(shù),使其一直運(yùn)行 } 復(fù)制代碼服務(wù)消費(fèi)者
服務(wù)消費(fèi)者需要調(diào)用service-provider 服務(wù)提供者提供的DemoService實(shí)現(xiàn)類 同樣需要編寫xml文件,配置文件和服務(wù)提供者的類似,不同的是需要將暴露服務(wù)的配置修改為引用服務(wù)的配置,如下
引用服務(wù)
<dubbo:reference id="demoService" interface="com.learnDubbo.demo.DemoService"/> 復(fù)制代碼main函數(shù)
編寫一個main函數(shù)用于啟動服務(wù)消費(fèi)者,然后一直循環(huán)調(diào)用服務(wù)提供者提供的服務(wù)
public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-consumer.xml");context.start();DemoService demoService = (DemoService) context.getBean("demoService"); // 調(diào)用服務(wù)提供者提供的服務(wù)while (true) {try {Thread.sleep(1000);String hello = demoService.sayHello("Dubbo"); // call remote methodSystem.out.println(hello); // get result} catch (Throwable throwable) {throwable.printStackTrace();}} } 復(fù)制代碼測試
先啟動service-provider項(xiàng)目,然后在啟動service-consumer,輸出結(jié)果如下
搭建一個注解的Dubbo項(xiàng)目
服務(wù)提供者和服務(wù)消費(fèi)者共用的接口還是使用service-api,新建下面兩個項(xiàng)目
-
service-consumer-annotation 基于注解的服務(wù)消費(fèi)者
-
service-provider-annotation 基于注解的服務(wù)提供者
基于注解的服務(wù)提供者
新建一個springboot項(xiàng)目 同樣需要提供一個DemoService的實(shí)現(xiàn)類,且在類上增加@Service注解
注:是com.alibaba.dubbo.config.annotation.Service 不是org.springframework.stereotype.Service 別導(dǎo)錯了
接下來需要增加dubbo的配置類
@Configuration public class DubboConfiguration {/*** 對應(yīng)xml配置:<dubbo:application name="demo-provider"/>* @return*/@Beanpublic ApplicationConfig applicationConfig() {ApplicationConfig applicationConfig = new ApplicationConfig();applicationConfig.setName("demo-provider--annotation");return applicationConfig;}/*** 對應(yīng)xml配置:<dubbo:registry address="multicast://224.5.6.7:1234"/>* @return*/@Beanpublic RegistryConfig registryConfig() {RegistryConfig registryConfig = new RegistryConfig();registryConfig.setAddress("multicast://224.5.6.7:1234");return registryConfig;} } 復(fù)制代碼最后一步在啟動類上增加注解@DubboComponentScan(basePackages = "com.learnDubbo.demo.provider.service")basePackages自行修改為提供服務(wù)類所在的包路徑
基于注解的服務(wù)消費(fèi)者
也是需要有一個配置類,和服務(wù)提供者類似,這里就不貼代碼了
接下來創(chuàng)建一個Controller,用于測試結(jié)果,代碼如下
@Reference注解表示引用服務(wù)類似于xml配置
<dubbo:reference id="demoService" interface="com.learnDubbo.demo.DemoService"/> 復(fù)制代碼在項(xiàng)目啟動類上同樣需要注解@DubboComponentScan指定dubbo掃描路徑
測試
同xml配置的一樣,需要先啟動服務(wù)提供者
配置信息
配置信息主要包括3大塊,注冊中心、協(xié)議和schema配置
注冊中心
注冊中心總共有4個,如下
| Multicast | 不需要啟動任何中心節(jié)點(diǎn),只要廣播地址一樣,就可以互相發(fā)現(xiàn)。 | 鏈接 |
| zookeeper | Apacahe Hadoop 的子項(xiàng)目,是一個樹型的目錄服務(wù),支持變更推送,適合作為 Dubbo 服務(wù)的注冊中心,工業(yè)強(qiáng)度較高,可用于生產(chǎn)環(huán)境,并推薦使用。 | 鏈接 |
| Redis | 一個高效的 KV 存儲服務(wù)器 , 從?2.1.0?版本開始支持 。 | 鏈接 |
| Simple | 一個普通的 Dubbo 服務(wù),可以減少第三方依賴,使整體通訊方式一致。 | 鏈接 |
使用Redis注冊中心
當(dāng)使用Redis注冊中心,需先把服務(wù)提供方和消費(fèi)放的注冊中心xml配置修改為下方
<dubbo:registry address="redis://localhost:6379"/> 復(fù)制代碼對應(yīng)的redis會產(chǎn)生如下數(shù)據(jù)
可以看到有兩個key,分別對應(yīng)服務(wù)提供者和消費(fèi)者。兩個key對應(yīng)的數(shù)據(jù)類型為Hash,可以看到服務(wù)消費(fèi)者key的數(shù)據(jù)如下
1) "consumer://192.168.79.170/com.learnDubbo.demo.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.6.2&interface=com.learnDubbo.demo.DemoService&methods=sayHello&pid=14208&side=consumer×tamp=1534389723130" 2) "1534389813690" 復(fù)制代碼第一個為URL址,第二個為過期時間。
官網(wǎng)給的圖如下
使用Zookeeper注冊中心
當(dāng)使用Zookeeper注冊中心,需先把服務(wù)提供方和消費(fèi)放的注冊中心xml配置修改為下方
<dubbo:registry address="zookeeper://localhost:2181"/> 復(fù)制代碼對應(yīng)的Zookeeper會產(chǎn)生如下數(shù)據(jù)
下圖是官網(wǎng)給出的數(shù)據(jù)圖
有些出入,但大致還是相同的,多了configurators和routers。 當(dāng)服務(wù)提供者啟動時: 會創(chuàng)建對應(yīng)的目錄結(jié)構(gòu),例如我上面代碼中的共用接口名為com.learnDubbo.demo.DemoService,就會創(chuàng)建 /dubbo/com.learnDubbo.demo.DemoService目錄,然后在創(chuàng)建providers目錄,再在providers目錄下寫入自己的 URL 地址。
當(dāng)服務(wù)消費(fèi)者啟動時:會在/dubbo/com.learnDubbo.demo.DemoService目錄創(chuàng)建 consumers目錄,并在consumers目錄寫入自己的 URL 地址。
當(dāng)監(jiān)控中心啟動時: 訂閱 /dubbo/com.learnDubbo.demo.DemoService 目錄下的所有提供者和消費(fèi)者 URL 地址。
協(xié)議
| dubbo | Dubbo 缺省協(xié)議采用單一長連接和 NIO 異步通訊,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,以及服務(wù)消費(fèi)者機(jī)器數(shù)遠(yuǎn)大于服務(wù)提供者機(jī)器數(shù)的情況。 | 鏈接 |
| rmi | RMI 協(xié)議采用 JDK 標(biāo)準(zhǔn)的?java.rmi.*?實(shí)現(xiàn),采用阻塞式短連接和 JDK 標(biāo)準(zhǔn)序列化方式。 | 鏈接 |
| hessian | Hessian 協(xié)議用于集成 Hessian 的服務(wù),Hessian 底層采用 Http 通訊,采用 Servlet 暴露服務(wù),Dubbo 缺省內(nèi)嵌 Jetty 作為服務(wù)器實(shí)現(xiàn)。 | 鏈接 |
| http | 基于 HTTP 表單的遠(yuǎn)程調(diào)用協(xié)議,采用 Spring 的 HttpInvoker 實(shí)現(xiàn)。 | 鏈接 |
| webservice | 基于 WebService 的遠(yuǎn)程調(diào)用協(xié)議,基于 Apache CXF 的 frontend-simple 和 transports-http 實(shí)現(xiàn) 。 | 鏈接 |
| thrift | 當(dāng)前 dubbo 支持的 thrift 協(xié)議是對 thrift 原生協(xié)議的擴(kuò)展,在原生協(xié)議的基礎(chǔ)上添加了一些額外的頭信息,比如 service name,magic number 等。 | 鏈接 |
| memcached | 基于 memcached實(shí)現(xiàn)的 RPC 協(xié)議。 | 鏈接 |
| redis | 基于 Redis 實(shí)現(xiàn)的 RPC 協(xié)議。 | 鏈接 |
| rest | 基于標(biāo)準(zhǔn)的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的簡寫)實(shí)現(xiàn)的REST調(diào)用支持 | 鏈接 |
schema配置的涉及的東西有點(diǎn)多這里就不列出來了
參考資料:Dubbo官網(wǎng)
官網(wǎng)的介紹都很詳細(xì)了,從官網(wǎng)中一般都能獲取到你想到的信息。
有需要查看這篇博文的源碼的可以點(diǎn)這里:Github地址
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: Qt5标准文件对话框类
- 下一篇: 蚂蚁金服移动端可视化解决方案 F2 3.