注:本筆記接dubbo入門學習筆記之環境準備繼續記錄;
(四)開發服務提供者和消費者並讓他們在啓動時分別向註冊中心註冊和訂閱服務
需求:訂單服務中初始化訂單功能需要調用用戶服務的獲取用戶信息的接口(訂單服務與用戶服務分別部署在不同的服務器)
思路:1、基於官網的dubbo服務化最佳實踐,我們開發一個入門級demo可以先開發一個公共的接口層,然後服務提供者和服務消費者分別引用該接口的依賴
2、本例中我們需要新建一個公共接口層的maven項目pub-interfence,定義查詢用戶信息的接口和初始化訂單的接口
3、新建服務提供者和消費者的項目分別引入pub-interfence依賴並實現對應接口
4、進行整合dubbo的相關配置,測試服務提供者和消費者是否成功向註冊中心註冊和訂閱
(1)新建公共接口層的maven項目pub-interfence,定義查詢用戶信息的接口和初始化訂單的接口,關鍵代碼如下:
/** * 訂單服務相關接口 */ public interface OrderService { /** * 初始化訂單 * @param userId */ List<User> initOrder(String userId); }
/** * @author 董琳琳 * @date 2018/9/14 11:38 * @description 用戶服務相關接口 */ public interface UserService { /** * 獲取用戶信息 * @param userId * @return */ List<User> getUserList(String userId); }
(2)新建服務提供者user-service-provider引入pub-interfence並向註冊中心註冊,關鍵代碼如下:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.darling.dubboDemo</groupId> <artifactId>user-service-provider</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- 引入公共接口層的依賴 --> <dependency> <groupId>com.darling.dubboDemo</groupId> <artifactId>pub-interfence</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- 引入dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <!-- 註冊中心使用的是zookeeper,引入操作zookeeper的客戶端端 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> </dependencies> </project>
UserServiceImpl:
/** * @author 董琳琳 * @date 2018/9/28 10:24 * @description 用戶服務的實現類 這裏用來向訂單服務提供相關服務 */ public class UserServiceImpl implements UserService { /** * 查詢用戶信息(這裏爲訂單服務的初始化訂單接口提供服務) * @param userId * @return */ @Override public List<User> getUserAddressList(String userId) { List<User> list = new ArrayList(); list.add(new User(3,"韋德","男",36,"邁阿密")); list.add(new User(23,"詹姆斯","男",34,"洛杉磯")); list.add(new User(24,"科比","男",39,"洛杉磯")); return list; } }
在項目的resource目錄下新建provider.xml整合dubbo:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" 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"> <!-- 當前服務的名稱 --> <dubbo:application name="user-service-provider"/> <!-- 註冊中心的地址 這裏註冊中心用的是zookeeper --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/> <!-- 指定通信規則(通信協議?通信端口) --> <dubbo:protocol name="dubbo" port="20883"></dubbo:protocol> <!-- 需要暴露的服務 --> <dubbo:service interface="com.darling.pubIn.service.UserService" ref="userService" version="1.0.0"/> <!-- 需要暴露的服務的實現類 --> <bean id="userService" class="com.darling.user.service.UserServiceImpl"/> <!-- 監控中心協議,如果爲protocol="registry",表示從註冊中心發現監控中心地址,否則直連監控中心 --> <dubbo:monitor protocol="registry"></dubbo:monitor> <!-- timeout:超時時間配置 retries:重試次數配置(超時報錯後重試連接的次數,不含第一次調用,如果目標服務有多個重試的時候會自動切換別的服務) --> <dubbo:provider timeout="2000" retries="6"></dubbo:provider> </beans>
至此一個簡單的服務提供者算是搭建完畢了,下面通過spring來加載 配置文件,測試是否成功向註冊中心註冊了,測試代碼如下:
/** * @author 董琳琳 * @date 2018/9/14 14:51 * @description 測試服務提供者(用戶服務)向註冊中心註冊是否成功 */ public class TestProviderDemo { public static void main(String[] args) throws IOException { // 加載配置文件 ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("provider.xml"); // 容器啓動 applicationContext.start(); // 使程序阻塞(由於是單元測試,如果程序跑完了我們再dubbo控制檯看不到效果) System.in.read(); } }
如果一切順利的話,打開dubbo-admin的首頁點擊服務治理==>應用將會看到:
(3)新建服務消費者order-service-consumer引入pub-interfence並向註冊中心訂閱服務,關鍵代碼如下:
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.darling</groupId> <artifactId>order-service-consumer</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- 引入公共接口層的依賴 --> <dependency> <groupId>com.darling.dubboDemo</groupId> <artifactId>pub-interfence</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- 引入dubbo --> <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <!-- 註冊中心使用的是zookeeper,引入操作zookeeper的客戶端端 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> </dependencies> </project>
OrderServiceImpl:
/** * @author 董琳琳 * @date 2018/9/14 11:50 * @description 訂單服務的實現類 */ @Service public class OrderServiceImpl implements OrderService { @Autowired UserService userService; /** * 初始化訂單並調用用戶服務的接口 * @param userId * @return */ @Override public List<User> initOrder(String userId) { return userService.getUserAddressList(userId); } }
在項目的resource目錄下新建consumer.xml整合dubbo:
<?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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 開啓springmvc的包掃描 --> <context:component-scan base-package="com.darling.order"></context:component-scan> <!-- 當前服務的名稱 --> <dubbo:application name="order-service-consumer"/> <!-- 註冊中心的地址 這裏註冊中心用的是zookeeper --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/> <!-- 聲明需要調用的遠程服務的接口;生成遠程服務代理 --> <dubbo:reference id="userService" check="false" interface="com.darling.pubIn.service.UserService" version="*"/> <!-- 監控中心協議,如果爲protocol="registry",表示從註冊中心發現監控中心地址,否則直連監控中心 --> <dubbo:monitor protocol="registry"></dubbo:monitor> </beans>
這樣,一個簡單的消費者也基本搭建完畢,接下來就是測試了,測試代碼如下:
/** * @author 董琳琳 * @date 2018/9/14 15:57 * @description 測試服務調用者是否成功從註冊中心訂閱服務 */ public class TestConsumerDemo { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml"); OrderService service = applicationContext.getBean(OrderService.class); List<User> list = service.initOrder("1"); for (User user:list) { System.out.println(user.toString()); } System.in.read(); } }
調用成功後控制檯會打印UserServiceImpl中返回的用戶信息,打開dubbo-admin首頁點擊服務治理==>應用,內容如下:
至此,一個簡單的通過dubbo進行服務間的調用的demo就全部搭建並測試完畢了,需要注意的是此demo中爲了方便並沒有連接數據庫,數據都是寫死的,後續會繼續記錄如何使用dubbo官網上的一些常用配置以及如何整合dubbo和springboot;