SpringCloudAlibaba微服务架构搭建(六)Dubbo 实战

Dubbo框架简介

  • 背景与发展

    • 背景: Dubbo 是阿里巴巴开源的一个高性能 Java RPC 框架,最早由阿里巴巴公司内部开发并开源,旨在解决分布式系统中服务间的通信问题。Dubbo 通过提供服务注册与发现、负载均衡、集群容错、动态代理等功能,简化了分布式应用的开发和维护。
    • 发展: Dubbo 在开源社区逐渐受到关注,得到了广泛的应用和贡献,成为了一个成熟的微服务框架。然而,由于 Dubbo 的生态系统相对独立,阿里巴巴在内部也积极探索如何更好地构建微服务体系,从而推动了 Spring Cloud Alibaba 的产生。
    • 官网: https://cn.dubbo.apache.org/zh-cn/

    在这里插入图片描述
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/54809058b4e14129afd10abcb8633c96.png

  • 与Spring Cloud的对比

    • 生态系统: Spring Cloud 是由 Spring 社区推出的一套微服务框架,它集成了一系列开源组件,如 Eureka、Ribbon、Feign、Zuul 等,用于构建和管理微服务。Spring Cloud Alibaba 则是在 Spring Cloud 基础上,结合了阿里巴巴的开源组件,如 Nacos、Sentinel、RocketMQ 等,进一步丰富了微服务的生态系统。
    • 通信框架: Spring Cloud 使用的通信框架主要是基于 HTTP 的,如 Feign 进行声明式的 HTTP 客户端调用。而 Dubbo 则是一款 RPC 框架,提供了更高性能的二进制通信方式,适用于需要更高性能和效率的场景。
    • 适用场景: Spring Cloud Alibaba Dubbo 更适合复杂的、大规模的分布式系统,特别是在需要高性能和低延迟的情况下。而 Spring Cloud 则更适用于广泛的微服务架构,特别是在 Spring 生态系统已有基础的情况下。
    • 功能特性: Spring Cloud Alibaba Dubbo 提供了更多与分布式系统相关的功能,如分布式事务(Seata)、流量控制(Sentinel)等。Spring Cloud 则着重于构建整体的微服务架构,提供了服务发现、负载均衡等核心功能。
    • 社区支持: Spring Cloud 由 Spring 社区维护,有着广泛的社区支持和贡献。Spring Cloud Alibaba Dubbo 在阿里巴巴社区的基础上,也受到了一定的支持和贡献,但相对于 Spring Cloud 社区来说规模较小!
      在这里插入图片描述

服务提供者与消费者

  • 定义接口与实现

    服务提供者需要定义服务接口并提供实现,消费者则需要引用服务接口并进行远程调用。

    服务接口定义(provider-api 模块):

    // 示例:com.example.providerapi.UserService
    public interface UserService {
        String getUserInfo(String userId);
    }
    

    服务实现(provider-service 模块):

    // 示例:com.example.providerservice.UserServiceImpl
    @Service
    public class UserServiceImpl implements UserService {
        @Override
        public String getUserInfo(String userId) {
            return "User info for userId: " + userId;
        }
    }
    

    服务提供方配置(provider-service 模块的 application.properties):

    spring.application.name=provider-service
    server.port=8081
    
    # Dubbo 配置
    dubbo.application.name=provider-service
    dubbo.registry.address=nacos://localhost:8848
    dubbo.protocol.name=dubbo
    dubbo.protocol.port=20880
    
    # 扫描服务实现类所在的包路径
    dubbo.scan.base-packages=com.example.providerservice
    
    
  • 消费者的配置与调用

    消费者配置(consumer 模块的 application.properties):

    spring.application.name=consumer
    server.port=8082
    
    # Dubbo 配置
    dubbo.application.name=consumer
    dubbo.registry.address=nacos://localhost:8848
    
    

    消费者代码示例(consumer 模块):

    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Reference
        private UserService userService;
    
        @GetMapping("/{userId}")
        public String getUserInfo(@PathVariable String userId) {
            return userService.getUserInfo(userId);
        }
    }
    

    这里使用了 @Reference 注解来引用服务接口,实现了远程调用。

    以上代码示例为简化的示范,实际项目中需要根据业务需求进行适当的扩展和配置。同时,还需确保 Dubbo 和 Nacos 的依赖已正确添加到项目中。
    在这里插入图片描述

注册中心与负载均衡

  • 注册中心的作用与选择

    ​ 在分布式系统中,注册中心用于服务的注册与发现,以便服务提供者和消费者能够相互找到对方,实现分布式通信。

    常见的注册中心有多种选择,比如 ZooKeeper、Consul 以及 Spring Cloud Alibaba 提供的 Nacos。在 Spring Cloud Alibaba Dubbo 框架中,我们可以使用 Nacos 作为注册中心。

  • 负载均衡策略

    ​ 均衡是将客户端请求分发到多个服务器上,以实现系统的高可用性和性能优化。Spring Cloud Alibaba Dubbo 框架内置了多种负载均衡策略,包括:

    Random Load Balancing(随机负载均衡): 随机选择一个可用的服务提供者来处理请求。

    Round Robin Load Balancing(轮询负载均衡): 按照顺序轮流选择可用的服务提供者。

    Least Active Load Balancing(最少活跃调用数负载均衡): 选择活跃调用数最少的服务提供者。

    Consistent Hash Load Balancing(一致性 Hash 负载均衡): 基于请求参数的 hash 值,将请求路由到指定的服务提供者。

  • 示例与实战演练

    • 1. 注册中心配置:

    服务提供方配置(provider-service 模块的 application.properties):

    # Dubbo 配置
    dubbo.registry.address=nacos://localhost:8848
    

    消费者配置(consumer 模块的 application.properties):

    # Dubbo 配置
    dubbo.registry.address=nacos://localhost:8848
    
    • 2. 负载均衡策略配置:

    服务提供方配置(provider-service 模块的 application.properties):

    # Dubbo 负载均衡策略配置
    dubbo.provider.loadbalance=random
    

    3. 消费者远程调用:

    消费者代码示例(consumer 模块):

    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Reference(loadbalance = "roundrobin")
        private UserService userService;
    
        @GetMapping("/{userId}")
        public String getUserInfo(@PathVariable String userId) {
            return userService.getUserInfo(userId);
        }
    }
    

    这里示范了使用了轮询(Round Robin)负载均衡策略。

    以上示例仅为演示目的,实际应用中需要根据业务需求选择合适的负载均衡策略和注册中心,并进行适当的配置和优化。
    在这里插入图片描述

集群容错与版本控制

  • 集群容错策略

    在分布式系统中,由于网络不稳定、服务故障等原因,服务调用可能会出现失败。为了保障系统的稳定性,Spring Cloud Alibaba Dubbo 框架提供了多种集群容错策略,以处理服务调用失败的情况。

    常见的集群容错策略有:

    1. Failover(故障转移): 当调用失败时,自动切换到另一个可用的服务提供者。
    2. Failfast(快速失败): 一旦调用失败,立即报错,不进行重试。
    3. Failsafe(失败安全): 调用失败时,直接忽略,不报错。
    4. Failback(故障恢复): 调用失败后,记录失败请求,定时重试。
    5. Forking(并行调用): 并行调用多个服务提供者,只要有一个成功即返回。
    6. Broadcast(广播调用): 调用所有服务提供者,忽略调用结果。
  • 服务版本控制

    ​ 服务版本控制是为了在微服务架构中实现平滑升级或回滚,确保不同版本的服务可以共存并进行交互。在 Spring Cloud Alibaba Dubbo 框架中,可以通过版本号来实现服务版本控制。

  • 示例与实战演练

    1. 集群容错策略配置:

    服务提供方配置(provider-service 模块的 application.properties):

    # Dubbo 集群容错策略配置
    dubbo.provider.cluster=failover
    

    2. 服务版本控制:

    在服务接口上添加版本号注解,指定版本号。

    服务接口定义(provider-api 模块):

    // 示例:com.example.providerapi.UserService
    @DubboService(version = "1.0.0")
    public interface UserService {
        String getUserInfo(String userId);
    }
    

    3. 消费者远程调用:

    ​ 在消费者中注入服务接口,并指定调用的版本号。

    消费者代码示例(consumer 模块):

    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Reference(version = "1.0.0")
        private UserService userService;
    
        @GetMapping("/{userId}")
        public String getUserInfo(@PathVariable String userId) {
            return userService.getUserInfo(userId);
        }
    }
    
    

    这里示范了使用了故障转移(Failover)集群容错策略和版本号为 “1.0.0” 的服务版本控制。

Dubbo的动态代理与序列化

  • 动态代理原理

    ​ Dubbo 框架在服务调用过程中使用了动态代理技术。动态代理是一种在运行时生成代理对象的技术,它允许你在不修改源码的情况下,通过代理对象对目标对象进行增强操作,如添加日志、统计信息、性能监控等。

    Dubbo 使用 JDK 动态代理和 CGLIB 动态代理,根据接口是否有实现类来选择动态代理方式。

  • Dubbo的序列化方式

    ​ Dubbo 在服务调用中需要将方法调用参数和返回结果进行序列化和反序列化,以便进行网络传输。Dubbo 支持多种序列化方式,包括 Hessian、Java 默认的序列化、JSON 等。

    不同的序列化方式在性能、字节码体积、跨语言等方面有不同的优势和劣势,可以根据实际需求选择适合的序列化方式。

  • 示例与实战演练

    1. 动态代理示例:

    定义一个服务接口并创建一个实现类,然后在消费者中使用动态代理来调用服务。

    服务接口定义(provider-api 模块):

    // 示例:com.example.providerapi.UserService
    public interface UserService {
        String getUserInfo(String userId);
    }
    

    服务实现(provider-service 模块):

    // 示例:com.example.providerservice.UserServiceImpl
    @Service
    public class UserServiceImpl implements UserService {
        @Override
        public String getUserInfo(String userId) {
            return "User info for userId: " + userId;
        }
    }
    

    消费者远程调用示例(consumer 模块):

    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Reference
        private UserService userService;
    
        @GetMapping("/{userId}")
        public String getUserInfo(@PathVariable String userId) {
            return userService.getUserInfo(userId);
        }
    }
    
    

    2. Dubbo的序列化方式配置:

    在服务提供者和消费者的配置文件中,配置 Dubbo 的序列化方式。

    服务提供方配置(provider-service 模块的 application.properties):

    # Dubbo 序列化方式配置
    dubbo.serialization=hessian2
    
    

    消费者配置(consumer 模块的 application.properties):

    # Dubbo 序列化方式配置
    dubbo.serialization=hessian2
    
    

    以上示例仅为演示目的,实际应用中需要根据业务需求选择合适的序列化方式,并进行适当的配置和优化。

    总之,Spring Cloud Alibaba Dubbo 框架通过使用动态代理技术和提供多种序列化方式,实现了服务调用的动态代理和数据传输功能。

                                    ⏳  名言警句:说会的,说对的
                                    ✨ 原创不易,还希望各位大佬支持一下
                                    👍 点赞,你的认可是我创作的动力!
                                    ⭐️ 收藏,你的青睐是我努力的方向!
                                    ✏️ 评论,你的意见是我进步的财富!
    
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值