Dubbo是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可經過高性能的RPC實現服務的輸出和輸入功能,能夠和Spring框架無縫集成。簡單地說,dubbo是一個基於Spring的RPC(遠程過程調用)框架,可以實現服務的遠程調用、服務的治理html
最主要就是服務之間的治理(治理基本上要作成運行時治理)java
若是要用dubbo必需要用spring,很是大的前提算法
調用關係說明:spring
1. 服務容器負責啓動,加載,運行服務提供者。apache
2. 服務提供者在啓動時,向註冊中心註冊本身提供的服務。架構
3. 服務消費者在啓動時,向註冊中心訂閱本身所需的服務。app
4. 註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。負載均衡
5. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗, 再選另外一臺調用。框架
6. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。ide
總結:
生產者啓動時把接口註冊到註冊中心,消費者啓動時從註冊中心獲取生產者的接口列表放到本地,當有請求過來時,從消費者的本地獲取生產者的接口列表選擇一個生產者使用底層的調用協議(http、rmi、netty(dubbo))去調用,dubbo同時還能對服務進行監控
1.1 定義服務接口DemoService.java
package com.alibaba.dubbo.demo; public interface DemoService { String sayHello(String name); }
1.2 在服務提供方實現接口DemoServiceImpl.java
package com.alibaba.dubbo.demo.provider; import com.alibaba.dubbo.demo.DemoService; public class DemoServiceImpl implements DemoService { public String sayHello(String name) { return "Hello " + name; } }
1.3 用Spring配置聲明暴露服務provider.xml
<?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://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 提供方應用信息,用於計算依賴關係 --> <dubbo:application name="hello-world-app" /> <!-- 使用multicast廣播註冊中心暴露服務地址 --> <dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 聲明須要暴露的服務接口 --> <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" /> <!-- 和本地bean同樣實現服務 --> <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" /> </beans>
1.4 加載Spring配置Provider.java
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"}); context.start(); System.in.read(); // 按任意鍵退出 } }
2.1 經過Spring配置引用遠程服務consumer.xml
<?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://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方同樣 --> <dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用multicast廣播註冊中心暴露發現服務地址 --> <dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 生成遠程服務代理,能夠和本地bean同樣使用demoService --> <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" /> </beans>
2.2 加載Spring配置,並調用遠程服務Consumer.java
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.alibaba.dubbo.demo.DemoService; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/consumer.xml"}); context.start(); DemoService demoService = (DemoService)context.getBean("demoService"); // 獲取遠程服務代理 String hello = demoService.sayHello("world"); // 執行遠程方法 System.out.println( hello ); // 顯示調用結果 } }
3.1 該接口需單獨打包,在服務提供方和消費方共享
3.2 對服務消費方隱藏實現
3.3 也可使用IoC注入
參考文章:
dubbo官方文檔:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html