Ribbon+LoadBalance
ribbon是一套客户端的负载均衡工具。主要提供客户端的负载均衡算法和服务调用。当调用服务时ribbon会自动的帮助你基于某种规则(轮询、随机)去链接机器调用服务。我们也可以使用ribbon实现自定义的负载均衡算法。Ribbon是客户端的负载均衡,Nginx是服务器的负载均衡。
-
pom依赖
eureka自带了ribbon依赖,所以只需加入eureka客户端依赖。
-
Ribbon要结合RestTemplate实现远程调用
/** * 配置RestTemplate * 使用@LoadBalanced 默认轮询的负载均衡策略 */ @Configuration public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
@RestController public class OrderController { @Resource private RestTemplate restTemplate; public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE"; @GetMapping("/login/{admin}/{password}") public Result<Users> orderLogin(@PathVariable String admin,@PathVariable String password){ String login_url = PAYMENT_URL+"/sent/user/login/"+admin+"/"+password; //使用restTemplate实现远程调用服务 Result<Users> result = restTemplate.getForObject(login_url,Result.class); return result; } }
-
自定义ribbon负载均衡算法
自定义的ribbon负载规则不能放在@ComponentScan所扫描的包下以及子包下,也就是说不能放在主启动类所在的包内,要与主启动类所在包并列。利用IRule设置规则
@Configuration public class MyRandomRule { @Bean public IRule myRule(){ return new RandomRule(); } }
,在主启动类加上
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MyRandomRule.class)
以下为Ribbon均衡负载规则的类型。
-
在spring-cloud2020后eureka移除了ribbon。需要使用LoadBalance来设置自定义的负载均衡。eureka自带了LoadBalance依赖,所以只需加入eureka客户端依赖。和ribbon一样需要配置RestTemplate实现远程调用。
-
自定义LoadBalance负载均衡策略
/** * 自定义随机负载均衡策略 */ public class MyRandomRule { @Bean ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){ String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new RandomLoadBalancer(loadBalancerClientFactory .getLazyProvider(name, ServiceInstanceListSupplier.class),name); } }
-
创建RestTemplate时加上自定义负载均衡策略
/** * 配置RestTemplate * 使用@LoadBalanced 默认轮询的负载均衡策略 */ @Configuration @LoadBalancerClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MyRandomRule.class) public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
-