Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手

这篇具有很好参考价值的文章主要介绍了Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

if (sameWeight && i > 0 && !weight.equals(weights[i - 1])) {

sameWeight = false;

}

}

Integer sequenceNum = Sequence.getAndIncrement();

Integer offset = sequenceNum % totalWeight;

offset = offset == 0 ? totalWeight : offset;

if (!sameWeight) {

for (String ip : ServerIps.WEIGHT_LIST.keySet()) {

Integer weight = ServerIps.WEIGHT_LIST.get(ip);

if (offset <= weight) {

return ip;

}

offset = offset - weight;

}

}

String ip = “”;

synchronized (pos) {

if (pos >= ServerIps.LIST.size()) {

pos = 0;

}

ip = ServerIps.LIST.get(pos);

pos++;

}

return ip;

}

public static void main(String[] args) {

// 连续调用11次

for (int i = 0; i < 11; i++) {

System.out.println(getServer());

}

}

}

执行结果如下

192.168.0.2

192.168.0.2

192.168.0.2

192.168.0.2

192.168.0.2

192.168.0.2

192.168.0.2

192.168.0.2

192.168.0.1

192.168.0.4

192.168.0.4

但是这种算法有一个缺点:一台服务器的权重特别大的时候,他需要连续的的处理请求,但是实际上我们想达到的效果是,对于100次请求,只要有100*8/50=16次就够了,这16次不一定要连续的访问,比如假设我们有三台服务器 servers = [A, B, C],对应的权重为 weights = [5, 1, 1] , 总权重为7,那么上述这个算法的结果是:AAAAABC,那么如果能够是这么一个结果呢:AABACAA,把B和C平均插入到5个A中间,这样是比较均衡的了。

我们这里可以改成平滑加权轮询。

平滑加权轮询


特点

思路:每个服务器对应两个权重,分别为weight 和currentWeight.其中weight是固定的,currentWeight会动态调整,初始值为0.当有新的请求进来时,遍历服务器列表,让它的currentWeight加上自身权重。遍历完成后,找到最大的 currentWeight,并将其减去权重总和,然后返回相应的服务器即可。

假设我们有三台服务器 servers = [A, B, C],对应的权重为 weights = [5, 1, 1] , 总权重为7

| 请求编号 | currentWeight 数组 (current_weight += weight) | 选择结果(max(currentWeight)) | 减去权重总和后的currentWeight 数组(max(currentWeight) -= sum(weight)) |

| — | — | — | — |

| 1 | [5, 1, 1] | A | [-2, 1, 1] |

| 2 | [3, 2, 2] | A | [-4, 2, 2] |

| 3 | [1, 3, 3] | B | [1, -4, 3] |

| 4 | [6, -3, 4] | A | [-1, -3, 4] |

| 5 | [4, -2, 5] | C | [4, -2, -2] |

| 6 | [9, -1, -1] | A | [2, -1, -1] |

| 7 | [7, 0, 0] | A | [0, 0, 0] |

如上,经过平滑性处理后,得到的服务器序列为 [A, A, B, A, C, A, A],相比之前的序列 [A, A, A, A, A, B, C],分布性要好一些。初始情况下 currentWeight = [0, 0, 0],第7个请求处理完后,currentWeight 再次变为 [0, 0, 0]。

代码实现

// 增加一个Weight类,用来保存ip, weight(固定不变的原始权重), currentweight(当前会变化的权重)

public class Weight {

private String ip;

private Integer weight;

private Integer currentWeight;

public Weight(String ip, Integer weight, Integer currentWeight) {

this.ip = ip;

this.weight = weight;

this.currentWeight = currentWeight;

}

public String getIp() {

return ip;

}

public void setIp(String ip) {

this.ip = ip;

}

public Integer getWeight() {

return weight;

}

public void setWeight(Integer weight) {

this.weight = weight;

}

public Integer getCurrentWeight() {

return currentWeight;

}

public void setCurrentWeight(Integer currentWeight) {

this.currentWeight = currentWeight;

}

}

public class WeightRoundRobinV2 {

private static Map<String, Weight> weightMap = new HashMap<String, Weight>();

public static String getServer() {

// 获取权重之和

int totalWeight = ServerIps.WEIGHT_LIST1.values().stream().reduce(0, (w1, w2) -> w1 + w2);

//初始化weightMap,初始时将currentWeight赋值为weight

if (weightMap.isEmpty()) {

ServerIps.WEIGHT_LIST1.forEach((key, value) -> {

weightMap.put(key, new Weight(key, value, value));

});

}

//找出currentWeight最大值

Weight maxCurrentWeight = null;

for (Weight weight : weightMap.values()) {

if (maxCurrentWeight == null || weight.getCurrentWeight() > maxCurrentWeight.getCurrentWeight()) {

maxCurrentWeight = weight;

}

}

//将maxCurrentWeight减去总权重和

maxCurrentWeight.setCurrentWeight(maxCurrentWeight.getCurrentWeight() - totalWeight);

//所有的ip的currentWeight统一加上原始权重

for (Weight weight : weightMap.values()) {

weight.setCurrentWeight(weight.getCurrentWeight() + weight.getWeight());

}

//返回maxCurrentWeight所对应的ip

return maxCurrentWeight.getIp();

}

public static void main(String[] args) {

// 连续调用10次

for (int i = 0; i < 10; i++) {

System.out.println(getServer());

}

}

}

ServerIps里添加数据WEIGHT_LIST1:

public static final Map<String, Integer> WEIGHT_LIST1 = new HashMap<String, Integer>();

static {

// 权重之和为50

WEIGHT_LIST1.put(“A”, 5);

WEIGHT_LIST1.put(“B”, 1);

WEIGHT_LIST1.put(“C”, 1);

}

执行结果如下:

A

A

B

A

C

A

A

A

A

B

一致性哈希算法-ConsistentHashLoadBalance


服务器集群接收到一次请求调用时,可以根据请求的信息,比如客户端的Ip地址,或请求路径与请求参数等信息进行哈希,可以得到一个哈希值,特点是对于相同的ip地址,或请求路径和请求参数哈希出来的值是不一样的,只要能再增加一个算法,能够把这个哈希值映射成一个服务端ip地址,就可以使相同的请求(相同的ip地址,或请求路径和请求参数)落到同一服务器上。

因为客户端发起的请求情况是无穷无尽的(客户端地址不同,请求参数不同等),所以对于的哈希值是无穷大的,所以我们不可能把所有的哈希值都进行映射到服务端ip上。所以这里用到了哈希环。

Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo

  • 哈希值如果需要ip1和ip2之间的,则应该选择ip2作为结果;

  • 哈希值如果需要ip2和ip3之间的,则应该选择ip3作为结果;

  • 哈希值如果需要ip3和ip4之间的,则应该选择ip4作为结果;

  • 哈希值如果需要ip4和ip1之间的,则应该选择ip1作为结果;

上面这情况是比较均匀情况,如果出现ip4服务器不存在,那就是这样了:

Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo

通过图片会发现,ip3和ip1直接的范围是比较大的,会有更多的请求落在ip1上,这是不“公平的”,解决这个问题需要加入虚拟节点,比如:

Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo

其中ip2-1, ip3-1就是虚拟结点,并不能处理节点,而是等同于对应的ip2和ip3服务器。

实际上,这只是处理这种不均衡性的一种思路,实际上就算哈希环本身是均衡的,你也可以增加更多的虚拟节点来使这个环更加平滑,比如:

Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo

这个彩环也是“公平的”,并且只有ip1,2,3,4是实际的服务器ip,其他的都是虚拟ip。

特点

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

  • 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

代码实现

对于我们的服务端ip地址,我们肯定知道总共有多少个,需要多少个虚拟节点也有我们自己控制,虚拟节点越多则流量越均衡,另外哈希算法也是很关键的,哈希算法越散列流量也将越均衡。

public class ConsistentHash {

private static SortedMap<Integer, String> virtualNodes = new TreeMap<>();

private static final int VIRTUAL_NODES = 160;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo
Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo
Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo
Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo
Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo
Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo

最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo

Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手,2024年程序员学习,java,面试,dubbo

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算文章来源地址https://www.toymoban.com/news/detail-857175.html

学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

[外链图片转存中…(img-SXk2nMKc-1712247705592)]

[外链图片转存中…(img-ABwszGU3-1712247705592)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

到了这里,关于Java实习面试经验汇总,Dubbo-负载均衡原理解析,TCP的三次握手、四次挥手的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 中间件(二)dubbo负载均衡介绍

    支持轮询、随机、一致性hash和最小活跃数等。 ① sequences:内部的序列计数器 ② 服务器接口方法权重一样:(sequences+1)%服务器的数量=(决定调用)哪个服务器的服务。 ③ 服务器接口方法权重不一样:找到最大权重(权重数)%(sequences+1),然后找出权重比该取模后的值

    2024年02月12日
    浏览(35)
  • Dubbo负载均衡策略之 一致性哈希

    本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题,然后引出解决数据倾斜问题的方法,最后分析一致性哈希算法在Dubbo中的使用。通过这篇文章,可以了解到一致性哈希算法的原理以及这种算法存在的问题和解决方案。 在这里引用dubbo官网的一段话——

    2024年02月08日
    浏览(67)
  • 【网络面试(8)】防火墙原理、正向代理、反向代理、缓存服务器、负载均衡和内容分发服务器

     接上一篇:【网络面试必问(7)】聊聊集线器、交换机和路由器  作为一个程序员,其实很少去了解http请求消息在到达服务器之前,所经过的众多组件的,今天借着机会聊一聊标题中提到的正向代理、反向代理、缓存服务器、负载均衡和内容分发服务器等内容。 1.1 部署

    2024年02月22日
    浏览(44)
  • 【Java】微服务——Ribbon负载均衡(跟进源码分析原理)

    添加@LoadBalanced注解,即可实现负载均衡功能,这是什么原理 SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。 为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口。 显然有人帮我们根据service名称,获取到了服务实例的ip和端口。它

    2024年02月07日
    浏览(40)
  • Dubbo的几个负载均衡类--最短响应时间

    -----------------看过之前一致性哈希和最少活跃书的可以跳过-----------------  链接在此:Dubbo的几个负载均衡类--一致性哈希 Dubbo的几个负载均衡类--最少活跃数 Dubbo的几个负载均衡类--轮询 Dubbo的几个负载均衡类--随机 消费者发起调用过程中涉及如下几步 1:接口调用,比如Demo

    2024年01月23日
    浏览(44)
  • 2.1: Dubbo的基本应用-负载均衡,集群容错,服务降级

    官网地址:  http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance/ 如果在消费端和服务端都配置了负载均衡策略,   以消费端为准。 这其中比较难理解的就是最少活跃调用数是如何进行统计的? 讲道理 ,   最少活跃数应该是在 服务提供者端 进行统计的,   服务提供者统计有

    2024年02月10日
    浏览(29)
  • Dubbo负载均衡策略之 一致性哈希 | 京东云技术团队

    本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题,然后引出解决数据倾斜问题的方法,最后分析一致性哈希算法在Dubbo中的使用。通过这篇文章,可以了解到一致性哈希算法的原理以及这种算法存在的问题和解决方案。 在这里引用dubbo官网的一段话——

    2024年02月08日
    浏览(49)
  • dubbo源码中设计模式——负载均衡中模版模式的应用

    在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 使用场景:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板

    2024年02月19日
    浏览(48)
  • Kong工作原理 - 负载均衡 - 负载均衡算法

    负载均衡器支持以下负载均衡算法: 1. 轮询(Round-robin) 2. 一致性哈希(Consistent Hashing) 3. 最少连接(Least Connections) 4. 延迟(Latency) 这些算法仅在使用upstream实体时可用,详见高级负载均衡。 注意:对于所有这些算法,重要的是要了解如何设置每个后端的权重和端口。

    2024年01月25日
    浏览(45)
  • Kong工作原理 - 负载均衡 - 高级负载均衡

    通过upstream实体可用高级负载均衡算法。 使用这些负载均衡器时,后端服务的添加和删除将由Kong处理,不需要进行DNS更新。Kong将充当服务注册表的角色。 通过上游和目标实体进行负载均衡器的配置。 upstream:一个“虚拟主机名”,可以在服务主机字段中使用,例如,一个名

    2024年01月25日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包