dubbo 原理和入門實踐
一。dubbo:
遠端服務呼叫的分散式框架
其核心部分包含:
1. 遠端通訊: 提供對多種基於長連線的NIO框架抽象封裝,包括多種執行緒模型,序列化,以及“請求-響應”模式的資訊交換方式。
2. 叢集容錯: 提供基於介面方法的透明遠端過程呼叫,包括多協議支援,以及軟負載均衡,失敗容錯,地址路由,動態配置等叢集支援。
3. 自動發現: 基於註冊中心目錄服務,使服務消費方能動態的查詢服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器
二。dubbo 框架架構圖
2.1 流程分析
0 服務容器負責啟動,載入,執行服務提供者。
3. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。
4. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
5. 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。
三。相關程式碼和demo 實現步驟
3.1 官網程式碼demo說明
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"}); context.start(); System.in.read(); // press any key to exit
程式啟動讀取對應的resouce 下的xml 檔案,
宣告一個介面和服務,
public interface DemoService {
String sayHello(String name);
}
宣告介面的實現類:
public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) { System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress()); return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress(); } }
介面中的方法主要是通過字串從伺服器獲取相應的字串。
這裡是一個demo Service 實現,需要在dobbu 中配置相應的配置檔案,
<!-- service implementation, as same as regular local bean -->
<bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>
<!-- declare the service interface to be exported -->
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<!-- use dubbo protocol to export service on port 20880 -->
<dubbo:protocol name="dubbo" port="20880"/>
通過註冊dubbo 協議服務和多播實現。
在伺服器端中實現:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-consumer.xml"});
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxy
在載入類路徑下的*spring.xml 檔案的
通過對註冊的multicast 實現引用介面下的服務demoServer. 呼叫介面中的釋出的service 的方法。
DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxy
String hello = demoService.sayHello("world"); // call remote method
呼叫遠端代理和遠端方法。
3.2 註冊到zookeeper 的實現
下載api程式碼,並install 供privider和customer 使用。
啟動prider 程式碼,修改zk 地址。
啟動customer 程式碼:
結果如下:
四。參考資料:
官方文件:
https://github.com/apache/incubator-dubbo/tree/2.5.x
管理控制檯:
https://www.cnblogs.com/xhj123/p/8975840.html
https://www.cnblogs.com/leemz-coding/p/7113530.html
https://blog.csdn.net/houshaolin/article/details/76408399
五.附件程式碼:
入門demo:https://github.com/apache/incubator-dubbo/tree/2.5.x/dubbo-demo