在前兩章《Docker下dubbo開發,三部曲之一:極速體驗》和《Docker下dubbo開發,三部曲之二:本地環境搭建》中,咱們體驗了dubbo環境搭建以及服務的發佈和消費,對dubbo有了初步認識,本章咱們來實戰dubbo服務的發佈和消費代碼的編寫,實戰後的咱們能將本身的服務發佈到dubbo環境供別人調用,也能讓本身的工程去調用dubbo環境中的已有服務;git
本次實戰一共有兩個工程,分別是服務的提供者和消費者,都是web工程,代碼在github上,地址是https://github.com/zq2599/blog_demos ,這裏面有多個工程,本章所需的代碼以下:程序員
接下來咱們逐個分析,實戰開發;github
首先是pom中的依賴關係,除了經常使用的spring相關的,咱們還要加入dubbo和zookeeper的依賴,以下所示:web
<!-- dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.3.6</version>
</dependency>複製代碼
接下來看代碼,本次實戰提供了兩個服務,分別實現了一下兩個接口:spring
public class CalculateServiceImpl implements CalculateService{
@Override
public int add(int a, int b) {
return a + b;
}
}複製代碼
public class PlatformServiceImpl implements PlatformService {
@Override
public String getRpcFrom() {
return System.getenv().get("TOMCAT_SERVER_ID");
}
}複製代碼
以上是兩個演示用的服務實現,邏輯很簡單,如今看如何將服務發佈到dubbo環境:docker
spring-extends.xml是咱們自定義的spring配置文件,想發佈到dubbo環境的服務都在這裏聲明:apache
<dubbo:application name="dubbo_service_provider" />
<!-- 本機 僞集羣 測試 -->
<!--
<dubbo:registry protocol="zookeeper" address="192.9.145.19:2181,192.9.145.19:2182,192.9.145.19:2183" />
-->
<dubbo:registry address="zookeeper://zkhost:2181" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="com.bolingcavalry.service.CalculateService"
ref="calculateService" />
<dubbo:service interface="com.bolingcavalry.service.PlatformService"
ref="platformService" />
<!-- 和本地bean同樣實現服務 -->
<bean id="calculateService" class="com.bolingcavalry.service.impl.CalculateServiceImpl" />
<bean id="platformService" class="com.bolingcavalry.service.impl.PlatformServiceImpl" />複製代碼
dubbo:application定義了服務歸屬的應用爲dubboserviceprovider;dubbo:registry定義了註冊中心地址,本次實戰的zookeeper配置爲單機,因此只填寫了一個地址"zookeeper://zkhost:2181",其中zkhost是docker容器的link屬性的別名(鏈接到zookeeper容器),在dubbo:registry配置的上面有一個被註釋掉的dubbo:registry配置,裏面是zookeeper集羣時候的鏈接方式;dubbo:protocol定義採用dubbo協議,使用20880端口;dubbo:service配置了要發佈的服務,指定服務接口以及對應的bean;app
使用以上配置,在spring環境啓動後註冊中心就會感知到,在pom.xml文件所在目錄下執行mvn clean package -Dmaven.test.skip=true便可編譯打包,在docker容器發佈運行方式請參照《Docker下dubbo開發,三部曲之二:本地環境搭建》;maven
服務消費者工程是dubboserviceconsumer,pom中的依賴關係和服務提供者的同樣的,因爲要調用dubboserviceprovider提供的服務,因此要把CalculateService和PlatformService這兩個接口引入到工程中,通常是經過jar包方式引入,這裏圖個方便,直接將兩個接口的源碼複製到工程中,以下圖:ide
再來看看調用服務的代碼,以下圖所示,經過普通的Autowired就能直接使用了,就像普通的spring環境中使用服務同樣簡單:
[外鏈圖片轉存中...(img-uShHNkJu-1568769121752)]
從dubbo環境獲取遠程服務的能力,是經過如下spring配置來實現的:
<!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方同樣 -->
<dubbo:application name="dubbo_service_consumer" />
<!-- 使用multicast廣播註冊中心暴露發現服務地址 -->
<!--
<dubbo:registry protocol="zookeeper" address="192.9.145.19:2181,192.9.145.19:2182,192.9.145.19:2183" />
-->
<dubbo:registry address="zookeeper://172.28.0.3:2181" />
<!-- 生成遠程服務代理,能夠和本地bean同樣使用demoService -->
<dubbo:reference id="calculateService" interface="com.bolingcavalry.service.CalculateService" />
<dubbo:reference id="platformService" interface="com.bolingcavalry.service.PlatformService" />複製代碼
dubbo:application和dubbo:registry的做用和前面分析的服務提供者的同樣,dubbo:reference是指從dubbo環境得到遠程的服務,interface指定了服務類型,應用啓動後,用到服務端的時候就會根據註冊中心的信息,遠程調用服務提供者的服務;
以上就是dubbo的服務提供者和消費者的實戰源碼,實際的生產環境中,還會涉及到更詳細更復雜的配置和使用,請讀者們關注dubbo官網的開發手冊。