IDEA整合Dubbo+Zookeeper+SpringBoot實(shí)現(xiàn)
本文主要介紹了IDEA整合Dubbo+Zookeeper+SpringBoot實(shí)現(xiàn),分享給大家,具體如下:
放上一張Dubbo的架構(gòu)圖
剛剛學(xué)過SpringCloud,Dubbo雖然沒有Spring家族那么強(qiáng)悍,但始終不能違背Dubbo是一款高性能優(yōu)秀的RPC框架。
自己也是初學(xué)者,想自己動(dòng)手做一個(gè)簡(jiǎn)單的demo,于是上網(wǎng)查資料,發(fā)現(xiàn)針對(duì)那種入門的案例,網(wǎng)上主要有兩個(gè)比較經(jīng)典的,一個(gè)是尚硅谷雷神版,還有一個(gè)是官網(wǎng)推薦的入門 案例。
雷神的Dubbo視頻教程大神講解
視頻中用的eclipse開發(fā),習(xí)慣IDEA開發(fā)的我們不免手癢想要使用IDEA整合一波。
1. 提出需求
業(yè)務(wù)拆分
再次拆分
2. 環(huán)境準(zhǔn)備
1. Zookeeper-3.4.14
2. dubbo-admin 可視化管理界面
安裝過程參照雷神視頻,沒什么技術(shù)含量
準(zhǔn)備好三個(gè)SpringBoot模塊
3. 業(yè)務(wù)接口整合
這個(gè)模塊的主要功能在于分包解耦
UserAddress.java:
public class UserAddress implements Serializable { private Integer id; private String userAddress; private String userId; private String consignee; private String phoneNum; private String isDefault; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getConsignee() { return consignee; } public void setConsignee(String consignee) { this.consignee = consignee; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } public String getIsDefault() { return isDefault; } public void setIsDefault(String isDefault) { this.isDefault = isDefault; } public UserAddress(Integer id, String userAddress, String userId, String consignee, String phoneNum, String isDefault) { this.id = id; this.userAddress = userAddress; this.userId = userId; this.consignee = consignee; this.phoneNum = phoneNum; this.isDefault = isDefault; } @Override public String toString() { return "UserAddress{" + "id=" + id + ", userAddress='" + userAddress + '\'' + ", userId='" + userId + '\'' + ", consignee='" + consignee + '\'' + ", phoneNum='" + phoneNum + '\'' + ", isDefault='" + isDefault + '\'' + '}'; } }
OrderService.java
public interface OrderService { //初始化訂單模塊 public List<UserAddress> initOrder(String userId); }
UserService.java
public interface UserService { //消費(fèi)訂單模塊 public List<UserAddress> getUserAddressList(String userId); }
4. 服務(wù)提供者
UserServiceImpl.java
@Component @Service //用的是com.alibaba.dubbo.config.annotation.Service,目的是為了在注冊(cè)中心暴露服務(wù) public class UserServiceImpl implements UserService { @Override public List<UserAddress> getUserAddressList(String userId) { UserAddress userAddress1 = new UserAddress(1,"福建省莆田市","37","劉老師","10086","1"); UserAddress userAddress2 = new UserAddress(2,"福建省福州市","33","黃老師","1001","1"); List<UserAddress> addresses = new ArrayList<>(); addresses.add(userAddress1); addresses.add(userAddress2); return addresses; } }
UserServiceProviderApplication.java
@EnableDubbo //開啟Dubbo @SpringBootApplication public class UserServiceProviderApplication { public static void main(String[] args) { SpringApplication.run(UserServiceProviderApplication.class, args); } }
application.properties
#應(yīng)用端口 server.port=8080 #dubbo服務(wù)地址 dubbo.application.name=user-service-provider #zk注冊(cè)中心協(xié)議和地址 dubbo.registry.protocol=zookeeper dubbo.registry.address=127.0.0.1:2181 #通信規(guī)則(通信協(xié)議和端口) dubbo.protocol.name=dubbo dubbo.protocol.port=20880 #連接監(jiān)控中心(這里面我沒有啟動(dòng)監(jiān)控中心) dubbo.monitor.protocol=registry
pom.xml 新增依賴
<!-- 引入公共API,以實(shí)現(xiàn)其接口 --> <dependency> <groupId>com.liuzeyu</groupId> <artifactId>gmall-interface</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- 引入spring-boot-starter以及dubbo和curator的依賴 --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency>
5. 服務(wù)消費(fèi)者
OrderController.java
@RequestMapping("order") @Controller public class OrderController { @Autowired private OrderService orderService; @ResponseBody //以json格式返回 @RequestMapping("/initOrder") public List<UserAddress> initOrder(@RequestParam("uid") String userId){ List<UserAddress> userAddresses = orderService.initOrder(userId); return userAddresses; } }
OrderServiceImpl.java
@Service //暴露服務(wù) @Component public class OrderServiceImpl implements OrderService { //遠(yuǎn)程調(diào)用服務(wù) @Reference(url = "dubbo://127.0.0.1:20880") private UserService userService; @Override public List<UserAddress> initOrder(String userId) { return userService.getUserAddressList(userId); } }
@Reference
這邊的URL指向需要注意,因?yàn)槲覀兊耐ㄐ艆f(xié)議使用dubbo,地址和端口也必須指明,否則會(huì)發(fā)現(xiàn)UserService 注入為null的現(xiàn)象!
OrderServiceConsumerApplication.java
@EnableDubbo @SpringBootApplication public class OrderServiceConsumerApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceConsumerApplication.class, args); } }
application.properties
#dubbo服務(wù)名稱 dubbo.application.name=order-service-consumer #zk地址 dubbo.registry.address=zookeeper://127.0.0.1:2181 #監(jiān)控中心配置 dubbo.monitor.protocol=registry #這個(gè)需要注意,每一個(gè)服務(wù)的dubbo端口不能沖突 dubbo.protocol.port=20881 server.port=8081
pom.xml
<!-- springboot web模塊 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.liuzeyu</groupId> <artifactId>gmall-interface</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- 引入spring-boot-starter以及dubbo和curator的依賴 --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency>
6. 測(cè)試
DEMO的測(cè)試流程應(yīng)該這樣
搭建ZK環(huán)境
搭建Dubbo可視化管理界面
項(xiàng)目啟動(dòng)
查看是否服務(wù)注冊(cè)進(jìn)來
接口調(diào)式
訪問:http://localhost:8081/order/initOrder?uid=33
實(shí)現(xiàn)了RPC遠(yuǎn)程通信?。?/p>
7. 最后附上另外兩種配置文件整合方式
7.1 XML整合配置文件
因?yàn)镾pringBoot屏蔽了大量的XML配置,但是dubbo官方又建議我們使用XML配置,所以整合的最后附上XML配置
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"> <!--定義了提供方應(yīng)用信息,用于計(jì)算依賴關(guān)系;在 dubbo-admin 或 dubbo-monitor 會(huì)顯示這個(gè)名字,方便辨識(shí)--> <!-- 對(duì)應(yīng)properties:dubbo.application.name=user-service-provider--> <dubbo:application name="order-service-consumer" owner="lzy" organization="hgfzp"/> <!--使用 zookeeper 注冊(cè)中心暴露服務(wù),注意要先開啟 zookeeper--> <!-- 對(duì)應(yīng)properties:dubbo.registry.protocol=zookeeper dubbo.registry.address=127.0.0.1:2181--> <dubbo:registry address="zookeeper://localhost:2181"/> <!-- 用dubbo協(xié)議在20880端口暴露服務(wù) --> <!-- 對(duì)應(yīng)properties:dubbo.protocol.name=dubbo dubbo.protocol.port=20880--> <dubbo:protocol name="dubbo" port="20881" /> <!--使用 dubbo 協(xié)議實(shí)現(xiàn)定義好的 com.liuzeyu.service.UserService 接口--> <!-- 對(duì)應(yīng)@Component @Service注入U(xiǎn)serServiceImpl--> <dubbo:service interface="com.liuzeyu.service.OrderService" ref="orderService" protocol="dubbo" /> <!--具體實(shí)現(xiàn)該接口的 bean--> <bean id="orderService" class="com.liuzeyu.service.impl.OrderServiceImpl"/> <!-- 配置監(jiān)控中心--> <dubbo:monitor protocol="registry"/> </beans>
provider.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"> <!--定義了提供方應(yīng)用信息,用于計(jì)算依賴關(guān)系;在 dubbo-admin 或 dubbo-monitor 會(huì)顯示這個(gè)名字,方便辨識(shí)--> <!-- 對(duì)應(yīng)properties:dubbo.application.name=user-service-provider--> <dubbo:application name="user-service-provider" owner="lzy" organization="hgfzp"/> <!--使用 zookeeper 注冊(cè)中心暴露服務(wù),注意要先開啟 zookeeper--> <!-- 對(duì)應(yīng)properties:dubbo.registry.protocol=zookeeper dubbo.registry.address=127.0.0.1:2181--> <dubbo:registry address="zookeeper://localhost:2181"/> <!-- 用dubbo協(xié)議在20880端口暴露服務(wù) --> <!-- 對(duì)應(yīng)properties:dubbo.protocol.name=dubbo dubbo.protocol.port=20880--> <dubbo:protocol name="dubbo" port="20880" /> <!--使用 dubbo 協(xié)議實(shí)現(xiàn)定義好的 com.liuzeyu.service.UserService 接口--> <!-- 對(duì)應(yīng)@Component @Service注入U(xiǎn)serServiceImpl--> <dubbo:service interface="com.liuzeyu.service.UserService" ref="userService" protocol="dubbo" /> <!--具體實(shí)現(xiàn)該接口的 bean--> <bean id="userService" class="com.liuzeyu.service.impl.UserServiceImpl"/> <dubbo:monitor protocol="registry"/> </beans>
如需要啟動(dòng)測(cè)試記住需要注釋掉之前加在接口實(shí)現(xiàn)類上面的服務(wù)暴露配置
OrderServiceImpl:
UserServiceImpl:
7.2 配置類整合
通過配置自定義配置類注入配置信息
OrderConfig.java 服務(wù)提供者使用
@Configuration public class OrderConfig { @Bean public ApplicationConfig applicationConfig(){ ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("user-service-provider"); applicationConfig.setOwner("lzy"); applicationConfig.setOrganization("hgfzp"); return applicationConfig; } @Bean public RegistryConfig registryConfig(){ RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setProtocol("zookeeper"); registryConfig.setAddress("127.0.0.1:2181"); return registryConfig; } @Bean public ProtocolConfig protocolConfig(){ ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName("dubbo"); protocolConfig.setPort(20880); return protocolConfig; } @Bean public ServiceConfig<UserService> serviceConfig(UserService userService){ ServiceConfig<UserService> serviceConfig = new ServiceConfig<UserService>(); serviceConfig.setInterface(UserService.class); serviceConfig.setRef(userService); //配置每一個(gè)Method信息 List<MethodConfig> methodConfigs = new ArrayList<>(); MethodConfig methodConfig = new MethodConfig(); methodConfig.setId("userService"); methodConfig.setName("getUserAddressList"); methodConfigs.add(methodConfig); serviceConfig.setMethods(methodConfigs); return serviceConfig; } }
ConsumerConfig.java 服務(wù)提供者使用
@Configuration public class ConsumerConfig { @Bean public ApplicationConfig applicationConfig(){ ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("order-service-consumer"); applicationConfig.setOwner("lzy"); applicationConfig.setOrganization("hgfzp"); return applicationConfig; } @Bean public RegistryConfig registryConfig(){ RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setProtocol("zookeeper"); registryConfig.setAddress("127.0.0.1:2181"); return registryConfig; } @Bean public ProtocolConfig protocolConfig(){ ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName("dubbo"); protocolConfig.setPort(20881); return protocolConfig; } @Bean public ServiceConfig<OrderService> serviceConfig(OrderService orderService){ ServiceConfig<OrderService> serviceConfig = new ServiceConfig<OrderService>(); serviceConfig.setInterface(OrderService.class); serviceConfig.setRef(orderService); //配置每一個(gè)Method信息 List<MethodConfig> methodConfigs = new ArrayList<>(); MethodConfig methodConfig = new MethodConfig(); methodConfig.setId("orderService"); methodConfig.setName("initOrder"); methodConfigs.add(methodConfig); serviceConfig.setMethods(methodConfigs); return serviceConfig; } }
使用配置類需要注意兩點(diǎn)
需要指定dubbo配置類的包掃描路徑,啟動(dòng)類上配置 @EnableDubbo(scanBasePackages = "com.liuzeyu")
需要將接口實(shí)現(xiàn)暴露出來
OrderServiceImpl
UserServiceImpl
兩種方案的配置文件整合同樣可以實(shí)現(xiàn)RPC通信,可自行測(cè)試!
到此這篇關(guān)于IDEA整合Dubbo+Zookeeper+SpringBoot實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)IDEA Dubbo Zookeeper SpringBoot內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot 整合 Dubbo/ZooKeeper 實(shí)現(xiàn) SOA 案例解析
- SpringBoot整合Dubbo+Zookeeper實(shí)現(xiàn)RPC調(diào)用
- springBoot+dubbo+zookeeper實(shí)現(xiàn)分布式開發(fā)應(yīng)用的項(xiàng)目實(shí)踐
- springboot+dubbo+zookeeper的簡(jiǎn)單實(shí)例詳解
- SpringBoot+Dubbo+Zookeeper實(shí)現(xiàn)簡(jiǎn)單分布式開發(fā)的應(yīng)用詳解
- SpringBoot中dubbo+zookeeper實(shí)現(xiàn)分布式開發(fā)的應(yīng)用詳解
- SpringBoot+Dubbo+Zookeeper知識(shí)整合過程詳解
相關(guān)文章
關(guān)于postman傳參的幾種格式 list,map 等
這篇文章主要介紹了postman傳參的幾種格式 list,map等,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08MybatisPlus實(shí)現(xiàn)insertBatchSomeColumn進(jìn)行批量增加
本文主要介紹了MybatisPlus實(shí)現(xiàn)insertBatchSomeColumn進(jìn)行批量增加,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Java加權(quán)負(fù)載均衡策略實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java加權(quán)負(fù)載均衡策略實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03