Dubbo知识【高级特性】

这篇具有很好参考价值的文章主要介绍了Dubbo知识【高级特性】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1:Dubbo高级特性

1.1:超时与重试

什么是超时? 

什么是重试?

 如何配置超时与重试:

1.2:启动检查

1.3:多版本

1.4:负载均衡

1.5:序列化

1.6:地址缓存

1.7:集群容错

1.8:服务降级


1:Dubbo高级特性

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

1.1:超时与重试

Dubbo知识【高级特性】

什么是超时? 

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

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

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

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

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

什么是重试?

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

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

 如何配置超时与重试:

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

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

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

消费者模块调用配置到注册中心的提供者服务的注解上加入: Dubbo知识【高级特性】

提供者模块相关注解上加入: Dubbo知识【高级特性】 

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

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

1.2:启动检查

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

Dubbo知识【高级特性】

 文章来源地址https://www.toymoban.com/news/detail-413910.html

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

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

    • 可以通过check=false关闭

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

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

 

1.3:多版本

Dubbo知识【高级特性】

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

  • 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知识【高级特性】

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

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

    • RoundRobin :按权重轮询

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

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

提供者创建集群配置文件 application-18082.yml Dubbo知识【高级特性】 

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中配置多个服务器提供者 Dubbo知识【高级特性】

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

@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:序列化

Dubbo知识【高级特性】

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

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

Dubbo知识【高级特性】 

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

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

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

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

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

1.6:地址缓存

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

Dubbo知识【高级特性】

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

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

1.7:集群容错

Dubbo知识【高级特性】

 

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

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

Dubbo知识【高级特性】

 Dubbo知识【高级特性】

 Dubbo知识【高级特性】

 

1.8:服务降级

Dubbo知识【高级特性】

 

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

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

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

Dubbo知识【高级特性】

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

Dubbo知识【高级特性】

 

到了这里,关于Dubbo知识【高级特性】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python-高级特性

    列表生成式就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表的简洁形式, 可快速生成一个新的list。 普通 的语法格式:[exp for iter_var in iterable] 带过滤功能 语法格式: [exp for iter_var in iterable if_exp] 循环嵌套 语法格式: [exp for iter_var_A in iterable_A for it

    2024年02月08日
    浏览(24)
  • React高级特性解析

    react conText 使用API React.createContext 返回的是组件对象 可以利用结构的方式 第一种方式 使用 Provider 包裹的组件都可以获取提供者的 value Context.Consumer 组件里面使用函数 函数返回一个组件 函数的参数为Context初始化的参数 第二种方式 使用Context.Provider包裹所有的组件 在子组件里

    2024年02月09日
    浏览(23)
  • go语言的高级特性

    2024年02月09日
    浏览(35)
  • 【Java高级特性】Socket

    (1)在计算机网络编程技术中, 两个进程或者说两台计算机可以通过一个网络通信连接实现数据的交换,这种通信链路的端点就被称为“套接字”(Socket) 。 (2)Socket是网络驱动层提供给应用程序的一个接口或者说一种机制。 (3)使用物流送快递的例子来说明Socket:  

    2024年02月15日
    浏览(23)
  • 学习RabbitMQ高级特性

    了解熟悉RabbitMQ的高级特性 1、消息可靠性投递 【confirm 确认模式、return 退回模式】 2、Consumer ACK 【acknowledge】 3、消费端限流 【prefetch】 4、TTL过期时间 【time to live】 5、死信队列 【Dead Letter Exchange】 6、延迟队列 【rabbitmq-delayed-message-exchange】 7、优先级队列 【x-max-priority】

    2024年02月04日
    浏览(33)
  • CSS高级特性

    CSS复合选择器:复合选择器是由两个或多个基础选择器通过不同的方式组合而成的 1.1 标签指定式选择器:又称交集选择器,由两个选择器构成,其中第一个选择器为标记选择器,第二个为class选择器或id选择器。两个选择器之间不能有空格。 1.2 后代选择器:后代选择器用来

    2024年02月16日
    浏览(31)
  • Spark高级特性

    spark shuffle 中 map 和 reduce 是一个相对的概念,map是产生一批数据,reduce是接收一批数据,前一个任务是map,后一个任务是reduce。 hashShuffle:hash分组,一个task里面按hash值的不同,分到不同的组里,在内存中也是独立的  sortShuffle比hashShuffle好的地方在于,sortShuffle是每个task(并

    2024年02月16日
    浏览(18)
  • Spark高级特性 (难)

    闭包 通过 closure 返回的函数 f 就是一个闭包, 其函数内部的作用域并不是 test 函数的作用域, 这种连带作用域一起打包的方式, 我们称之为闭包, 在 Scala 中 Scala 中的闭包本质上就是一个对象, 是 FunctionX 的实例 Spark中的闭包 分发闭包 上述这段代码中,flatMp中传入的是另外一个

    2024年01月19日
    浏览(18)
  • ISIS的高级特性

          L1的路由器只能和L1的路由器建立邻接关系,也可以和L1、2的路由建立邻接关系       L2的路由器只能和L2的路由器建立邻接关系,也可以和L1、2的路由建立邻接关系       DIS只有在广播型网络中才会选举           LSP相当于OSPF中的LSA           IS-IS链路状态报

    2024年02月07日
    浏览(33)
  • Redis 详解及高级特性

    Redis 是一个基于内存的高性能键值数据库,它支持多种数据结构,包括字符串、列表、集合、有序集合和哈希表等。Redis 将数据存储在内存中,因此拥有非常高的读取和写入性能,适用于需要快速读取和写入数据的应用程序场景。同时,Redis 还支持持久化存储和数据复制等功

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包