dubbo是阿里開源的一套分佈式框架,目前在不少互聯網企業中有使用,dubbo的解耦作的很好,學習使用成本也很低,讓你的項目很簡單的就實現了分佈式、服務發現、故障切換等看似很高大上的功能,一些具體的介紹網上不少, 這篇文檔簡單介紹下整套環境的的搭建。nginx
dubbo consumer provider 註冊中心,是須要的核心部分,admin,monitor不搭建,對業務也沒有影響,這裏註冊中心,咱們使用zookeeper實現,也是目前生產環境中使用的最多的中間件。git
首先下載zookeeper,這裏使用的是3.4.9的穩定版,將conf/zoo_sample.cfg 複製一份,重名爲zoo.cfg修改配置以下web
dataDir=/tmp/zookeeper clientPort=2181
這兩項配置,按照本機的實際狀況配置,運行 zkServer.cmd,啓動 zookeeperspring
新建maven項目,以下圖所示apache
其中,api-dubbo是聲明的接口,api
consumer-dubbo是消費者服務器
provider-dubbo是提供者網絡
根pom配置app
<properties> <org.springframework.version>4.1.3.RELEASE</org.springframework.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.1.0</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.3.3</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> </dependencies>
api-dubbo中 只有一個接口文件,框架
public interface DemoService { public String sayHello(String name); }
consumer-dubbo
public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"dubbo-demo-consumer.xml"}); context.start(); DemoService demoService = (DemoService)context.getBean("demoService"); // get service invocation proxy String hello = demoService.sayHello("world"); System.out.println( hello ); } }
內容很簡單,加載配置文件啓動spring,獲取bean,調用其中的方法sayHello
配置文件dubbo-demo-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://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> <!-- 消費方應用名 --> <dubbo:application name="consumer-of-helloworld-app" /> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 生成遠程服務代理 --> <dubbo:reference id="demoService" interface="com.kent.dubbo.demo.DemoService" /> </beans>
provider-dubbo
public class DemoServiceImpl implements DemoService { public String sayHello(String name) { System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress()); return "Hello " + name + ", response form provider: " + RpcContext.getContext().getLocalAddress(); } }
DempServiceImpl實現api-dubbo中的接口。
public class DubboProviderDemo { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"dubbo-demo-provider.xml"}); context.start(); System.in.read(); } }
main方法也很簡單 加載配置文件啓動spring
<?xml version="1.0" encoding="UTF-8"?> <!--suppress SpringFacetInspection --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> <dubbo:application name="hello-world-app" /> <!-- zk地址 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 本地端口 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 聲明須要暴露的服務接口 --> <dubbo:service interface="com.kent.dubbo.demo.DemoService" ref="demoService" /> <bean id="demoService" class="com.kent.dubbo.demo.DemoServiceImpl" /> </beans>
運行時,首先啓動DubboProviderDemo
啓動Consumer
其中consumer的配置很簡單
provider的配置中,本機啓動了20880端口,用於接收consumer的請求。
第一次使用的人都很疑惑,zk到底是在作什麼。
傳統企業開發中,如webservice或http服務,客戶端若是要請求服務端的接口,必需要知道服務端的接口信息,而當客戶端數量愈來愈多後,服務端必需要增長機器,實現集羣,以支撐請求,這時候,每每會增長F5或nginx之類負載設備,每增長一臺服務器,就要修改,刷新負載的配置。
能夠腦補下,當N個服務端,N個客戶端之間,幾百上千臺服務器的狀況下,還可能出現各類服務器當機,網絡中斷的狀況下,這時,是什麼狀況。
而dubbo與之不一樣的是,dubbo實現的是服務的動態尋址與路由
客戶端和服務端之間,經過ZK,實現服務的訂閱。ZK充當的角色是服務註冊查找中心
例子中
服務端啓動時去ZK註冊com.kent.dubbo.demo.DemoService接口的節點信息,包括了調用接口所須要的信息。
客戶端啓動時去ZK查找com.kent.dubbo.demo.DemoService接口的節點信息,
當接口調用時,客戶端直接去調用對應的服務端接口。
而當服務端的服務發生變化時,服務端和ZK之間的心跳會通知ZK節點的變化信息,ZK同時也會通知客戶端,客戶端則在下次請求時,就按照變化後的信息調用服務端接口。
dubbo-admin 管理模塊,實現服務治理的一些功能。
修改WEB-INF下的dubbo.properties
的ZK配置後,發佈在TOMCAT下
就能夠看到以前例子中信息。
注意下,一些同窗可能在TOMCAT啓動時會遇到
org.springframework.beans.factory.BeanCreationException: Error creating bean wit
h name 'uriBrokerService': Cannot create inner bean '(inner bean)' of type .......
這是由於JDK使用的1.8 ,網上下載的war包,一些依賴包的版本須要修改後才能使用1.8,換回1.7這個問題就能夠解決了,或者去git上拉代碼,本身編譯。
具體的admin的介紹,就不詳細說了。
monitor是監控模塊。部署前修改conf下的dubbo.properties
dubbo.container=log4j,spring,registry,jetty dubbo.application.name=simple-monitor dubbo.application.owner= dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.protocol.port=7070 dubbo.jetty.port=8089 dubbo.jetty.directory=D:/dubbo-monitor-simple-2.5.3/monitor dubbo.charts.directory=D:/dubbo-monitor-simple-2.5.3/monitor/charts dubbo.statistics.directory=D:/dubbo-monitor-simple-2.5.3/monitor/statistics dubbo.log4j.file=D:/dubbo-monitor-simple-2.5.3/logs/dubbo-monitor-simple.log dubbo.log4j.level=WARN
其中主要是須要修改monitor的路徑位置,根據實際的信息配置。
另外 consumer和provider須要增長配置
<dubbo:monitor protocol="registry"/>
修改完畢後運行bin下的start.bat
效果以下
常常容易遇到的問題是,界面出來了 可是 statistics和charts 就是圖中的圖表是出不來,可能的緣由以下:
1 配置中的路徑若是有問題
2 monitor的lib中使用的dubbo jar包的版本 須要和consumer和provider保持一致!