Dubbo 學習(二)服務註冊與發現
在上一篇中我們提到,dubbo官網上推薦使用ZooKeeper作為註冊中心。那麼今天我們就通過程式碼來實踐一番,看看一個dubbo的服務消費者如果找到通過ZooKeeper暴露自己的dubbo服務提供者,並成功完成交互。
首先創建一個dubbo-test工程,並添加相關的依賴:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.6</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.10</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.5</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.32.Final</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.8.0</version> </dependency>
從依賴中也可以看到,dubbo的底層通訊實際上是藉助netty實現的。接下來我們在dubbo-test工程中創建一個名為dubbo-test-provider的module,並編寫需要暴露的服務介面。
首先創建一個介面,ProviderService:
package provider.service; public interface ProviderService {
String helloService(String name); }
接下來對這個介面進行實現:
package provider.impl; import provider.service.ProviderService; public class ProviderServiceImpl implements ProviderService { public String helloService(String name) { return "Hello " + name + "!"; } }
開始構建服務者使用的dubbo配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="//code.alibabatech.com/schema/dubbo" xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //code.alibabatech.com/schema/dubbo //code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--當前項目在整個分散式架構裡面的唯一名稱,計算依賴關係的標籤--> <dubbo:application name = "dubbo_provider" /> <!--註冊中心 --> <dubbo:registry address = "zookeeper://127.0.0.1:2181" /> <!-- 用dubbo協議在20880埠暴露服務 --> <dubbo:protocol name = "dubbo" port = "20880" /> <!--服務發布的配置,需要暴露的服務介面--> <dubbo:service interface = "provider.service.ProviderService" ref = "providerService" /> <!--Bean--> <bean id = "providerService" class = "provider.impl.ProviderServiceImpl"/> </beans>
這裡補充說明一下,如果需要對接的是一個ZooKeeper集群的話,可以採用下方的寫法:
<dubbo:registry protocol = "zookeeper" address = "192.168.11.129:2181,192.168.11.130:2181"/>
啟動類中自然需要載入dubbo的配置文件:
public class DubboProvider { public static void main( String[] args ) throws IOException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml"); context.start(); System.in.read(); } }
此時的目錄結構如下:

接下來繼續添加一個module,起名為dubbo-test-consumer。需要注意的是,除非兩個module載入同一份介面類,否則消費者項目中也需要有路徑相同的介面聲明,如下圖所示:

由於我們的消費者僅僅用於調用服務提供者暴露的介面,無需暴露自己本身,因此dubbo配置文件會簡單一些,如下所示:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="//code.alibabatech.com/schema/dubbo" xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //code.alibabatech.com/schema/dubbo //code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--當前項目在整個分散式架構裡面的唯一名稱,計算依賴關係的標籤--> <dubbo:application name = "dubbo_consumer" /> <!--註冊中心 --> <dubbo:registry address = "zookeeper://127.0.0.1:2181" /> <dubbo:reference id = "providerService" interface = "provider.service.ProviderService"/> </beans>
啟動類中進行服務的調用並列印返回結果:
public class DubboConsumer { public static void main( String[] args ) throws IOException { ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("consumer.xml"); context.start(); ProviderService providerService = (ProviderService) context.getBean("providerService"); String s = providerService.helloService("eddy"); System.out.println(s); System.in.read(); } }
依次啟動ZooKeeper、服務端以及消費端,效果如下:

參考資料:
//blog.csdn.net/liyintaoliuyun/article/details/80066269
//segmentfault.com/a/1190000019896723
//blog.csdn.net/hjiacheng/article/details/55000570

