IDEA整合Dubbo+Zookeeper+SpringBoot實現(xiàn)
本文主要介紹了IDEA整合Dubbo+Zookeeper+SpringBoot實現(xiàn),分享給大家,具體如下:
放上一張Dubbo的架構圖
剛剛學過SpringCloud,Dubbo雖然沒有Spring家族那么強悍,但始終不能違背Dubbo是一款高性能優(yōu)秀的RPC框架。
自己也是初學者,想自己動手做一個簡單的demo,于是上網(wǎng)查資料,發(fā)現(xiàn)針對那種入門的案例,網(wǎng)上主要有兩個比較經(jīng)典的,一個是尚硅谷雷神版,還有一個是官網(wǎng)推薦的入門 案例。
雷神的Dubbo視頻教程大神講解
視頻中用的eclipse開發(fā),習慣IDEA開發(fā)的我們不免手癢想要使用IDEA整合一波。
1. 提出需求
業(yè)務拆分
再次拆分
2. 環(huán)境準備
1. Zookeeper-3.4.14
2. dubbo-admin 可視化管理界面
安裝過程參照雷神視頻,沒什么技術含量
準備好三個SpringBoot模塊
3. 業(yè)務接口整合
這個模塊的主要功能在于分包解耦
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 { //消費訂單模塊 public List<UserAddress> getUserAddressList(String userId); }
4. 服務提供者
UserServiceImpl.java
@Component @Service //用的是com.alibaba.dubbo.config.annotation.Service,目的是為了在注冊中心暴露服務 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
#應用端口 server.port=8080 #dubbo服務地址 dubbo.application.name=user-service-provider #zk注冊中心協(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)控中心(這里面我沒有啟動監(jiān)控中心) dubbo.monitor.protocol=registry
pom.xml 新增依賴
<!-- 引入公共API,以實現(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. 服務消費者
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 //暴露服務 @Component public class OrderServiceImpl implements OrderService { //遠程調用服務 @Reference(url = "dubbo://127.0.0.1:20880") private UserService userService; @Override public List<UserAddress> initOrder(String userId) { return userService.getUserAddressList(userId); } }
@Reference
這邊的URL指向需要注意,因為我們的通信協(xié)議使用dubbo,地址和端口也必須指明,否則會發(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服務名稱 dubbo.application.name=order-service-consumer #zk地址 dubbo.registry.address=zookeeper://127.0.0.1:2181 #監(jiān)控中心配置 dubbo.monitor.protocol=registry #這個需要注意,每一個服務的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. 測試
DEMO的測試流程應該這樣
搭建ZK環(huán)境
搭建Dubbo可視化管理界面
項目啟動
查看是否服務注冊進來
接口調式
訪問:http://localhost:8081/order/initOrder?uid=33
實現(xiàn)了RPC遠程通信??!
7. 最后附上另外兩種配置文件整合方式
7.1 XML整合配置文件
因為SpringBoot屏蔽了大量的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"> <!--定義了提供方應用信息,用于計算依賴關系;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字,方便辨識--> <!-- 對應properties:dubbo.application.name=user-service-provider--> <dubbo:application name="order-service-consumer" owner="lzy" organization="hgfzp"/> <!--使用 zookeeper 注冊中心暴露服務,注意要先開啟 zookeeper--> <!-- 對應properties:dubbo.registry.protocol=zookeeper dubbo.registry.address=127.0.0.1:2181--> <dubbo:registry address="zookeeper://localhost:2181"/> <!-- 用dubbo協(xié)議在20880端口暴露服務 --> <!-- 對應properties:dubbo.protocol.name=dubbo dubbo.protocol.port=20880--> <dubbo:protocol name="dubbo" port="20881" /> <!--使用 dubbo 協(xié)議實現(xiàn)定義好的 com.liuzeyu.service.UserService 接口--> <!-- 對應@Component @Service注入UserServiceImpl--> <dubbo:service interface="com.liuzeyu.service.OrderService" ref="orderService" protocol="dubbo" /> <!--具體實現(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"> <!--定義了提供方應用信息,用于計算依賴關系;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字,方便辨識--> <!-- 對應properties:dubbo.application.name=user-service-provider--> <dubbo:application name="user-service-provider" owner="lzy" organization="hgfzp"/> <!--使用 zookeeper 注冊中心暴露服務,注意要先開啟 zookeeper--> <!-- 對應properties:dubbo.registry.protocol=zookeeper dubbo.registry.address=127.0.0.1:2181--> <dubbo:registry address="zookeeper://localhost:2181"/> <!-- 用dubbo協(xié)議在20880端口暴露服務 --> <!-- 對應properties:dubbo.protocol.name=dubbo dubbo.protocol.port=20880--> <dubbo:protocol name="dubbo" port="20880" /> <!--使用 dubbo 協(xié)議實現(xiàn)定義好的 com.liuzeyu.service.UserService 接口--> <!-- 對應@Component @Service注入UserServiceImpl--> <dubbo:service interface="com.liuzeyu.service.UserService" ref="userService" protocol="dubbo" /> <!--具體實現(xiàn)該接口的 bean--> <bean id="userService" class="com.liuzeyu.service.impl.UserServiceImpl"/> <dubbo:monitor protocol="registry"/> </beans>
如需要啟動測試記住需要注釋掉之前加在接口實現(xiàn)類上面的服務暴露配置
OrderServiceImpl:
UserServiceImpl:
7.2 配置類整合
通過配置自定義配置類注入配置信息
OrderConfig.java 服務提供者使用
@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); //配置每一個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 服務提供者使用
@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); //配置每一個Method信息 List<MethodConfig> methodConfigs = new ArrayList<>(); MethodConfig methodConfig = new MethodConfig(); methodConfig.setId("orderService"); methodConfig.setName("initOrder"); methodConfigs.add(methodConfig); serviceConfig.setMethods(methodConfigs); return serviceConfig; } }
使用配置類需要注意兩點
需要指定dubbo配置類的包掃描路徑,啟動類上配置 @EnableDubbo(scanBasePackages = "com.liuzeyu")
需要將接口實現(xiàn)暴露出來
OrderServiceImpl
UserServiceImpl
兩種方案的配置文件整合同樣可以實現(xiàn)RPC通信,可自行測試!
到此這篇關于IDEA整合Dubbo+Zookeeper+SpringBoot實現(xiàn)的文章就介紹到這了,更多相關IDEA Dubbo Zookeeper SpringBoot內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Springboot 整合 Dubbo/ZooKeeper 實現(xiàn) SOA 案例解析
- SpringBoot整合Dubbo+Zookeeper實現(xiàn)RPC調用
- springBoot+dubbo+zookeeper實現(xiàn)分布式開發(fā)應用的項目實踐
- springboot+dubbo+zookeeper的簡單實例詳解
- SpringBoot+Dubbo+Zookeeper實現(xiàn)簡單分布式開發(fā)的應用詳解
- SpringBoot中dubbo+zookeeper實現(xiàn)分布式開發(fā)的應用詳解
- SpringBoot+Dubbo+Zookeeper知識整合過程詳解
相關文章
MybatisPlus實現(xiàn)insertBatchSomeColumn進行批量增加
本文主要介紹了MybatisPlus實現(xiàn)insertBatchSomeColumn進行批量增加,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03