1. 程式人生 > >dubbo 原理和入門實踐

dubbo 原理和入門實踐

一。dubbo:

遠端服務呼叫的分散式框架

    其核心部分包含:
1. 遠端通訊: 提供對多種基於長連線的NIO框架抽象封裝,包括多種執行緒模型,序列化,以及“請求-響應”模式的資訊交換方式。
2. 叢集容錯: 提供基於介面方法的透明遠端過程呼叫,包括多協議支援,以及軟負載均衡,失敗容錯,地址路由,動態配置等叢集支援。
3. 自動發現: 基於註冊中心目錄服務,使服務消費方能動態的查詢服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器

二。dubbo 框架架構圖

2.1 流程分析

0 服務容器負責啟動,載入,執行服務提供者。

1. 服務提供者在啟動時,向註冊中心註冊自己提供的服務。

2. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。

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