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注解。
如该篇博文讲述的那样,使用注解和application.properties,无dubbo额外配置文件。
但是此种方式有个弊端,无法在方法级别进行详细控制,如下所示:
对于dubbo:service
标签,dubbo同样提供了com.alibaba.dubbo.config.annotation.Service;
注解暴露服务,还可以在该注解上面详细配置属性。
但是没有提供dubbo:method
标签的对应注解。
在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管理后台:
同理,消费者也可以如此配置。
这里需要参考官方文档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;
}
//
@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(20882);
return protocolConfig;
}
/**
*
*/
@Bean
public ServiceConfig userServiceConfig(UserService userService){
ServiceConfig 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 methods = new ArrayList<>();
methods.add(methodConfig);
serviceConfig.setMethods(methods);
return serviceConfig;
}
//
@Bean
public ProviderConfig providerConfig() {
ProviderConfig providerConfig = new ProviderConfig();
providerConfig.setTimeout(5000);
return providerConfig;
}
//
@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;
}
//
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress("127.0.0.1:2181");
return registryConfig;
}
/**
*
*/
@Bean
public ReferenceConfig userReferenceConfig(){
ReferenceConfig 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 methods = new ArrayList<>();
methods.add(methodConfig);
serviceConfig.setMethods(methods);
return serviceConfig;
}
//
@Bean
public ConsumerConfig consumerConfig() {
ConsumerConfig consumerConfig = new ConsumerConfig();
consumerConfig.setCheck(false);;
consumerConfig.setTimeout(5000);
return consumerConfig;
}
//
@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入门基础实践;