Dubbo知识【高级特性】

news2024/11/25 23:48:37

目录

1:Dubbo高级特性

1.1:超时与重试

什么是超时? 

什么是重试?

 如何配置超时与重试:

1.2:启动检查

1.3:多版本

1.4:负载均衡

1.5:序列化

1.6:地址缓存

1.7:集群容错

1.8:服务降级


1:Dubbo高级特性

Dubbo的特性有很多,这里介绍几个常用的高级特性

1.1:超时与重试

什么是超时? 

  • 服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。

  • 在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩现象。

    • dubbo 利用超时机制来解决这个问题(使用timeout属性配置超时时间,默认值1000,单位毫秒)

    • 若超时时间较短,当网络波动时请求就会失败,Dubbo通过重试机制避免此类问题的发生

超时机制:通过 设置超时时间,如果一个请求超过了设置的请求时间,判定为超时,请求失败,来防止多个请求陷入等待这一现象

什么是重试?

重试机制:如果只用超时机制来处理这种请求阻塞的情况,势必也会出现新的问题,例如:我在宿舍玩着和平精英,网络断了三秒,假如我的提供者游戏板块超时时间一秒,那完了这一次请求失败了,被迫离开了。我们dubbo就想了个办法,我给它搞一个重试机制,我第一次请求网络抖动了超时了,没关系,我可以重试一下问问你好了吗?这边答复ok了,那我继续连接继续完请求成功,如果我两次询问都不好,那就算我连接/请求失败了

注意:默认是重试请求两次,加上第一次请求,总共三次

 如何配置超时与重试:

第一种在消费者或者提供者模块的application.yml文件中进行设置

dubbo:
  registry:
    address: nacos://127.0.0.1:8848
  consumer:
    timeout: 3000
    retries: 0

第二种在消费者模块和提供者模块的相关注解上面添加超时和重试参数

消费者模块调用配置到注册中心的提供者服务的注解上加入:

提供者模块相关注解上加入:  

注意:如果消费者和提供者模块都配置了超时时间,消费者模块的超时时间会覆盖提供者模块的超时时间。

推荐在提供者模块配置超时时间即可。  

1.2:启动检查

  • 为了保障服务的正常可用,Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常

 

  • 在正式环境这是很有必要的一项配置,可以保证整个调用链路的平稳运行

  • 在开发时,往往会存在没有提供者的情况。由于启动检查的原因,可能导致开发测试出现问题

    • 可以通过check=false关闭

  • user-consumer模块中添加配置信息

dubbo:
  registry:
    address: nacos://127.0.0.1:8848
  consumer:
    check: false

 

1.3:多版本

  • 灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。

  • Dubbo提供了提供者多版本的支持,平滑处理项目功能升级部署

  • dubbo中使用version属性来设置和调用同一个接口的不同版本 

(1)user-provider定义新的服务实现类UserServiceImpl2,指定版本

@DubboService(version = “2.0.0”)
public class UserServiceImpl2 implements UserService {
    …………
}

(2)user-consumer消费者调用时,指定版本调用  

@RestController
@RequestMapping("/user")
public class UserController {
    //引用远程服务
    @DubboReference(version = "2.0.0")
    private UserService userService;    
    ………
}

 

1.4:负载均衡

  • 在集群部署时,Dubbo提供了4种负载均衡策略,帮助消费者找到最优提供者并调用

    • Random :按权重随机,默认值。按权重设置随机概率。

    • RoundRobin :按权重轮询

    • LeastActive:最少活跃调用数,相同活跃数的随机。

    • ConsistentHash:一致性 Hash,相同参数的请求总是发到同一提供者。

提供者创建集群配置文件 application-18082.yml  

server:
  port: 18082
spring:
  application:
    name: user-provider
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=false
    username: root
    password: 1234
    driver-class-name: com.mysql.jdbc.Driver
logging:
  level:
    com.czxy: debug
  pattern:
    dateformat: HH:mm:ss:SSS
#配置dubbo提供者
dubbo:
  protocol:
    name: dubbo                           #dubbo协议和访问端口
    port: 20882
  registry:
    address: nacos://127.0.0.1:8848       #注册中心的地址
  scan:
    base-packages: com.czxy.user.service #dubbo注解的包扫描

 在idea中配置多个服务器提供者

  • 消费者,配置负载均衡策略

@RestController
@RequestMapping("/user")
public class UserController {
    //引用远程服务
    @DubboReference(loadbalance = LoadbalanceRules.ROUND_ROBIN)
    private UserService userService;
}

 

  • 观看控制台,可以看到服务提供者依次被调用。如果需要返回不同信息,可以修改服务提供者

//暴露dubbo服务,
@DubboService(version = "1.0.0")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public User queryById(Long id) {
        User user = userMapper.findById(id);
        // 获得dubbo绑定的端口号
        int port = DubboProtocol.getDubboProtocol().getServers().get(0).getRemotingServer().getLocalAddress().getPort();
        user.setUsername(user.getUsername()+"v1.0" + port);
        return user;
    }
}

 

1.5:序列化

两个机器传输数据,如何传输Java对象?

如图:现在用户请求消费者A获取数据,消费者A调用生产者B提供的方法,生产者B中的方法获得User对象数据,返回给消费者A,然后再返回给用户。很完美的一套流程。

 

问题来了,两者之间怎么传输数据呢?就是用序列化呗!首先两个模块之间进行通信,需要建立数据流管道进行传输数据,我们将传输的数据序列化成数据流,在数据流管道上进行传输,传输到消费者A端后再进行反序列化即可。

那怎么实现序列化呢?就是将User对象实现序列化接口implements Serializable。

如图我们也能发现消费者A模块和生产者B模块都需要用到User对象,通过我们会将User对象这个JavaBean抽成一个单独的模块,使消费者A和消费者B都进行Maven依赖这个单独的模块。

可能有人会问,序列化和反序列化操作多麻烦,这个不用担心,我们只需要将JavaBean实现序列化接口即可,我们使用的dubbo框架已经将序列化和反序列化的过程进行封装了。

如果没有实现序列化接口会抛出异常。  

1.6:地址缓存

注册中心挂了,服务是否可以正常访问?

 答案是可以的,因为dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后在调用不会进行访问注册中心

当服务提供者地址发生变化时,注册中心会通知服务消费者!

1.7:集群容错

 

集群容错就是:提供者服务配置在了多个集群上面,当消费者调用提供者服务时,如果这个集群中的提供者服务挂机了没关系,我再进行调用其他集群中的提供者服务即可

消费者调用提供者的注解上进行配置cluster,默认的容错模式是:失败重试

 

 

 

1.8:服务降级

 

什么是服务降级呢?就是说我在B机器上部署了好多个不相同的服务模块,内存已经占用了很高了快崩掉了,那么运营维护人员想了想关闭一些不重要的服务模块,把广告和日志都给停止了,留下了支付服务,这个就称之为服务降级。

dubbo提供了两种不同的降级方式:

在消费者方面配置第一种:mock=force:return null 表示消费者对该服务的方法调用都直接返回null值,不发起远程调用,用来屏蔽不重要服务不可用时对调用方的影响

 在消费者方面配置第二种:mock=fail:return null 表示消费者对服务的方法调用在失败后,再返回null值,不抛异常,用来容忍不重要服务不稳定时对调用方的影响。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/424127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

夜深敲代码——记录一个优化过程

前言 最近一段时间OpenAI的热度一直不减,ChatGpt带来的极大便利性大家也是深有体会。荔枝也跟风搞了一个来玩玩,感觉还是很不错的哈哈哈哈。这不,最近开始刷题用ChatGpt帮忙找bug就很舒服,它甚至可以为我们提供优化的思路&#xf…

git使用手册——简单实用

常见命令 创建仓库 git init初始化仓库git clone拷贝一份远程仓库,也就是下载一个项目。提交与修改 git add添加文件到仓库git status查看仓库当前的状态,显示有变更的文件。git diff比较文件的不同,即暂存区和工作区的差异。git commit提…

RGB与YUV

什么是YUV YUV也叫YCbCr模型,是相对于RGB模型的一种广泛使用的颜色表示模型,YUV格式是1938年由一个法国通信工程师M. Georges Valensi发明的。 YUV中的Y表示亮度luminance,UV表示色度chrominance; 我们知道人眼是个复杂的器官&a…

vue2.x 学习笔记

div标签(HTML) div标签的作用是,设定字、画、表格等的摆放位置。 DIV元素,是用来为HTML文档内大块(block-level)的内容提供结构和背景的元素。 DIV标签,称为区隔标记。 什么是vue vue是响应式…

天猫商品详情数据接口,京东商品详情数据接口,品牌商品数据分析,品牌店铺商品数据分析,监控商品价格销量接口代码封装教程

最近做一个品牌电商公司内部ERP系统分发的采集淘宝、天猫、京东商品详情页API接口的投标工作,集成的接口,其中有一个需求就是监控品牌授权店铺的价格、销量,标题、主图等等,具体需求如下描述:所有授权店铺的公开数据都…

04、SpringBoot运维实用篇

一、配置文件1、临时属性设置目前我们的程序包打好了,可以发布了。但是程序包打好以后,里面的配置都已经是固定的了,比如配置了服务器的端口是8080。如果我要启动项目,发现当前我的服务器上已经有应用启动起来并且占用了8080端口&…

浅谈工厂模式

文章目录01 | 抽象工厂02 | 工厂方法03 | 未完待续创建模式在什么被创建,谁创建它,它是怎么被创建的,以及何时创建这些方面提供了很强的灵活性。通常创建模式允许用结构和功能差别很大的“产品”对象来配置一个系统 01 | 抽象工厂 抽象工厂模…

决策树算法介绍

决策树目录1. 决策树基础1.1 决策树定义1.2 熵以及信息熵介绍2. 决策树的划分依据2.1 信息增益2.1.1信息增益应用举例2.2 信息增益率2.2.1 信息增益率使用举例2.2.2 信息增益率使用举例22.3 基尼值和基尼指数2.3.1 基尼值和基尼指数介绍2.3.2 基尼值和基尼指数实现案例1. 决策树…

e-STUDIO2010AC•2520AC安装步骤

注意!在室内室外温差比较大的情况下,设备需要在室内静置240分钟以上才可以进行安装。

如何训练个人的ChatGpt4

如何在自己的计算机上安装类似 ChatGPT 的个人 AI 并在没有互联网的情况下运行它 个人 AI 的“第一台 PC”时刻 这是个人AI的“第一台PC”时刻,随之而来的是限制,就像在车库里生产第一台Apple 1一样。你是先驱。今天,任何人都可以使用私人和…

一个从培训学校走出来的测试工程师自述....

简单介绍一下我自己,1997年的,毕业一年了,本科生,专业是机械制造及其自动化。 在校度过了四年,毕业,找工作,填三方协议,体检,入职。我觉得我可能就这么度过我平平无奇的…

【LeetCode】剑指 Offer 56. 数组中数字出现的次数 p275 -- Java Version

1. 题目介绍(56. 数组中数字出现的次数) 面试题56.:数组中数字出现的次数, 一共分为两小题: 题目一:数组中只出现一次的两个数字题目二:数组中唯一只出现一次的数字 2. 题目1:数组中…

学术速运|利用深度学习和分子动力学模拟设计抗菌肽

题目: Designing antimicrobial peptides using deep learning and molecular dynamic simulations 文献来源:Briefings in Bioinformatics, 2023, 1–13 代码:https://github.com/gc-js/Antimicrobial-peptide-generation 简介:随着多药耐…

Springboot实现文件断点续传-基于GridFS

Springboot实现文件断点续传-基于GridFS 需求介绍 我们后台是使用GridFS存储文件对象的,之前客户端都是Web浏览器,网络环境相对较为稳定,所以我们直接提供文件下载就行。但最近新增需求需要在移动端进行文件下载,这就有问题了。…

c++函数重载

C函数重载(Function Overloading)是指在同一个作用域,可以定义多个名称相同但参数列表不同的函数。在调用这些同名函数时,编译器根据实参与各个形参的类型、个数或顺序等特征来确定调用哪一个函数。 通过函数重载,我们…

UE4/5多人游戏详解(三、创建会话,委托绑定回调函数)

目录 基础的创建 回调函数绑定到委托: 实现创建会话的函数createGameSession: 回调函数实现判断验证是否成功: 添加会话设置: 测试 基础的创建 [提示:中途如果有无法编译则删除Binaries,saved,Intermediate后重…

倍增?最近公共祖先?——从定义到实现,帮你一步步吃掉它!

倍增?最近公共祖先?——从定义到实现,帮你一步步吃掉它! 一、倍增倍增——翻倍的增长 倍增是一种思想,实际上的操作就是通过不断翻倍来缩短我们的处理时间: 它可以把线性级别的处理优化到指数级。 举个…

5.redis-哨兵模式

01-哨兵模式概述 如果master宕机, 我们该怎么办? ①关闭所有slave②选举新的master, 建立新的主从结构 存在的问题 ①关闭期间, 谁来提供数据服务②选举新master的标准是什么③原来的master恢复了怎么办 哨兵模式 sentinel是一个分布式系统,用于对主从结构中的每…

【多线程】Thread类

1. Java中如何进行多线程编程?线程是操作系统中的概念,操作系统内核实现了线程这样的机制,并且对用户层提供了一些 API 供用户使用(如 Linux 中的 pthread 库)。所以本身关于线程的操作,是依赖操作系统提供的的 API,而…

练习,异常,异常处理,try-catch,throws

package com.jshedu.homework_;/*** author Mr.jia* version 1.0*/ //匿名内部类 public class Homework04 {public static void main(String[] args) {Cellphone cellphone new Cellphone();//1.匿名内部类,同时也是一个对象/*new computer() {Overridepublic dou…