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入门基础实践

<p style="color:#172B4D;"> Spring Boot使用“习惯优于配置”理念让我们项目快速运行起来,我们可以不用或者只需要很少配置就能创建一个独立运行、准生产级别基于Spring框架项目。 </p> <p style="color:#172B4D;"> <br /> 我们不禁要问,这么一个优秀框架,是不是在企业开发中就已经足够了,如果是,那么为什么像BAT这些大公司还要研发自己交易框架,当然这里面除了核心技术之外,还有两个比较重要原因:<br /> 第一:像Spring ,Spring Boot这些开源框架固然很优秀,但却不满足这些大公司对框架功能要求,如spring scheduler就没有分布式调度能力,阿里研发了自己tbschedule,以及后来schedulerx;<br /> 第二:开源框架可以解决具体领域问题,比如持久化框架Mybatis,RPC框架Dubbo,但是面对业务流程开发却不是它强项,以此就诞生了SSM,以及后来Spring MVC。<br /><br /> 放眼整个java开源世界,不管是功能问题还是业务流程开发问题都有对应框架和组件能满足我们需求,只要我们视野足够开阔,能有效整合开源组件,足以应付日常开发。当然我们很难写出像Spring、Spring Boot、Mybatis这些优秀框架,但是我们可以在这个基础之上,进行整合,甚至二次开发,形成公司自己功能组件或者交易开发框架。<br /><br /> 不客气说,开源框架底层少不了spring身影,那么可以肯定在Spring Boot推出以后,开源框架势必会以Spring Boot作为底层平台进行二次改造,这是趋势,也是必然。本课程顺应潮流,以Spring Boot作为基础平台,充分发挥其特性,抽象业务流程,整合开源组件,降低开发难度,打造出一个功能强大交易开发框架,简洁,优雅,好用。<br /><br /> 本课程有如下技术特色:<br /> 第一:充分使用Spring Boot自动装配、条件注解,以及各种使用技巧;<br /> 第二:使用注解@Transaction抽象业务流程,简化交易定义和执行方式,比SpringMVC更符合业务流程开发(当然SpringMVC很强大,无贬低之意)<br /> 第三:为使交易具备RPC能力,使用泛化方式集成Dubbo,其好处是服务端不再需要提供接口给客户端使用,简单、高效;<br /> 第四:使用nacos作为服务注册中心,也支持zookeeper;<br /> 第五:为使交易具备Http能力,在Spring MVC基础上提供HandlerMapping、HandlerAdapter。<br /> 。。。<br /> 一切尽在代码中<br /></p>
相关推荐
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页