优化网站的软件下载,软件app免费下载,为什么北京一夜封了,建立淘宝客网站#x1f40c;个人主页#xff1a; #x1f40c; 叶落闲庭 #x1f4a8;我的专栏#xff1a;#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也#xff0c;而不可夺坚#xff1b;丹可磨也#xff0c;而不可夺赤。 Ribbon 一、 Ribbon负载均衡原理1.1 负载均… 个人主页 叶落闲庭 我的专栏 c语言 数据结构 javaEE 操作系统 Redis 石可破也而不可夺坚丹可磨也而不可夺赤。 Ribbon 一、 Ribbon负载均衡原理1.1 负载均衡流程1.2 负载均衡原理 二、Ribbon负载均衡策略2.1 定义IRule修改负载均衡规则 三 、饥饿加载 一、 Ribbon负载均衡原理
1.1 负载均衡流程 在之前的远程调用中有一个order-service服务需要调用user-service,这个user-service有两个不同的端口号而在order-service的请求路径中是通过String url http://userservice/user/ order.getUserId();的方式发送http请求这时我们需要知道这个url字符串中的http://userservice/user/是否是一个真实可用的地址显然它不是一个真实可用的地址所以当order-service发起请求时是不会到达user-service的因此在这两者之间一定会有一个组件把它拦截下来做一定的处理从而找到真实的ip端口Ribbon就是负责做这个处理的Ribbon通过order-service发过来的url得到需要请求的服务然后再去eureka注册中心找到对应的服务拉取服务给到order-service拉取到的服务可能是多个这时Ribbon就会对多个服务进行负载均衡挑一个返回给order-service。 1.2 负载均衡原理 在order-service的启动类中注入了RestTemplate的bean并给这个bean添加了LoadBalanced注解这个注解就是一个标记表示这个RestTemplate发起的请求要被Ribbon拦截和处理具体的拦截动作可以根据源码来分析 以idea来演示拦截过程在idea中双击shift搜索LoadBalancerInterceptor.java: 这个类实现了客户端http请求拦截器的接口 实现了该接口中的方法我们通过打断点来分析Ribbon负载均衡原理 当刷新浏览器时会直接跳转到断点处 继续调试代码得到userservice/user/1 继续调试代码会得到服务的名称userservice: 找到了服务的名称接下来就可以去eureka进行服务的拉取这时会将userservice交给loadBalancer,也就是Ribbon负载均衡 跟进这个方法继续调试这时进入了RibbonLoadBalancerClient.java中的excute方法excute中有一个参数(服务id)会将这个参数传给getLoadBalancer方法去处理执行完后会得到一个getLoadBalancer对象这个对象的名字叫做DynamicServerListLoadBalancer动态服务列表负载均衡在它里面有一个allServerList的参数保存了所有的userservice服务的信息 经过这步操作就可以根据服务名称拉取到了服务列表下一步就是负载均衡跟进getServer继续调试观察 一步步跟进找到了一个rule.choose的方法这个rule就是从DynamicServerList选择的规则这个rule的类型是IRule的接口所以负载均衡的策略是由IRule来决定的 继续调试会返回一个选择的service: 接下来就可以根据真实的地址拿到相应的服务了
二、Ribbon负载均衡策略
内置负载均衡规则类规则描述RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。AvailabilityFilteringRule对以下两种服务器进行忽略(1)在默认情况下这台服务器如果3次连接失败这台服务器就会被设置为“短路”状态。短路状态将持续30秒如果再次连接失败短路的持续时间就会几何级地增加。(2)并发数过高的服务器。如果一个服务器的并发连接数过高配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限可以由客户端的clientName,clientConfigNamespace,ActiveConnectionsLimit属性进行配置。WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长这个服务器的权重就越小。这个规则会随机选择服务器这个权重值会影响服务器的选择。ZoneAvoidanceRule 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类这个Zone可以理解为一个机房、一个机架等。而后再对Z0one内的多个服务做轮询。BestAvailableRule忽略哪些短路的服务器并选择并发数较低的服务器RandomRule随机选择一个可用的服务器RetryRule重试机制的选择逻辑
2.1 定义IRule修改负载均衡规则
方式一 在order–service中的OrderApplication类中定义一个新的IRule
Bean
public IRule randomRule() {return new RandomRule();
}方式二 配置文件方式在order–servicel的application.yml文件中添加新的配置也可以修改规则
userservice:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则三 、饥饿加载
Ribbon默认是采用懒加载即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。第一次加载耗时很长 第二次加载耗时变短 而饥饿加载则会在项目启动时创建降低第一次访问的耗时通过下面配置开启饥饿加载
ribbon:eager-load:enabled: true # 开启饥饿加载clients: - userservice # 指定饥饿加载的服务名称- xxservice项目启动就加载好 此时第一次加载浏览器比之前缩减了一半时间由于还需要加载其他文件所以这里看起来时间也是很久但比之前确实缩减了速度也得到了一定的提升