一.dubbo簡(jiǎn)介
Dubbo 是阿里巴巴公司開(kāi)源的一個(gè)高性能優(yōu)秀的服務(wù)框架备埃,使得應(yīng)用可通過(guò)高性能的 RPC 實(shí)現(xiàn)服務(wù)的輸出和輸入功能,可以和 Spring 框架無(wú)縫集成堡妒。
主要核心部件:
- Remoting: 網(wǎng)絡(luò)通信框架配乱,實(shí)現(xiàn)了 sync-over-async 和 request-response 消息機(jī)制
- RPC: 一個(gè)遠(yuǎn)程過(guò)程調(diào)用的抽象,支持負(fù)載均衡、容災(zāi)和集群功能
- Registry: 服務(wù)目錄框架用于服務(wù)的注冊(cè)和服務(wù)事件發(fā)布和訂閱
-
Dubbo 工作原理
-
Provider
暴露服務(wù)方稱之為“服務(wù)提供者” -
Consumer
調(diào)用遠(yuǎn)程服務(wù)方稱之為“服務(wù)消費(fèi)者” -
Registry
服務(wù)注冊(cè)與發(fā)現(xiàn)的中心目錄服務(wù)稱之為“服務(wù)注冊(cè)中心” -
Monitor
統(tǒng)計(jì)服務(wù)的調(diào)用次調(diào)和調(diào)用時(shí)間的日志服務(wù)稱之為“服務(wù)監(jiān)控中心”
二. 快速啟動(dòng)
Dubbo 采用全 Spring 配置方式搬泥,透明化接入應(yīng)用桑寨,對(duì)應(yīng)用沒(méi)有任何 API 侵入,只需用 Spring 加載 Dubbo 的配置即可忿檩,Dubbo 基于 Spring 的 Schema 擴(kuò)展 進(jìn)行加載尉尾。
如果不想使用 Spring 配置,可以通過(guò) API 的方式 進(jìn)行調(diào)用燥透。
- 提供服務(wù)接口與實(shí)現(xiàn)(Service與ServiceImpl)
package org.apache.dubbo.demo;
public interface DemoService {
String sayHello(String name);
}
//實(shí)現(xiàn)略 DemoServiceImpl
- 用 Spring 配置聲明暴露服務(wù)與引用服務(wù)
- 暴露服務(wù) 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">
<!-- 提供方應(yīng)用信息沙咏,用于計(jì)算依賴關(guān)系 -->
<dubbo:application name="hello-world-app" />
<!-- 使用multicast廣播注冊(cè)中心暴露服務(wù)地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" />
<!-- 用dubbo協(xié)議在20880端口暴露服務(wù) -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 聲明需要暴露的服務(wù)接口 -->
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" />
<!-- 和本地bean一樣實(shí)現(xiàn)服務(wù) -->
<bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl" />
</beans>
- 加載 Spring 配置 要啟動(dòng)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(); // 按任意鍵退出
}
}
- 引用遠(yuǎn)程服務(wù)
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">
<!-- 消費(fèi)方應(yīng)用名,用于計(jì)算依賴關(guān)系班套,不是匹配條件肢藐,不要與提供方一樣 -->
<dubbo:application name="consumer-of-helloworld-app" />
<!-- 使用multicast廣播注冊(cè)中心暴露發(fā)現(xiàn)服務(wù)地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" />
<!-- 生成遠(yuǎn)程服務(wù)代理,可以和本地bean一樣使用demoService -->
<dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" />
</beans>
- Consumer.java (也可以使用 IoC 注入)
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.apache.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"); // 獲取遠(yuǎn)程服務(wù)代理
String hello = demoService.sayHello("world"); // 執(zhí)行遠(yuǎn)程方法
System.out.println( hello ); // 顯示調(diào)用結(jié)果
}
}