我現在公司提供的產品是即時通訊軟件,因為我從.net桌面應用開發轉崗,從java后台轉項目經理,讓我有幸擁有了后台開發人員所有的權限,所有的后台源碼和技術文檔對我開放,可惜僅在后台待了3周不到,還沒來得及從事后台開發,就被直接安排開始項目經理的工作。雖然現在已經開始從事管理的工作,但是之前熟悉后台源碼時,對后台的技術棧都進行了熟悉,近期將一直更新Java后台的技術棧學習總結。
今天我要分享的就是Dubbo,Dubbo是阿里巴巴在2011年開源的項目,因為在阿里已經得到廣泛應用,驗證了其穩定性和健壯性,所有被很多公司作為Java后台的RPC框架。
下面先講解下Dubbo是什么,有什么功能。
Dubbo 是阿里巴巴公司一個開源的高性能服務框架,致力於提供高性能和透明化的 RPC 遠程服務調用方案,以及 SOA 服務治理方案,使得應用可通過高性能 RPC 實現服務的輸出、輸入功能和 Spring 框架無縫集成。Dubbo 包含遠程通訊、集群容錯和自動發現三個核心部分。
Dubbo核心功能
- · 遠程通訊,提供對多種基於長連接的 NIO 框架抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的信息交換方式。
- · 集群容錯,提供基於接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集群支持。
- · 自動發現,基於注冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
工作模型
上圖很好的體現了Dubbo的工作模型,由服務提供方(Provider)向注冊中心(Registry)注冊服務。當服務消費者(Consumer)需要使用服務時,需要先向注冊中心(Registry)進行訂閱,訂閱后服務消費者(Consumer)就能采用同步方式(invoke)來調用該服務了。
配置標簽
標簽 |
用途 |
解釋 |
<dubbo:service/> |
服務配置 |
用於暴露一個服務,定義服務的元信息,一個服務可以用多個協議暴露,一個服務也可以注冊到多個注冊中心 |
<dubbo:reference/> |
引用配置 |
用於創建一個遠程服務代理,一個引用可以指向多個注冊中心 |
<dubbo:protocol/> |
協議配置 |
用於配置提供服務的協議信息,協議由提供方指定,消費方被動接受 |
<dubbo:application/> |
應用配置 |
用於配置當前應用信息,不管該應用是提供者還是消費者 |
<dubbo:module/> |
模塊配置 |
用於配置當前模塊信息,可選 |
<dubbo:registry/> |
注冊中心配置 |
用於配置連接注冊中心相關信息 |
<dubbo:monitor/> |
監控中心配置 |
用於配置連接監控中心相關信息,可選 |
<dubbo:provider/> |
提供方配置 |
當 ProtocolConfig 和 ServiceConfig 某屬性沒有配置時,采用此缺省值,可選 |
<dubbo:consumer/> |
消費方配置 |
當 ReferenceConfig 某屬性沒有配置時,采用此缺省值,可選 |
<dubbo:method/> |
方法配置 |
用於 ServiceConfig 和 ReferenceConfig 指定方法級的配置信息 |
<dubbo:argument/> |
參數配置 |
服務注冊
我公司產品后台的注冊方法如下
定義接口
1 public interface HmWorkGroupDubboService 2 { 3 public Long createWorkGroup(Map<String,Object> param); 4 public Long updateWorkGroup(Map<String, Object> param); 5 }
添加實現
1 @service(group="pa",version="1.0.0",interfaceClass= HmWorkGroupDubboService.class,timeout=150000) 2 public class HmWorkGroupDubboServiceImpl implements HmWorkGroupDubboService 3 { 4 @override 5 public Long createWorkGroup(Map<String, Object> param) 6 { 7 //業務 8 } 9 @override 10 public Long updateWorkGroup(Map<String, Object> param) 11 { 12 //業務 13 } 14 }
服務配置
在application.yml中添加
1 dubbo: 2 registry: 3 address:zookeeper://108.20.18.74:2181 4 5 protocal: 6 port:20861 7 name:dubbo 8 application: 9 name:work 10 config: 11 timeout:5000 12 group: 13 name:pa 14 version:1.0.0 15 consumer: 16 check:false 17 scan:hm.hmp.front.dubbo
掃描服務
在啟動函數類上添加@DubboComponentScan標簽
1 @DubboComponentScan("work.dubbo.service") 2 @EnableDubboConfiguration 3 public class Application 4 { 5 public static void main(String[] args) 6 { 7 ///... 8 } 9 }
服務訂閱
添加配置
添加配置,在文件dubbo-context.xml中
1 <!--提供方應用信息--> 2 <dubbo:application name="hm-admin"/> 3 <dubbo:monitor protocal="registry"/> 4 <dubbo:registry address="${zookeeper.config.dubbo}"/> 5 <!--Dubbo協議暴露服務端口--> 6 <dubbo:protocal name="dubbo" port="${dubbo.config.port}"/> 7 <dubbo:consumer check="false"/> 8 9 <!--第三方接口--> 10 <dubbo:reference id="hmWorkGroupDubboService" interface="dubbo.service.HmWorkGroupDubboService" 11 generic=""true" group="${dubbo.config.group.txt}" version="${dubbo.config.txt.version}" timeout="150000"/>
引入配置
1 @Configuration 2 @ImportResource("{dubbo-context.xml}") 3 public class DataSourceConfig{ 4 /// 5 }
服務使用
1 GenericService dubboServiceWorkGroup = ApplicationContextUtils.getApplicationContext().getBean("hmWorkGroupDubboService",GenericService.class); 2 Object workGroupResult = dubboServiceWorkGroup.$invoke("createWorkGroup",new String[]{"java.util.map"},new Object[]{workGroupMap});
相信大家也發現了上面使用的注冊中心時Zookeeper,是因為zookeeper能夠幫助Dubbo實現分布式及負載均衡。
現在應該已經把Dubbo講解清除了,后續將繼續其他Java技術棧的學習和總結。