Ribbon的介绍: Ribbon是spring cloud的一个组件,是Netflix发布的负载均衡器,有助于控制HTTP客户端行为。为Ribbon配置服务提供者地址列表后, Ribbon就可基于负载均衡算法,自动帮助服务消费者请求。 Ribbon默认提供的负载均衡算法有:轮询,随机,重试法,加权等。当然,我们也可以用自己定义负载均衡算法。 Ribbon的使用: 1. 在微服务(consumer端)添加依赖,因为eureka-client已经集成了eureka,所以只需添加eureka客户端依赖即可: <!--eureka客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> 2. 使用注解@LoadBalanced即可:Ribbon集成RestTemplate,实现了负载均衡 Bean @LoadBalanced//Ribbon集成RestTemplate,实现了负载均衡 public RestTemplate restTemplate(){ return new RestTemplate(); } 3. 使用RestTemplate调用即可,Ribbon默认采用轮询策略: 调用:user-provider为集群中的微服务名称 User user = restTemplate.getForObject("http://user-provider/user/findByUser", User.class); user-provider端的Controller:URL:http://localhost:18082:/user/findByUser/张三 package com.it.controller; import com.it.pojo.User; import com.it.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * ToDo * * @author Lyle * @date 2020/4/3 */ @RestController @RequestMapping(value = "/user") public class UserController { @Autowired private UserService userService; @RequestMapping(value = "findAll") public List<User> findAll(){ return userService.findAll(); } @RequestMapping(value = "findByUser") public User findByUser(){ System.out.println("111111111111111111111111"); return userService.findAll().get(0); } } user-consumer端的Controller: package com.it.controller; import com.it.pojo.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.List; /** * ToDo * * @author Lyle * @date 2020/4/3 */ @RestController @RequestMapping("/movie") public class MovieController { @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @RequestMapping("/look/{username}") public String look(@PathVariable(name = "username") String username){ //接收用户信息 List<ServiceInstance> instances = discoveryClient.getInstances("user-provider"); ServiceInstance serviceInstance = instances.get(0); User user = restTemplate.getForObject("http://user-provider/user/findByUser", User.class); System.out.println(username+"===========>"+user.getName()); return "success"; } } 4. Ribbon轮询策略的配置: 在user-consumer端进行配置: # 修改服务地址轮询策略,默认是轮询 user-provider:(指定要调用的微服务名称是user-provider,即spring.application.name的名称是user-provider) ribbon: #轮询 #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #随机算法 #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #重试算法,该算法先按照轮询的策略获取服务,如果获取服务失败则在指定的时间内会进行重试,获取可用的服务 #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #加权法,会根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越大。刚启动时如果同统计信息不足,则使用轮询的策略,等统计信息足够会切换到自身规则。 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule (从可用的微服务系统中进行轮询)