有時候我們需要的服務不在同一個 zookeeper 注冊中心上,此時我們需要在 DUBBO 配置文件中配置多個注冊中心。
下面我們在之前創建項目的基礎上在 provider 模塊中增加一個 IBookService 接口,將其注冊在 localhost 上端口號為 2182 的 zookeeper 注冊中心,來模擬多注冊中心的配置。最后在 consumer 模塊中調用該接口,驗證多注冊中心配置是否成功。
增加 IBookService 接口
IBookService 服務將綁定在地址為 localhost,端口號為 2182 的 zookeeper 注冊中心。我們先創建接口,放在 interface 模塊中:
package com.chanshuyi.service; /** * Created by Administrator on 2016/1/22. */ public interface IBookService { /** * 獲取圖書價格 * @param bookNo 圖書編號 * @return */ public double getPrice(int bookNo); }
在 provider 模塊中實現該接口:
package com.chanshuyi.service.impl; import com.chanshuyi.service.IBookService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; /** * Created by Administrator on 2016/1/22. */ @Service("bookService") public class BookServiceImpl implements IBookService { private Logger logger = LoggerFactory.getLogger(BookServiceImpl.class); @Override public double getPrice(int bookNo) { logger.info("執行getPrice()方法"); return 11.11; } }
之后我們在 consumer 模塊的 UserServiceConsumer.main() 方法里增加對 IBookService.getPrice() 接口的調用。修改后的 UserServiceConsumer 類:
package com.chanshuyi; import com.chanshuyi.service.IBookService; import com.chanshuyi.service.IUserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.stereotype.Component; /** * Created by chanshuyi on 2016/1/19. */ public class UserServiceConsumer { private static Logger logger = LoggerFactory.getLogger(UserServiceConsumer.class); public static void main(String args[]) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); IUserService userService = (IUserService) ctx.getBean("userService"); logger.info("執行結果:" + userService.login("hello", "hello")); IBookService bookService = (IBookService) ctx.getBean("bookService"); logger.info("執行結果:" + bookService.getPrice(12)); } }
到這里,新接口的開發結束。下面在DUBBO 配置文件中配置多注冊中心。
配置多注冊中心
打開 provider 模塊的 spring-provider.xml 配置文件,修改成如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 添加 DUBBO SCHEMA --> 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo 8 http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> 9 10 <!-- 應用名 --> 11 <dubbo:application name="dubbodemo-provider"/> 12 <!-- 連接到哪個本地注冊中心 --> 13 <dubbo:registry id="dubbodemo" address="zookeeper://localhost:2181"/> 14 <dubbo:registry id="dubbodemo_copy" address="zookeeper://localhost:2182"/> 15 <!-- 用dubbo協議在20880端口暴露服務 --> 16 <dubbo:protocol name="dubbo" port="28080"/> 17 <!-- 聲明需要暴露的服務接口 --> 18 <dubbo:service registry="dubbodemo" timeout="3000" interface="com.chanshuyi.service.IUserService" ref="userService"/> 19 <dubbo:service registry="dubbodemo_copy" timeout="3000" interface="com.chanshuyi.service.IBookService" ref="bookService"/> 20 </beans>
第 13、14 行分別聲明了一個 id 為 “dubbodemo”、“dubbodemo_copy”的注冊中心,分別對應本地機器的 2181 和 2182 端口。
第 18 行暴漏了 IUserService 接口並顯式指定將其注冊到 dubbodemo 注冊中心。
第 19 行暴漏了 IBookService 接口並顯示指定將其注冊到 dubbodemo_copy 注冊中心。
如果在暴漏接口的時候沒有指定注冊到哪個注冊中心,那么它會默認注冊到所有的注冊中心。
到這里,配置完成。下面將模擬多個注冊中心,並啟動服務。
模擬多個注冊中心
我們通過修改 zookeeper 端口號的方式,在本機上啟動兩個 zookeeper 注冊中心,分別占用 2181、2182 端口(修改 conf/zoo.cfg 文件的 clientPort 屬性)。
之后我們運行 bin/zkServer.cmd 啟動 zookeeper,啟動后如下圖所示:
此時 zookeeper 正在等待 provider 或 consumer 端的連接。
我們運行 provider 模塊的 Launch.main() 方法,啟動服務。之后運行 consumer 模塊的 UserServiceConsumer.main() 方法,可以看到 provider 模塊成功接收到了 consumer 模塊的接口請求:
本文就到這里結束了。有什么疑問請評論留言。
參考資料: