- 作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者!
- 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客
- 当前专栏:Dubbo3应用专栏_Aomsir的博客-CSDN博客
参考文献
前言
前文中,我们使用了Spring配置文件
来整合Dubbo进行直连开发,这让我们更直观地了解了Dubbo的RPC调用方式
,摘掉它神秘的面纱,也为后面引入注册中心开发埋下伏笔,而不是只知道打个注解就能进行开发,出现问题不知如何解决。然而,在当今的主流开发中,我们通常使用Spring Boot作为脚手架来构建应用程序,这带来了更多便捷性和自动化特性。不再需要繁琐的配置,只需添加一些注解就能够使用Dubbo了。
接下来,我将详细讨论如何使用Spring Boot来整合Dubbo进行开发,让你能够更轻松地构建分布式系统。
整合分析
在直连开发初探中使用Spring配置文件开发,无论是服务提供端还是服务消费方都有很多的共有配置,比如应用名、端口、使用的协议等,现在我们可以将这些信息配置信息迁移到application.yml中
此外,还有个性化配置方面的考虑。在使用Spring配置文件的情况下,对于服务提供方,我们需要将具体的服务注册到Spring容器中,然后Dubbo将这个服务进行发布。这意味着对于每个服务,我们需要编写两个标签,这样的配置显得相当繁琐。对于服务消费方来说,我们需要使用Dubbo的标签来书写远程调用的地址,而这段地址中又包含了很多冗余信息。
然而,在引入Spring Boot
之后,我们可以使用注解来实现这些功能,使开发变得更加快捷。对于服务提供方,我们可以使用注解将服务发布到Spring容器中,而不必手动编写XML配置。对于服务消费方,Spring Boot能够自动处理远程调用的配置,无需显式指定冗余信息,让代码更加清晰简洁。这种方式大大简化了开发过程,减少了冗余代码的编写,提高了开发效率。
整合编码
在整合Spring Boot 方面,关于 api 模块
的配置不需要进行冗述,我们将继续使用之前的模块结构。接下来,对于 provider端
和 consumer端
,我们需要引入 dubbo-spring-boot-starter
依赖。
这个依赖是整合Dubbo和Spring Boot的关键,它提供了Dubbo所需的自动配置,使得Dubbo的集成变得轻松且高效。通过引入 dubbo-spring-boot-starter,我们能够借助Spring Boot的自动化特性来简化Dubbo服务提供方和服务消费方的配置,从而更加专注于业务逻辑的开发
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
Provider端
引入了dubbo-spring-boot-starter
依赖后,provider端的开发步骤变得简化明了。下面是具体的开发步骤
- 实现API模块中提供的服务接口,并在实现类上标注
@DubboService 注解
- 在启动类上添加
@EnableDubbo 注解
,以启用Dubbo的自动配置功能 - 编写
application.yml
配置文件,配置Dubbo的相关属性
// 服务实现类,加@DubboService注解
@DubboService
public class UserServiceImpl implements UserService{
// SpringBoot启动类,加@EnableDubbo注解
@SpringBootApplication
@EnableDubbo
public class Dubbo04BootProviderApplication {
#application也可以使用dubbo.allication.name
spring:
application:
name: DUBBO-04-BOOT-PROVIDER
dubbo:
protocol:
name: dubbo
port: -1
Consumer端
在引入了dubbo-spring-boot-starter
依赖后,consumer端的开发也变得相当简单。以下是具体的开发步骤
- 编写
application.yml
配置文件,用于配置Dubbo的相关属性 - 使用
@DubboReference注解
来获取远程服务的Stub对象 - 编写测试方法进行测试(同时也需要编写一个启动类)
spring:
application:
name: DUBBO-05-BOOT-CONSUMER
dubbo:
application:
qos-enable: false
@SpringBootTest
class Dubbo05BootConsumerApplicationTests {
// 填写远程调用的地址
@DubboReference(url = "dubbo://192.168.1.149:20880/com.aomsir.service.UserService?serialization=kryo")
private UserService userService;
@Test
void test1() {
this.userService.login("Aomsir", "123456");
}
}
注解分析
@EnableDubbo
@EnableDubbo注解
用于扫描当前包及其子包目录下标注了 @DubboService注解
的实现类,然后将这些实现类进行注册并发布为Dubbo服务。如果你需要指定特定的包路径进行扫描,可以使用 @DubboComponentScan注解
来指定扫描路径
这种自动扫描和注册的方式让Dubbo的服务提供方配置变得更加简单,无需手动编写繁琐的XML配置文件。通过这种方式,你只需关注业务实现类的编写,Dubbo会自动识别和发布这些服务,从而减少了开发工作的复杂性和重复性。这是Spring Boot和Dubbo集成的便捷之处
@DubboService
@DubboService注解
应该添加在服务接口的实现类上,当使用了这个注解后,Spring会将该实现类注入到容器中,并同时将这个实现类发布为Dubbo服务。可以说,@DubboService注解
的作用相当于 @Component
、@Service
、以及 @Bean
这三个注解的综合作用
通过使用 @DubboService注解
,你不仅告诉Spring容器将这个实现类纳入扫描和管理的范围,还通知Dubbo框架将这个实现类作为一个可用的远程服务发布,以便其他模块或服务可以远程调用它。这种综合作用使得Dubbo服务提供方的配置和发布变得非常便捷,减少了开发工作的复杂性
@DubboReference
@DubboReference注解
通常用于消费者端,它的作用是在消费者端创建远程服务的代理对象。通过这个代理对象,我们可以在程序中发起RPC(远程过程调用)调用,调用远程提供者的服务
当使用 @DubboReference 注解标注在某个字段或方法上时,Spring Boot会自动为该字段或方法生成一个代理对象,该代理对象实际上负责与远程Dubbo服务进行通信,将方法调用转发给远程提供者,然后将结果返回给调用方。这个过程对于消费者来说是透明的,因此消费者可以像调用本地服务一样方便地调用远程Dubbo服务
通过@DubboReference注解
,我们可以轻松地实现分布式系统中的服务调用,无需关心底层的网络通信细节,从而简化了消费者端的开发工作。这种注解是Dubbo和Spring Boot集成的关键之一,使得开发分布式应用变得更加容易