《我想进大厂,腾讯大佬的“百万级JVM学习笔记”

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

5. 说说服务引用的流程?


服务暴露之后,客户端就要引用服务,然后才是调用的过程。

  1. 首先,客户端根据配置文件信息从注册中心订阅服务;

  2. 之后,DubboProtocol 根据订阅的得到 provider 地址和接口信息连接到服务端 server,开启客户端 client,然后创建 invoker;

  3. invoker 创建完成之后,通过 invoker 为服务接口生成代理对象。这个代理对象用于远程调用 provider,服务的引用就完成了。

    在这里插入图片描述

6. 有哪些负载均衡策略?


  1. 加权随机:假设我们有一组服务器 servers = [A, B, C],他们对应的权重为 weights = [5, 3, 2],权重总和为10。现在把这些权重值平铺在一维坐标值上,[0, 5) 区间属于服务器 A,[5, 8) 区间属于服务器 B,[8, 10) 区间属于服务器 C。接下来通过随机数生成器生成一个范围在 [0, 10) 之间的随机数,然后计算这个随机数会落到哪个区间上就可以了;

  2. 最小活跃数:每个服务提供者对应一个活跃数 active,初始情况下,所有服务提供者活跃数均为0。每收到一个请求,活跃数加1,完成请求后则将活跃数减1。在服务运行一段时间后,性能好的服务提供者处理请求的速度更快,因此活跃数下降的也越快,此时这样的服务提供者能够优先获取到新的服务请求;

  3. 一致性 hash:通过 hash 算法,把 provider 的 invoke 和随机节点生成 hash,并将这个 hash 投射到 [0, 2^32 - 1] 的圆环上。查询的时候根据 key 进行 md5 然后进行 hash。得到第一个节点的值大于等于当前 hash 的 invoker。

  4. 加权轮询:比如服务器 A、B、C 权重比为 5:2:1,那么在8次请求中,服务器 A 将收到其中的5次请求,服务器 B 会收到其中的2次请求,服务器 C 则收到其中的1次请求。

在这里插入图片描述

7. 集群容错方式有哪些?


  1. Failover Cluster 失败自动切换:Dubbo 的默认容错方案,当调用失败时自动切换到其他可用的节点。具体的重试次数和间隔时间可用通过引用服务的时候配置,默认重试次数为1也就是只调用一次;

  2. Failback Cluster 快速失败:在调用失败,记录日志和调用信息,然后返回空结果给 consumer,并且通过定时任务每隔5秒对失败的调用进行重试;

  3. Failfast Cluster 失败自动恢复:只会调用一次,失败后立刻抛出异常;

  4. Failsafe Cluster 失败安全:调用出现异常,记录日志不抛出,返回空结果;

  5. Forking Cluster 并行调用多个服务提供者:通过线程池创建多个线程,并发调用多个 provider,结果保存到阻塞队列,只要有一个 provider 成功返回了结果,就会立刻返回结果;

  6. Broadcast Cluster 广播模式:逐个调用每个 provider,如果其中一台报错,在循环调用结束后,抛出异常。

8. 了解 Dubbo SPI 机制吗?


SPI 全称为 Service Provider Interface,是一种服务发现机制。本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类,这样可以在运行时,动态为接口替换实现类。

Dubbo 也正是通过 SPI 机制实现了众多的扩展功能,而且 Dubbo 没有使用 Java 原生的 SPI 机制,而是对其·进行了增强和改进。

SPI 在 Dubbo 应用很多,包括协议扩展、集群扩展、路由扩展、序列化扩展等等。

使用方式可以在 META-INF/dubbo 目录下配置:


key=com.xxx.value 

然后通过 Dubbo 的 ExtensionLoader 按照指定的 key 加载对应的实现类,这样做的好处就是可以按需加载,性能上得到优化。

9. 如果让你实现一个 RPC 框架怎么设计?


  1. 首先需要一个服务注册中心,这样 consumer 和 provider 才能去注册和订阅服务;

  2. 需要负载均衡的机制来决定 consumer 如何调用客户端,这其中还当然要包含容错和重试的机制;

  3. 需要通信协议和工具框架,比如通过 HTTP 或者 RMI 协议通信,然后再根据协议选择使用什么框架和工具来进行通信。当然,数据的传输序列化要考虑;

  4. 除了基本的要素之外,像一些监控、配置管理页面、日志是额外的优化考虑因素。

那么,本质上只要熟悉一两个 RPC 框架,就很容易想明白我们自己要怎么实现一个 RPC 框架。

读者福利


感谢你看到了这里!

我这边整理很多2021最新Java面试题(含答案)和Java学习笔记,如下图

总目录展示

该笔记共八个节点(由浅入深),分为三大模块。

高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。

一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),觉得有需要的码友们,麻烦各位转发一下(可以帮助更多的人看到哟!)点这里,即可获得免费下载的方式!!

由于内容太多,这里只截取部分的内容。需要这份《高并发秒杀顶级教程》的小伙伴,麻烦各位帮忙点赞分享支持一下(可以帮助更多的人看到哟!)
存中…(img-VMBIIQux-1628422191530)]

[外链图片转存中…(img-6Tjk9f5L-1628422191531)]

由于内容太多,这里只截取部分的内容。需要这份《高并发秒杀顶级教程》的小伙伴,麻烦各位帮忙点赞分享支持一下(可以帮助更多的人看到哟!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值