Dubbo是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。
我也不明白這是什么意思,使用了之后大概就是提供一個將多個項目進行聯合的一種分布式,使用的是一種長鏈接的方法,具體沒有深入研究,只是試用了一下。
其核心部分包含:
- 遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的信息交換方式。(具體應該是一種長連接的方式,所以速度較快)
- 集群容錯: 提供基於接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集群支持。(使用dubbo,一般會使用zookeeper來做集群)
- 自動發現: 基於注冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。(統一的注冊中心,如果注冊中心掛掉了,已經注冊的會存在於緩存中,不會斷掉。)
Dubbo能做什么?
- 透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
- 軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
- 服務自動注冊與發現,不再需要寫死服務提供方地址,注冊中心基於接口名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。
另外dubbo進行了與spring的完全融合,所以可以直接通過spring的xml文件進行配置,至於怎么與spring-boot整合,還不知道。
上實現:
1.首先需要一個zookeeper;具體用法請百度。
2.啟動zookeeper,以這個服務作為注冊中心
3.生產者,首先引入zookeeper的jar
<!-- zookeeper --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> <exclusions> <exclusion> <artifactId>jmxtools</artifactId> <groupId>com.sun.jdmk</groupId> </exclusion> <exclusion> <artifactId>jmxri</artifactId> <groupId>com.sun.jmx</groupId> </exclusion> <exclusion> <artifactId>jms</artifactId> <groupId>javax.jms</groupId> </exclusion> </exclusions> </dependency>
然后是dubbo
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.4.9</version> <scope>compile</scope> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency>
別忘了還有spring的,這里就不貼了
3.1:
首先定義一個接口,用來發布的:
public interface ProvideService { public String sayHello(String name); }
進行實現:
@Service(value = "provideService") public class ProvideServiceImpl implements ProvideService { public String sayHello(String name){ System.out.println ("ProvideServiceImpl sayHello 走到了"); return name + " say Hello"; } }
然后是最關鍵的spring 配置dubbo
applicationContext.xml
<!-- 啟動spring注解掃描 --> <context:annotation-config /> <context:component-scan base-package="com.dubbo.*" /> <!-- 提供方應用信息,用於計算依賴關系 --> <dubbo:application name="lclc_provider" /> <!-- 使用zookeeper注冊中心暴露服務地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 聲明需要暴露的服務接口 --> <dubbo:service interface="com.dubbo.ProvideService" ref="provideService" />
啟動spring即可
public static void main(String[] args){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext ("applicationContext.xml"); context.start (); try { System.in.read (); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace (); }// 按任意鍵退出 }
4.然后是消費者
引入的jar包與生產者一樣,但是需要多加一個,即生產者方提供的接口,因為是通過接口進行代理的
4.1:消費
public static void main(String[] args){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext ("applicationContext.xml"); context.start (); ProvideService demoService = (ProvideService) context.getBean ("ProvideService");// 獲取遠程服務代理 String hello = demoService.sayHello ("lclc");// 執行遠程方法 System.err.println (hello);// 顯示調用結果 }
application.xml
<!-- 啟動spring注解掃描 --> <context:annotation-config /> <context:component-scan base-package="com.dubbo.*" /> <!-- 提供方應用信息,用於計算依賴關系 --> <dubbo:application name="lclc_consumer" /> <!-- 使用zookeeper注冊中心暴露服務地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <dubbo:reference id="ProvideService" interface="com.dubbo.ProvideService" />
請注意:生產者與消費者是兩個項目,是部署在兩個服務器上的,通過dubbo進行鏈接起來,消費者調用生產者的接口就像調用本地一樣。