Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。
通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
spring cloud ribbon 主要是对有集群的服务,进行选择访问。
ribbon的访问机制有很多不多说,只说3个:
轮询 (RoundRobin):按照顺序访问集群中的服务。
随机(Random):随机的访问集群中的服务。
加权(Weighted):服务访问时间越长,它的权重值越小(权重值:就是个普通的值1,2,3,4,5这些值而已),权重值越小访问的几率越低。
Spring Cloud Ribbon的使用
举个栗子:我有一个orders-server服务,和一个user-server-3000服务,user-server-3000服务做了集群user-server-3001,
orders-server服务要访问user-server服务。这时就需要Ribbon来实现权重均衡。轮询user-server-3000和user-server-3001服务
1.在orders-server导依赖
<!--客户端负载均衡实现 ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
2.在orders-server配置类中添加代码
/** * @LoadBalanced给RestTemplate添加负载均衡的功能默认是轮询机制
*
* RestTemplate 提供了多种便捷访问远程Http服务的方法 * @return */ @LoadBalanced @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); }
3.在Controller层的通行方法中把地址和端口号改为user-server集群的服务的名字。(user-server-3000和user-server-3001是集群,服务名字是一样的啊)
//注入远程Http服务的方法
@Autowired
private RestTemplate restTemplate;
/** * 该方法是浏览器来调用 * * @HystrixCommand: * * @param id * @return */ @GetMapping("/order/user/{id}") public User getUserById(@PathVariable("id") Long id){ System.out.println("OrderConsumerController.getUserById被调用了......"); // String url = "http://http://localhost:3001/user/"+id; String url = "http://user-server/user/"+id; //url 访问地址;User.class:返回的数据类型 User user = restTemplate.getForObject(url, User.class); return user; }
启动服务调用orders-server就行了。
修改负载均衡的机制:
如果要把轮询机制改成随机机制
在orders-server配置类中添加代码
/** * @LoadBalanced给RestTemplate添加负载均衡的功能 * * RestTemplate 提供了多种便捷访问远程Http服务的方法 * @return */ @LoadBalanced @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } @Bean public IRule ribbonRule() { return new RandomRule();//这里配置策略,和配置文件对应 }
再次启动服务,就行了