SpringBoot與Dubbo整合的幾種方式
SpringBoot與Dubbo整合有幾種方式,通常需要根據專案實際情況來進行選擇。
SpringBoot與dubbo整合的三種方式:
1)匯入dubbo-starter,在application.properties配置屬性,使用@Service【暴露服務】使用@Reference【引用服務】,使用@EnableDubbo註解。
2)保留dubbo xml配置檔案,匯入dubbo-starter,使用@ImportResource匯入dubbo的配置檔案即可。不再使用@Service【暴露服務】使用@Reference【引用服務】,不使用@EnableDubbo註解。
3)使用註解API的方式,將每一個元件手動建立到容器中,讓dubbo來掃描其他的元件,使用@Service【暴露服務】使用@Reference【引用服務】,使用@EnableDubbo註解。
【1】第一種方式-無dubbo配置檔案
如該篇博文講述的那樣,使用註解和application.properties,無dubbo額外配置檔案。
但是此種方式有個弊端,無法在方法級別進行詳細控制,如下所示:
<dubbo:service interface="com.web.gmall.service.UserService" ref="userServiceImpl1" timeout="1000" version="1.0.0" stub="com.web.gmall.service.stub.UserServiceStub"> <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> </dubbo:service>
對於dubbo:service標籤,dubbo同樣提供了com.alibaba.dubbo.config.annotation.Service;註解暴露服務,還可以在該註解上面詳細配置屬性。
但是沒有提供dubbo:method標籤的對應註解。
【2】第二種-引入dubbo配置檔案
在SpringBoot配置檔案一文第【11】項提到了使用@ImportResource註解匯入Spring的配置檔案。這裡我們就可以採用該中方式,將dubbo的xml配置檔案引入進來,取消application.properties中的dubbo配置和相關注解。
示意圖如下:
如下所示,修改主類:
//@EnableDubbo//開啟基於註解的dubbo功能
@ImportResource(value={"classpath:provider.xml"})
@SpringBootApplication
public class BootUserServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(BootUserServiceProviderApplication.class, args);
}
}
另外去掉UserServiceImpl上面的dubbo的service註解。
註釋掉application.properties中的dubbo配置:
#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=20881
#
#dubbo.monitor.protocol=registry
#dubbo.scan.base-packages=com.web.gmall
啟動專案,檢視Admin管理後臺:
同理,消費者也可以如此配置。
【3】第三種-使用註解API方式-推薦
這裡需要參考官方文件API配置和註解配置將xml裡面的東西編寫為API程式碼再使用註解註冊到容器中。
如下圖所示,標明瞭標籤和配置類對應關係:
provider 配置例項
package com.web.gmall.config;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.MethodConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import com.web.gmall.service.UserService;
@Configuration
public class MyDubboConfig {
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("boot-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.atguigu.gmall.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(5000);
return providerConfig;
}
// <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor>
@Bean
public MonitorConfig monitorConfig() {
MonitorConfig monitorConfig = new MonitorConfig();
monitorConfig.setAddress("127.0.0.1:7070");
monitorConfig.setProtocol("registry");
return monitorConfig;
}
consumer配置例項
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.MethodConfig;
import com.alibaba.dubbo.config.MonitorConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.web.gmall.service.UserService;
@Configuration
public class MyDubboConfig {
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("boot-order-service-consumer");
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:reference interface="com.web.gmall.service.UserService"
id="userService" timeout="5000" retries="3" version="*">
<dubbo:method name="getUserAddressList" timeout="1000" retries="0"></dubbo:method>
</dubbo:reference>
*/
@Bean
public ReferenceConfig<UserService> userReferenceConfig(){
ReferenceConfig<UserService> serviceConfig = new ReferenceConfig<>();
serviceConfig.setInterface(UserService.class);
serviceConfig.setTimeout(5000);
serviceConfig.setVersion("*");
serviceConfig.setRetries(3);
//配置每一個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:consumer check="false" timeout="5000"></dubbo:consumer>
@Bean
public ConsumerConfig consumerConfig() {
ConsumerConfig consumerConfig = new ConsumerConfig();
consumerConfig.setCheck(false);;
consumerConfig.setTimeout(5000);
return consumerConfig;
}
// <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor>
@Bean
public MonitorConfig monitorConfig() {
MonitorConfig monitorConfig = new MonitorConfig();
monitorConfig.setAddress("127.0.0.1:7070");
monitorConfig.setProtocol("registry");
return monitorConfig;
}
}
專案GitHub地址:點選下載。
參考博文:
SpringBoot整合Dubbo和Zookeeper升級版;
分散式簡單入門與SpringBoot整合Dubbo和Zookeeper;
分散式架構與Dubbo入門基礎實踐;