Spring Cloud Alibaba 实操 (十二) 集成dubbo

简介: 集成dubbo

1.概述

在之前 《什么是 Spring Cloud Alibaba》一文中我们有介绍过Dubbo,除了SpringCloud以外,Dubbo它也是用来作为微服务架构落地的成熟解决方案,并且它在服务通信上比SpringCloud性能更高,这取决于它的底层实现是基于原生的TCP协议,它的定位就是一款高性能的RPC(远程过程调用)框架,所以在国内很多的企业都选择Dubbo作为微服务框架,本文章的目的是帮助同学们将Dubbo这款高性能的RPC框架集成到SpringCloud中,真正实现SpringCloud 和 Dubbo的混用。

2.项目结构准备

我们采用多模块的方式来样式该案例,这里的工程分为一个父工程,一个提供者服务,一个消费者服务,一个公共的API模块,如下:

spring-cloud-alibaba
  springcloudalibaba-dubbo-api
  springcloudalibaba-dubbo-consumer-1080
  springcloudalibaba-dubbo-server-1070

注意:这里的 springcloudalibaba-dubbo-api模块是把公共的API接口进行抽取,如下图:
image.png

这里我们案例的流程是:消费者服务向提供者服务发起调用,提供者服务需要提供并返回数据,消费者获取到数据进行消费

3. API接口

这里我们 修改:springcloudalibaba-dubbo-api , 创建一个接口

//用户的API接口
public interface UserService {
   
   
    String getUserInfo(Long id);
}

注意:这个接口是公用的,消费者和提供者都会用到,所以消费者和提供者都需要依赖这个模块,请看后续....

4.提供者服务

4.1.导入依赖

修改 springcloudalibaba-dubbo-provider-1070 ,导入依赖,
这里提供者服务依赖了 dubbo-api 接口模块,导入了dubbo的依赖以及nacos服务发现的依赖如下:

<dependencies>
    <!-- 第一步中构建的API包 -->
    <dependency>
      <groupId>org.example</groupId>
      <artifactId>springcloudalibaba-dubbo-api</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--    监控的依赖-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
<!--    整合dubbo-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>
        <!--   nacos服务发现-->
    <dependency>
      <groupId>com.alibaba.cloud </groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
  </dependencies>

4.2.主启动类

这里启用了服务发现功能

/**
 *主程序启动类
 */
@SpringBootApplication
@EnableDiscoveryClient  //开启服务发现客户端
public class DubboProviderApplication1070
{
   
   
    public static void main( String[] args )
    {
   
   
        SpringApplication.run(DubboProviderApplication1070.class);
    }
}

4.3.接口实现

该实现是提供者服务的具体服务的实现,在这里去实现 UserService 接口,返回相关的数据,消费者调用提供者的时候就是调用的该实现,---- 我们可以简单的理解为这里暴露了一个服务准备让消费者去调用。

//用户的API接口实现
//@Service : dubbo的注解 , 通过该注解把api发布出去
@org.apache.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {
   
   
    @Override
    public String getUserInfo(Long id) {
   
   
        return "成功获取到用户信息";
    }
}

需要注意的是,这里使用的是 dubbo的@Service注解,意思是发布一个远程服务

4.4.yml配置文件

spring:
  application:
    name: dubbo-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos注册中心
  main:
    allow-bean-definition-overriding: true #设置是否覆盖Bean定义 ,防止bean的重复定义而报错
server:
  port: 1070
dubbo:
  scan:
    base-packages: org.example.service #dubbo 的api实现类扫描包
  protocol:
    name: dubbo #通信协议:dubbo
    port: 20880 #dubbo通信端口
  registry:
    address: spring-cloud://localhost #注册中心地址,使用springcloud的注册中心

这里配置了 nacos.discovery 注册中心地址 , dubbo.scan 这里指向的是接口实现类所在的包,protocol 协议名字指定的是 dubbo,端口 20880 ,通过 dubbo.registry.address=spring-cloud 来指定使用SpringCloud的注册中心

到这里我们的服务提供者告一段落,就是简单的配置了一个用户服务实现,通过Dubbo暴露出去,接下来我们来配置消费者服务

5.消费者服务

5.1.导入依赖

修改 springcloudalibaba-dubbo-consumer-1080 ,导入依赖,消费者的依赖和提供者的依赖差不多,都需要公共的dubbo-api模块,以及dubbo的依赖和服务发现的依赖

<dependencies>
    <!-- 第一步中构建的API包 -->
    <dependency>
      <groupId>org.example</groupId>
      <artifactId>springcloudalibaba-dubbo-api</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--    整合dubbo-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba.cloud </groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
  </dependencies>

5.2.主启动类

/**
 *主程序启动类
 */
@SpringBootApplication
@EnableDiscoveryClient  //开启服务发现客户端
public class DubboConsumerApplication1080
{
   
   
    public static void main( String[] args )
    {
   
   
        SpringApplication.run(DubboConsumerApplication1080.class);
    }
}

5.3.控制器

编写一个测试的控制器

@RestController
public class UserController {
   
   

    @org.apache.dubbo.config.annotation.Reference
    private UserService userService ;

    @GetMapping("/userinfo/{id}")
    public String getUserInfo(@PathVariable("id")Long id){
   
   
        return userService.getUserInfo(id);
    }
}

这里通过 userService.getUserInfo 实现远程服务的调用,感觉在调用本地Service,其实不是,在UserService上使用的是@Reference标签而不是@Autowired 自动注入,通过@Reference标签,Dubbo会自动代理UserServcie,实现服务的远程调用,所以这里其实调用的是提供者服务的UserService实现。

5.4.yml配置

spring:
  application:
    name: dubbo-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos注册中心
  main:
    allow-bean-definition-overriding: true #设置是否覆盖Bean定义 ,防止bean的重复定义而报错
server:
  port: 1080
dubbo:
  scan:
    base-packages: org.example.service #dubbo 的api实现类扫描包
  protocol:
    name: dubbo #通信协议:dubbo
    port: 20881 #dubbo通信端口
  registry:
    address: spring-cloud://localhost #注册中心地址,使用springcloud的注册中心
  cloud:
    subscribed-services: dubbo-provider #订阅的服务,指向提供者的服务名

这里同样使用Nacos作为注册中心,通过dubbo.scan.base-packages配置了dubbo的扫描包,主要是扫描 @Reference注解,通过dubbo.protocol配置了dubbo相关协议,通过dubbo.registry.address配置注册中心地址使用SpringCloud的注册中心。

需要注意的是 这里通过 subscribed-services:订阅了提供者服务,即要向谁发起请求这里就要跟上谁的服务名

6. 测试

依次启动Nacos注册中心,提供者服务,消费者服务,启动 Nacos ,启动 提供者,启动消费者, 浏览器访问 :http://localhost:1080/userinfo/111 ,不出意外应该会返回如下信息:
image.png

这个返回结果是消费者服务从提供者服务那儿获取到的结果并返回给浏览器,说明使用Dubbo实现服务的通信已经搞定了。

7. 总结

我们用一个图来理解一下Dubbo实现远程服务调用过程
image.png

1.首先提供者服务对UserService做了实现,并且通过 @Service发布服务

2.消费者服务在Controller中通过@Reference引入UserService ,该UserServer接口当然也会被代理掉,在调用接口时会向提供者发起远程访问

3.提供者监听到请求,执行相关的业务逻辑,并返回数据

4.消费者获取到结果,最终把数据展示到浏览器上

有兴趣的小伙伴可以去了解一下Dubbo的底层工作机制哟....

目录
相关文章
|
2月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
3月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
114 1
|
28天前
|
IDE API 开发工具
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
Alibaba Cloud API Toolkit for VSCode 是集成了 OpenAPI 开发者门户多项功能的 VSCode 插件,开发者可以通过这个插件方便地查找API文档、进行API调试、插入SDK代码,并配置基础环境设置。我们的目标是缩短开发者在门户和IDE之间的频繁切换,实现API信息和开发流程的无缝结合,让开发者的工作变得更加高效和紧密。
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
|
28天前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
107 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
15天前
|
消息中间件 自然语言处理 Java
知识科普:Spring Cloud Alibaba基本介绍
知识科普:Spring Cloud Alibaba基本介绍
47 2
|
23天前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
人工智能 前端开发 Java
Spring Cloud Alibaba AI,阿里AI这不得玩一下
🏀闪亮主角: 大家好,我是JavaDog程序狗。今天分享Spring Cloud Alibaba AI,基于Spring AI并提供阿里云通义大模型的Java AI应用。本狗用SpringBoot+uniapp+uview2对接Spring Cloud Alibaba AI,带你打造聊天小AI。 📘故事背景: 🎁获取源码: 关注公众号“JavaDog程序狗”,发送“alibaba-ai”即可获取源码。 🎯主要目标:
70 0
|
3月前
|
人工智能 前端开发 Java
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
本文介绍了如何使用 **Spring Cloud Alibaba AI** 构建基于 Spring Boot 和 uni-app 的聊天机器人应用。主要内容包括:Spring Cloud Alibaba AI 的概念与功能,使用前的准备工作(如 JDK 17+、Spring Boot 3.0+ 及通义 API-KEY),详细实操步骤(涵盖前后端开发工具、组件选择、功能分析及关键代码示例)。最终展示了如何成功实现具备基本聊天功能的 AI 应用,帮助读者快速搭建智能聊天系统并探索更多高级功能。
1255 2
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
|
3月前
|
Java Spring
【Azure 事件中心】Spring Boot 集成 Event Hub(azure-spring-cloud-stream-binder-eventhubs)指定Partition Key有异常消息
【Azure 事件中心】Spring Boot 集成 Event Hub(azure-spring-cloud-stream-binder-eventhubs)指定Partition Key有异常消息
|
3月前
|
Dubbo Java 调度
揭秘!Spring Cloud Alibaba的超级力量——如何轻松驾驭分布式定时任务调度?
【8月更文挑战第20天】在现代微服务架构中,Spring Cloud Alibaba通过集成分布式定时任务调度功能解决了一致性和可靠性挑战。它利用TimerX实现任务的分布式编排与调度,并通过`@SchedulerLock`确保任务不被重复执行。示例代码展示了如何配置定时任务及其分布式锁,以实现每5秒仅由一个节点执行任务,适合构建高可用的微服务系统。
66 0
下一篇
无影云桌面