SpringBoot系列之集成Dubbo的方式
- 2020 年 1 月 13 日
- 筆記
SpringBoot系列之集成Dubbo的方式
本部落格介紹Springboot框架集成Dubbo實現微服務的3種常用方式,對於Dubbo知識不是很熟悉的,請先學習我上一篇部落格:SpringBoot系列之集成Dubbo實現微服務教程,本部落格只是對上篇部落格的補充,上篇部落格已經介紹過的就不重複介紹
還是使用上篇部落格的例子,業務場景:
某個電商系統,訂單服務需要調用用戶服務獲取某個用戶的所有地址; 我們現在 需要創建兩個服務模組進行測試
模組 |
功能 |
---|---|
訂單服務模組 |
創建訂單等 |
用戶服務模組 |
查詢用戶地址等 |
- 測試預期結果: 訂單服務web模組在A伺服器,用戶服務模組在B伺服器,A可以遠程調用B的功能
例子具體細節,請參考SpringBoot系列之集成Dubbo實現微服務教程,然後所謂的方式不同,其實主要就是對於配置文件使用的不同,按照這種差異,進行分類描述:
- application.properties方式 這種方式,同樣需要導入dubbo-starter,然後配置application即可
比如我的服務端配置:
#server.port=7010 dubbo.application.name=user-service-provider dubbo.registry.address=127.0.0.1:2181 dubbo.registry.protocol=zookeeper dubbo.protocol.name=dubbo dubbo.protocol.port=20882 dubbo.monitor.protocol=registry #dubbo.scan.base-packages=com.example.springboot.dubbo
然後對於暴露服務和引用服務,還是使用@Service【暴露服務】使用@Reference【引用服務】
- xml配置文件方式 在Springboot官方建議的還是使用application或者其它方式,不過只是建議,Springboot還是可以支援xml的
以服務提供者配置為例,新建一個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://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"> <!-- 1、指定當前服務/應用的名字(同樣的服務名字相同,不要和別的服務同名) --> <dubbo:application name="user-service-provider"></dubbo:application> <!-- 2、指定註冊中心的位置 --> <!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry> <!-- 3、指定通訊規則(通訊協議 通訊埠) --> <dubbo:protocol name="dubbo" port="20882"></dubbo:protocol> <!-- 4、暴露服務 ref:指向服務的真正的實現對象 --> <dubbo:service interface="com.test.dubbo.service.UserService" ref="userServiceImpl01" timeout="1000" version="1.0.0"> <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> </dubbo:service> <!--統一設置服務提供方的規則 --> <dubbo:provider timeout="1000"></dubbo:provider> <!-- 服務的實現 --> <bean id="userServiceImpl01" class="com.test.dubbo.service.impl.UserServiceImpl"></bean> <!-- 連接監控中心 --> <dubbo:monitor protocol="registry"></dubbo:monitor> </beans>
然後在application類或者其它自定義配置類里引用@ImportResource(locations="classpath:provider.xml")
對於xml方式進行使用的,可以參考我之前部落格:Dubbo系列之服務註冊與發現
- 全註解API的方式 接著介紹全註解方式來實現,也即不使用application進行配置,也不使用xml配置文件,然後一些自定義配置總是要,那要怎麼實現?這裡可以通過寫一個Config類來實現
package com.example.springboot.dubbo.service.impl; import org.apache.dubbo.config.*; import com.example.spring.dubbo.service.UserService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; @Configuration public class MyDubboConfig { @Bean public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("user-service-provider"); return applicationConfig; } //<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry> @Bean public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setProtocol("zookeeper"); registryConfig.setAddress("127.0.0.1:2181"); return registryConfig; } //<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol> @Bean public ProtocolConfig protocolConfig() { ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName("dubbo"); protocolConfig.setPort(20882); return protocolConfig; } /** *<dubbo:service interface="com.test.dubbo.service.UserService" ref="userServiceImpl01" timeout="1000" version="1.0.0"> <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> </dubbo:service> */ @Bean public ServiceConfig<UserService> userServiceConfig(UserService userService){ ServiceConfig<UserService> serviceConfig = new ServiceConfig<>(); serviceConfig.setInterface(UserService.class); serviceConfig.setRef(userService); serviceConfig.setVersion("1.0.0"); //配置每一個method的資訊 MethodConfig methodConfig = new MethodConfig(); methodConfig.setName("getUserAddressList"); methodConfig.setTimeout(1000); //將method的設置關聯到service配置中 List<MethodConfig> methods = new ArrayList<>(); methods.add(methodConfig); serviceConfig.setMethods(methods); return serviceConfig; } /** * <dubbo:provider timeout="1000"></dubbo:provider> */ @Bean public ProviderConfig providerConfig(){ ProviderConfig providerConfig = new ProviderConfig(); providerConfig.setTimeout(1000); return providerConfig; } /** * <dubbo:monitor protocol="registry"></dubbo:monitor> */ @Bean public MonitorConfig monitorConfig(){ MonitorConfig monitorConfig = new MonitorConfig(); monitorConfig.setProtocol("registry"); return monitorConfig; } }
每一個組件手動創建到容器中,讓dubbo來掃描其他的組件