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地址:点击下载。