Java负载均衡拦截器的功能和负载均衡的策略

发布时间:2021-09-06 13:49:36 作者:chen
来源:亿速云 阅读:174

这篇文章主要介绍“Java负载均衡拦截器的功能和负载均衡的策略”,在日常操作中,相信很多人在Java负载均衡拦截器的功能和负载均衡的策略问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java负载均衡拦截器的功能和负载均衡的策略”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录

前言

服务消费者需要通过RestTemplate调用注册中心(Eureka)的服务提供者,但当同一服务名称的服务有多个的时候,我们的服务消费者应该调用哪一个服务呢?这时候就需要我们学习理解Ribbon负载均衡的实现原理。

当我们在RestTemplate组件上加上@LoadBalanced注解,就会去注册中心中拉取服务的实例列表,并且实现负载均衡,SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。

1、抛出问题

比如我们的服务消费者 order-service发出请求:http://userservice/user/1
该请求并不能与注册中心中的服务列表信息相符,那么是如何找到 http://localhost:8081呢?

Java负载均衡拦截器的功能和负载均衡的策略

2、源码解析

2.1、LoadBalancerIntercepor

上述信息已经表明,我们没有输出IP和端口号,只是通过了服务名称(userservice) 就能找到我们想要调用的服务!

这是因为Ribbon组件中的LoadBalancerInterceptor(负载均衡拦截器)会将调用请求拦截,根据服务名称获取到服务实例的ip和端口。

LoadBalancerInterceptor 会在将RestTemplate的请求进行拦截,然后在Eureka注册中心根据服务名称获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务名称。

Java负载均衡拦截器的功能和负载均衡的策略

可以看到这里的intercept方法,拦截了调用请求HttpRequest,然后做了一下操作:

1.request.getURI():获取请求uri,本例中就是 http://user-service/user/8

2.originalUri.getHost():获取uri路径的主机名,其实就是服名称:userservice

3.this.loadBalancer.execute():处理服务名称,和用户请求

这里的this.loadBalancer是LoadBalancerClient类型,我们继续跟入execute方法!

2.2、LoadBalancerClient

代码是这样的:

getLoadBalancer(serviceId):根据服务名称获取ILoadBalancer接口,而ILoadBalancer会拿着服务名称去eureka中获取服务列表并保存起来。

getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个。本例中,可以看到获取了8082端口的服务

Java负载均衡拦截器的功能和负载均衡的策略

放行后,再次访问并跟踪,发现变成获取8081端口服务,实现了负载均衡:

Java负载均衡拦截器的功能和负载均衡的策略

2.3、负载均衡策略IRule

在刚才的代码中,可以看到获取服务使通过一个getServer方法来做负载均衡:

Java负载均衡拦截器的功能和负载均衡的策略

继续跟入getServer方法:

Java负载均衡拦截器的功能和负载均衡的策略

继续跟踪源码chooseServer方法,发现这么一段代码:

Java负载均衡拦截器的功能和负载均衡的策略

我们看看这个rule是谁:

Java负载均衡拦截器的功能和负载均衡的策略

这里的rule默认值是一个RoundRobinRule,看看介绍:

Java负载均衡拦截器的功能和负载均衡的策略

翻译过来就是轮询的意思,这样,整个负载均衡的流程我们就清楚了。

2.4、总结

Ribbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下:

Java负载均衡拦截器的功能和负载均衡的策略

基本流程如下:

3、负载均衡策略

负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:

Java负载均衡拦截器的功能和负载均衡的策略

不同规则的含义如下:

Java负载均衡拦截器的功能和负载均衡的策略

默认的实现就是ZoneAvoidanceRule,是一种轮询方案

那么如何自定义负载均衡策略?

通过定义IRule实现可以修改负载均衡规则,有两种方式:

1.代码方式:在配置类或启动类(可以看作配置类)中,定义一个新的IRule:

@Bean
public IRule randomRule(){
	//随机策略
    return new RandomRule();
}

配置文件方式:在application.yml文件中,添加新的配置也可以修改规则:

userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则

注意:我们一般用默认的负载均衡规则,不做修改!

到此,关于“Java负载均衡拦截器的功能和负载均衡的策略”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. Nginx的负载均衡策略及常用故障节点的摘除
  2. MySQL实现负载均衡功能的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Nginx配置文件的示例分析

下一篇:python中jupyter基础操作的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》