Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。
它的特性以下html
Talk is cheap, Show me the code。如今來着手搭建一個Dubbo項目吧。java
建立三個項目git
先在service-api定義一個公用接口github
public interface DemoService { String sayHello(String name); }
服務提供者service-provider提供一個DemoService的實現類web
public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) { System.out.println("[" + LocalDate.now() + "] Hello " + name ); return "Hello " + name; } }
<dubbo:application name="demo-provider"/>
可使用Multicast、Redis、Zookeeper、Simple這四個做爲註冊中心。redis
<dubbo:registry address="multicast://224.5.6.7:1234"/>
默認爲dubbospring
<dubbo:protocol name="dubbo" port="20880"/>
而後定義bean,以及將bean做爲服務暴露出去apache
<bean id="demoService" class="com.learnDubbo.demo.provider.DemoServiceImpl"/> <dubbo:service interface="com.learnDubbo.demo.DemoService" ref="demoService"/>
編寫一個main函數用於啓動服務提供者api
public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-provider.xml"); context.start(); System.in.read();//用於阻塞函數,使其一直運行 }
服務消費者須要調用service-provider 服務提供者提供的DemoService實現類
一樣須要編寫xml文件,配置文件和服務提供者的相似,不一樣的是須要將暴露服務的配置修改成引用服務的配置,以下springboot
<dubbo:reference id="demoService" interface="com.learnDubbo.demo.DemoService"/>
編寫一個main函數用於啓動服務消費者,而後一直循環調用服務提供者提供的服務
public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-consumer.xml"); context.start(); DemoService demoService = (DemoService) context.getBean("demoService"); // 調用服務提供者提供的服務 while (true) { try { Thread.sleep(1000); String hello = demoService.sayHello("Dubbo"); // call remote method System.out.println(hello); // get result } catch (Throwable throwable) { throwable.printStackTrace(); } } }
先啓動service-provider項目,而後在啓動service-consumer,輸出結果以下
服務提供者和服務消費者共用的接口仍是使用service-api,新建下面兩個項目
新建一個springboot項目
一樣須要提供一個DemoService的實現類,且在類上增長@Service
註解
注:是com.alibaba.dubbo.config.annotation.Service
不是org.springframework.stereotype.Service
別導錯了
接下來須要增長dubbo的配置類
@Configuration public class DubboConfiguration { /** * 對應xml配置:<dubbo:application name="demo-provider"/> * @return */ @Bean public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("demo-provider--annotation"); return applicationConfig; } /** * 對應xml配置:<dubbo:registry address="multicast://224.5.6.7:1234"/> * @return */ @Bean public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setAddress("multicast://224.5.6.7:1234"); return registryConfig; } }
最後一步在啓動類上增長註解@DubboComponentScan(basePackages = "com.learnDubbo.demo.provider.service")
basePackages自行修改成提供服務類所在的包路徑
也是須要有一個配置類,和服務提供者相似,這裏就不貼代碼了
接下來建立一個Controller,用於測試結果,代碼以下
@RestController public class DemoController { @Reference private DemoService demoService; @GetMapping("sayHello") public String sayHello(){ return demoService.sayHello("Dubbo"); } }
@Reference
註解表示引用服務相似於xml配置
<dubbo:reference id="demoService" interface="com.learnDubbo.demo.DemoService"/>
在項目啓動類上一樣須要註解@DubboComponentScan
指定dubbo掃描路徑
同xml配置的同樣,須要先啓動服務提供者
配置信息主要包括3大塊,註冊中心、協議和schema配置
註冊中心總共有4個,以下
註冊中心 | 簡要說明 | dubbo文檔介紹 |
---|---|---|
Multicast | 不須要啓動任何中心節點,只要廣播地址同樣,就能夠互相發現。 | 連接 |
zookeeper | Apacahe Hadoop 的子項目,是一個樹型的目錄服務,支持變動推送,適合做爲 Dubbo 服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用。 | 連接 |
Redis | 一個高效的 KV 存儲服務器 , 從 2.1.0 版本開始支持 。 |
連接 |
Simple | 一個普通的 Dubbo 服務,能夠減小第三方依賴,使總體通信方式一致。 | 連接 |
當使用Redis註冊中心,需先把服務提供方和消費放的註冊中心xml配置修改成下方
<dubbo:registry address="redis://localhost:6379"/>
對應的redis會產生以下數據
能夠看到有兩個key,分別對應服務提供者和消費者。兩個key對應的數據類型爲Hash,能夠看到服務消費者key的數據以下
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"
第一個爲URL址,第二個爲過時時間。
官網給的圖以下
當使用Zookeeper註冊中心,需先把服務提供方和消費放的註冊中心xml配置修改成下方
<dubbo:registry address="zookeeper://localhost:2181"/>
對應的Zookeeper會產生以下數據
下圖是官網給出的數據圖
有些出入,但大體仍是相同的,多了configurators和routers。
當服務提供者啓動時: 會建立對應的目錄結構,例如我上面代碼中的共用接口名爲com.learnDubbo.demo.DemoService
,就會建立 /dubbo/com.learnDubbo.demo.DemoService
目錄,而後在建立providers
目錄,再在providers
目錄下寫入本身的 URL 地址。
當服務消費者啓動時:會在/dubbo/com.learnDubbo.demo.DemoService
目錄建立 consumers
目錄,並在consumers
目錄寫入本身的 URL 地址。
當監控中心啓動時: 訂閱 /dubbo/com.learnDubbo.demo.DemoService
目錄下的全部提供者和消費者 URL 地址。
協議 | 簡要說明 | dubbo文檔介紹 |
---|---|---|
dubbo | Dubbo 缺省協議採用單一長鏈接和 NIO 異步通信,適合於小數據量大併發的服務調用,以及服務消費者機器數遠大於服務提供者機器數的狀況。 | 連接 |
rmi | RMI 協議採用 JDK 標準的 java.rmi.* 實現,採用阻塞式短鏈接和 JDK 標準序列化方式。 |
連接 |
hessian | Hessian 協議用於集成 Hessian 的服務,Hessian 底層採用 Http 通信,採用 Servlet 暴露服務,Dubbo 缺省內嵌 Jetty 做爲服務器實現。 | 連接 |
http | 基於 HTTP 表單的遠程調用協議,採用 Spring 的 HttpInvoker 實現。 | 連接 |
webservice | 基於 WebService 的遠程調用協議,基於 Apache CXF 的 frontend-simple 和 transports-http 實現 。 | 連接 |
thrift | 當前 dubbo 支持的 thrift 協議是對 thrift 原生協議的擴展,在原生協議的基礎上添加了一些額外的頭信息,好比 service name,magic number 等。 | 連接 |
memcached | 基於 memcached實現的 RPC 協議。 | 連接 |
redis | 基於 Redis 實現的 RPC 協議。 | 連接 |
rest | 基於標準的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的簡寫)實現的REST調用支持 | 連接 |
schema配置的涉及的東西有點多這裏就不列出來了
參考資料:Dubbo官網
官網的介紹都很詳細了,從官網中通常都能獲取到你想到的信息。
有須要查看這篇博文的源碼的能夠點這裏:Github地址