做淘宝电商比较厉害的网站,婚纱摄影手机网站模板,快速网站开发工具,个人工作室注册条件SpringCloud底层其实是利用了一个名为Ribbon的组件#xff0c;来实现负载均衡功能的。1#xff09;LoadBalancerIntercepor可以看到这里的intercept方法#xff0c;拦截了用户的HttpRequest请求#xff0c;然后做了几件事#xff1a;1.request.getURI()#xff1a;获取请…SpringCloud底层其实是利用了一个名为Ribbon的组件来实现负载均衡功能的。1LoadBalancerIntercepor可以看到这里的intercept方法拦截了用户的HttpRequest请求然后做了几件事1.request.getURI()获取请求uri本例中就是 http://userservice/user/22.originalUri.getHost()获取uri路径的主机名其实就是服务iduserservice3.this.loadBalancer.execute()处理服务id和用户请求。这里的this.loadBalancer是LoadBalancerClient类型我们继续看源码。2LoadBalancerClient继续进入execute方法代码逻辑getLoadBalancer(serviceId)根据服务id获取ILoadBalancer而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。getServer(loadBalancer)利用内置的负载均衡算法从服务列表中选择一个。本例中可以看到获取了8083端口的服务放行后再次访问并Debug跟踪发现下一次获取的是8082确实是做到了负载均衡。3负载均衡策略IRule在刚才的代码中可以看到获取服务使通过一个getServer方法来做负载均衡:进入getServer方法继续跟踪源码chooseServer方法发现这么一段代码关于rule这里的rule默认值是一个RoundRobinRule看类的介绍The most well known and basic load balancing strategy, i.e. Round Robin Rule.最知名的基本负载平衡策略即Round Robin规则即轮循。负载平衡基本流程如下拦截我们的RestTemplate请求http://userservice/user/1RibbonLoadBalancerClient会从请求url中获取服务名称也就是userserviceDynamicServerListLoadBalancer根据userservice到eureka拉取服务列表eureka返回列表localhost:8081、localhost:8082.........IRule利用内置负载均衡规则从列表中选择一个例如localhost:8081RibbonLoadBalancerClient修改请求地址用localhost:8081替代userservice得到http://localhost:8080/user/2发起真实请求。负载均衡的规则都定义在IRule接口中而IRule有很多不同的实现类RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。全局轮循AvailabilityFilteringRule对以下两种服务器进行忽略 1在默认情况下这台服务器如果3次连接失败这台服务器就会被设置为“短路”状态。短路状态将持续30秒如果再次连接失败短路的持续时间就会几何级地增加。 2并发数过高的服务器。如果一个服务器的并发连接数过高配置了AvailabilityFilteringRule规则的客户端也会将其忽略。WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长这个服务器的权重就越小。这个规则会随机选择服务器这个权重值会影响服务器的选择。ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。同一机房或者集群内部做轮循BestAvailableRule忽略那些短路的服务器并选择并发数较低的服务器。RandomRule随机选择一个可用的服务器。RetryRule重试机制的选择逻辑默认的实现就是ZoneAvoidanceRule。通过定义IRule实现可以修改负载均衡规则有两种方式1.代码方式在order-service中的OrderApplication启动类中定义一个新的IRuleBean
public IRule randomRule(){return new RandomRule();
}2.配置文件方式在order-service的application.yml文件中添加新的配置也可以修改规则userservice: # 给某个微服务配置负载均衡规则这里是userservice服务ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 **注意**一般用默认的负载均衡规则不做修改。4饥饿加载Ribbon默认是采用懒加载即第一次访问时才会去创建LoadBalanceClient请求时间会很长。而饥饿加载则会在项目启动时创建降低第一次访问的耗时通过下面配置开启饥饿加载ribbon:eager-load:enabled: trueclients: userservice5Nacos同集群优先的负载均衡默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。因此Nacos中提供了一个NacosRule的实现可以优先从同集群中挑选实例。1给order-service配置集群信息修改order-service的application.yml文件添加集群配置spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: CD # 集群名称2修改负载均衡规则修改order-service的application.yml文件修改负载均衡规则userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则