SpringBoot与Dubbo整合的几种方式

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 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地址:点击下载


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
7月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
1月前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
42 1
|
2月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
136 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
4月前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
106 0
|
6月前
|
Dubbo Java 应用服务中间件
Spring Boot 调用 Dubbo 接口与编写 Dubbo 接口实战
Spring Boot 调用 Dubbo 接口与编写 Dubbo 接口实战
692 1
|
5月前
|
消息中间件 Java 数据库连接
理解java的springboot+mybatisplus+dubbo+nacos+kafka这一套技术栈
理解java的springboot+mybatisplus+dubbo+nacos+kafka这一套技术栈
103 0
|
7月前
|
SQL 监控 Java
nacos常见问题之dubbo+nacos+springboot3的native打包成功后运行出现异常如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
391 2
|
7月前
|
Dubbo Java 应用服务中间件
Spring Boot整合Dubbo+Zookeeper实现RPC调用
Spring Boot整合Dubbo+Zookeeper实现RPC调用 技术栈说明 Dubbo:Dubbo作为RPC框架,能在多个服务之间实现远程服务的调用。比如有两个独立的微服务A和B,A服务想要调用B服务时,因为两者不在同个内存空间中,不能直接调用,所以可以通过Dubbo实现这点。 功能和Spring Cloud的Feign相同,两者都是应用于微服务架构的远程调用框架 Zookeeper:作为注册中心去管理Dubbo服务,这点和Eureka、Nacos相同。 概述 通过一个示例说明Dubbo+Zookeeper在Spring Boot中的应用。 现有两个服务provider和con
188 4
|
2月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
68 2
|
4月前
|
Dubbo Java 应用服务中间件
💥Spring Cloud Dubbo火爆来袭!微服务通信的终极利器,你知道它有多强大吗?🔥
【8月更文挑战第29天】随着信息技术的发展,微服务架构成为企业应用开发的主流模式,而高效的微服务通信至关重要。Spring Cloud Dubbo通过整合Dubbo与Spring Cloud的优势,提供高性能RPC通信及丰富的生态支持,包括服务注册与发现、负载均衡和容错机制等,简化了服务调用管理并支持多种通信协议,提升了系统的可伸缩性和稳定性,成为微服务通信领域的优选方案。开发者仅需关注业务逻辑,而无需过多关心底层通信细节,使得Spring Cloud Dubbo在未来微服务开发中将更加受到青睐。
88 0