Dubbo學習筆記(一) 入門
Dubbo是什麼?他的核心功能是什麼?
dubbo 阿里開源的一個SOA服務治理框架,從目前來看把它稱作是一個RCP遠端呼叫框架更為貼切。單從RPC框架來說,功能較完善,支援多種傳輸和序列化方案。核心功能:就是遠端呼叫。
常用的遠端呼叫:RMI 、Web Service、Http
RMI :
JAVA 遠端方法呼叫、使用原生二進位制方式進行序列化 簡單易用、SDK支援,提高開發效率 不支援跨語言
Web Service
比較早系統呼叫解決方案 ,跨語言, 其基於WSDL 生成 SOAP 進行訊息的傳遞。 SDK支援、跨語言 實現較重,釋出繁瑣
Http 採用htpp +json 實現 簡單、輕量、跨語言 不支援SDK
dubbo為何而生?
先看一個分散式架構
在一個分散式系統中,服務端有多臺,客戶端對服務端進行遠端呼叫.會有以下問題
1、負載均衡:這麼多個機器呼叫哪一臺?
2、容錯:如果呼叫其中一臺呼叫出錯了怎麼辦?
3、服務配置:服務端地址配置在哪裡?
4、健康檢測:服務關當機或恢復後怎麼辦?
一個良好的RPC 框架主要解決這些問題.dubbo就是如此.
RPC框架主要有哪些模組功能?
- 註冊中心主要邏輯:
服務端動態註冊服務提供者資訊
客戶端從註冊中心接收服務提供者資訊,並儲存至本地快取
註冊中心實時監聽提供者狀態,如果變更將即時通知客戶端 - 呼叫主要功能:
負載均衡
容錯,一臺不行換一臺.
對服務呼叫者透明,呼叫多臺和一臺沒啥感知上的區別 - 傳輸模組:
需要進行引數傳輸,介面傳遞. 主要通過 minal,servlet 容器、netty等實現 - 序列化模組:
kryo、hessian、java、protobuf、JSON、XML
再看dubbo架構
- Provider(提供者)繫結指定埠並啟動服務
- 提供者連線註冊中心,併發本機IP、埠、應用資訊和提供服務資訊傳送至註冊中心儲存
- Consumer(消費者),連線註冊中心 ,併傳送應用資訊、所求服務資訊至註冊中心
- 註冊中心根據 消費 者所求服務資訊匹配對應的提供者列表傳送至Consumer 應用快取。
- Consumer 在發起遠端呼叫時基於快取的消費者列表擇其一發起呼叫。
- Provider 狀態變更會實時通知註冊中心、在由註冊中心實時推送至Consumer
這麼設計的意義:
- Consumer 與Provider 解偶,雙方都可以橫向增減節點數。
- 註冊中心對本身可做對等叢集,可動態增減節點,並且任意一臺宕掉後,將自動切換到另一臺
- 去中心化,雙方不直接依懶註冊中心,即使註冊中心全部當機短時間內也不會影響服務的呼叫
- 服務提供者無狀態,任意一臺宕掉後,不影響使用
實戰入門 實現helloWorld
編寫服務端介面
package com.wow;
public interface DemoService {
String sayHello(String name);
}
服務端實現類
package com.wow;
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello " + name;
}
}
服務端配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--應用名稱 -->
<dubbo:application name="demo-provider"/>
<!--<dubbo:registry address="multicast://224.5.6.7:1234"/> -->
<dubbo:registry protocol="redis" address="127.0.0.1:6379" check="true"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="com.wow.DemoService" ref="demoService">
<dubbo:method name="sayHello" timeout="2000"/>
</dubbo:service>
<bean id="demoService" class="com.wow.DemoServiceImpl"/>
</beans>
客戶端配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-consumer"/>
<!--<dubbo:registry address="multicast://224.5.6.7:1234"/>-->
<!-- 通過dubbo.xsd獲取dubbo的配置屬性-->
<dubbo:registry protocol="redis" address="127.0.0.1:6379" check="true"/>
<dubbo:reference id="demoService"
timeout="2000"
interface="com.wow.DemoService" />
</beans>
服務端啟動
package com.wow;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-dubbo-provider.xml");
context.start();
System.out.println("啟動成功");
System.in.read();
}
}
客戶端呼叫
package com.wow;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"spring-dubbo-consumer.xml");
context.start();
// 獲取服務代理
DemoService demoService = (DemoService) context.getBean("demoService");
// 服務執行
String hello = demoService.sayHello("world");
System.out.println(hello);
}
}
結果:
資訊: [DUBBO] Refer dubbo service com.wow.DemoService from url registry://127.0.0.1:6379/com.alibaba.dubbo.registry.RegistryService?application=demo-consumer&check=true&cluster=available&dubbo=2.5.3&pid=7284&refer=application%3Ddemo-consumer%26dubbo%3D2.5.3%26interface%3Dcom.wow.DemoService%26methods%3DsayHello%26pid%3D7284%26side%3Dconsumer%26timeout%3D2000%26timestamp%3D1523593380165®istry=redis×tamp=1523593380249, dubbo version: 2.5.3, current host: 10.127.5.182
Hello world
四月 13, 2018 12:23:05 下午 com.alibaba.dubbo.common.logger.jcl.JclLogger info
資訊: [DUBBO] Run shutdown hook now., dubbo version: 2.5.3, current host: 10.127.5.182
以上例子中以Redis作為註冊中心, 檢視Redis中的key 可以找到 相關的儲存資訊. 如下
核心配置
檢視dubbo.xsd檔案可具體檢視dubbo的配置.
dubbo配置可以用如下圖來解釋,分為三種配置 提供者配置, 消費者配置, 和公共配置.
其他詳細的配置可以參考
http://dubbo.apache.org/books/dubbo-user-book/
這個圖是非常關鍵的,當你在進行配置的時候,可以參考,並且在我們使用API進行配置的時候也可以參考這個圖.通過對於的配置類,來進行配置.
配置的優先順序
以 timeout 為例,顯示了配置的查詢順序,其它 retries, loadbalance, actives 等類似:
方法級優先,介面級次之,全域性配置再次之。
如果級別一樣,則消費方優先,提供方次之。
其中,服務提供方配置,通過 URL 經由註冊中心傳遞給消費方
Redis作為註冊中心時呼叫過程
- 服務提供方啟動時,向 Key:/dubbo/XXXServer/providers 下,新增當前提供者的地址
- 並向 Channel:/dubbo/com.wow.DemoService/providers 傳送 register 事件
- 服務消費方啟動時,從 Channel:/dubbo/com.wow.DemoService/providers 訂閱 register 和 unregister 事件
- 並向 Key:/dubbo/com.wow.DemoService/providers 下,新增當前消費者的地址
- 服務消費方收到 register 和 unregister 事件後,從 Key:/dubbo/com.wow.DemoService/providers 下獲取提供者地址列表
zookeeper作為註冊中心呼叫過程
說明:
• 服務提供者啟動時: 向 /dubbo/com.wow.DemoService/providers 目錄下寫入自己的 URL 地址
• 服務消費者啟動時: 訂閱 /dubbo/com.wow.DemoService/providers 目錄下的提供者 URL 地址。並向 /dubbo/com.wow.DemoService/consumers 目錄下寫入自己的 URL 地址
• 監控中心啟動時: 訂閱 /dubbo/com.wow.DemoService 目錄下的所有提供者和消費者 URL 地址
本文所有程式碼均上傳Github:https://github.com/wowdouble/wowdouble/tree/master/dubbolearn
相關文章
- JavaScript入門-學習筆記(一)JavaScript筆記
- golang入門學習筆記(一)Golang筆記
- Dubbo 學習筆記筆記
- Dubbo學習筆記筆記
- angular學習筆記(一)-入門案例Angular筆記
- python學習筆記(一)——入門Python筆記
- CANopen學習筆記(一)CANopen入門筆記
- webpack4入門學習筆記(一)Web筆記
- 學習筆記|AS入門(一) 環境篇筆記
- TS入門學習筆記筆記
- 【PostgreSQL】入門學習筆記SQL筆記
- git入門學習筆記Git筆記
- Docker入門學習筆記Docker筆記
- Unity學習筆記--入門Unity筆記
- ActionScript 學習筆記(入門)筆記
- JavaScript入門學習學習筆記(上)JavaScript筆記
- 記一次flink入門學習筆記筆記
- dubbo學習筆記---dubbo開發實戰筆記
- Go 入門指南學習筆記Go筆記
- React入門指南(學習筆記)React筆記
- pandas 學習筆記 (入門篇)筆記
- HTML入門學習筆記(二)HTML筆記
- MySQL學習筆記---入門使用MySql筆記
- Kotlin 入門學習筆記Kotlin筆記
- LDA入門級學習筆記LDA筆記
- 人臉識別學習筆記一:入門篇筆記
- Java入門第一季(學習筆記)Java筆記
- Docker 入門學習筆記一:Ubuntu安裝 DockerDocker筆記Ubuntu
- Elasticsearch入門學習重點筆記Elasticsearch筆記
- 【MongoDB學習筆記】MongoDB 快速入門MongoDB筆記
- java學習筆記1(入門級)Java筆記
- JavaScript學習筆記1—快速入門JavaScript筆記
- 安卓學習筆記20:Fragment入門安卓筆記Fragment
- 爬蟲入門學習筆記3爬蟲筆記
- node 學習筆記 基礎入門筆記
- webpack 學習筆記:入門介紹Web筆記
- 【Laravel 入門教程】學習筆記 1Laravel筆記
- 微信小程式入門學習筆記微信小程式筆記