Dubbo 是一個分佈式服務框架,以及阿里巴巴內部的 SOA 服務化治理方案的核心框架。其功能主要包括:高性能 NIO 通信及多協議集成,服務動態尋址與路由,軟負載均衡與容錯,依賴分析與降級等。html
說通俗點,就是首先將程序組件化成一個個相對獨立的服務,而後就能夠對服務進行分佈式;並且,它有註冊中心經過監聽,實時發現着新服務,並部署,還能夠推送給客戶端;它還集成了負載均衡的解決方案,利用隨機算法來將各個服務科學地分配到多臺服務器上;固然,它也集成了容錯機制,來提升集羣的穩定性。前端
官方開發指南: http://dubbo.apache.org/zh-cn/docs/dev/build.htmljava
京東的擴展版本 jd-hydra: http://www.oschina.net/p/jd-hydragit
RPC 是指遠程過程調用,也就是說兩臺服務 A,B,一個應用部署在 A 服務器上,想要調用 B 服務器上應用提供的函數/方法,因爲不在一個內存空間,不能直接調用,須要經過網絡來表達調用的語義和傳達調用的數據。github
RPC 演進算法
框架演進:ORM –> MVC –> RPC –> SOAapache
架構演進:單一應用架構 –> 垂直應用架構 —> 分佈式服務架構 –> 流動計算架構緩存
Dubbo 架構圖服務器
節點角色網絡
調用關係
性能說明
Dubbo 採用全 Spring 配置方式,透明化接入應用,對應用沒有任何 API 侵入,其配置採用 XML 和註解的方式,使用 Spring 的 BeanFactory 加載 Bean,運行在 Spring 容器中。
簡易步驟以下
1)定義服務接口
// DemoService.java package com.alibaba.dubbo.demo; public interface DemoService { String sayHello(String name); }
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; } }
3)暴露服務
<beans> <!-- 省略 schema --!> <!-- 提供方應用信息,用於計算依賴關係 --> <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>
// FooServiceImpl.java import com.alibaba.dubbo.config.annotation.Service; @Service(version="1.0.0") public class FooServiceImpl implements FooService { }
// provider.xml <!-- 公共信息,也能夠用 dubbo.properties 配置 --> <dubbo:application name="annotation-provider" /> <dubbo:registry address="127.0.0.1:4548" /> <!-- 掃描註解包路徑,多個包用逗號分隔,不填 pacakge 表示掃描當前 ApplicationContext 中全部的類 --> <dubbo:annotation package="com.foo.bar.service" />
4)啓動
public static void main(String[] args) throws Exception { // 加載 xml 配置啓動 Spring 的 BeanFactory ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"}); context.start(); System.in.read(); // 按任意鍵退出 }
1)引用遠程服務接口
// consumer.xml <!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方同樣 --> <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" />
@Component public class BarAction { @Reference(version="1.0.0") private FooService fooService; }
2)調用服務
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 ); // 顯示調用結果 }