1. Ribbon 是什么?
Spring Cloud Ribbon 是一套实现客户端负载均衡的工具。注意是客户端。负载均衡就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用。
再说的通俗一点,就是可以在配置文件中列出 LB 后面所有的机器(即服务),Ribbon 会自动根据某种规则(如轮询、随机等等)去连接这些机器(即服务),我们也可以自定义一些负载均衡算法。
再简单点,Ribbon 就是一个类库,集成在服务消费方,消费方从服务注册中心获知有哪些地址(即服务)可用,然后消费方通过 Ribbon 从这些地址当中选择一个合适的服务器来消费服务。
图示:
2. Nginx 和 Ribbon的区别
Nginx 是服务器端负载均衡,体量比较大
Ribbon是客户端负载均衡,用于微服务之间的负载,轻便、体量小
3. Ribbon 的简单使用
3.1 我们定义两个订单服务
代码如下
@RestController
public class OrderService {
@Value("${server.port}")
private int port;
@GetMapping("/orders")
public String getAllOrder(){
System.out.println("port"+port);
return "Return all order";
}
}
配置文件
# 应用名称
spring.application.name=order-service
# 应用服务 WEB 访问端口
server.port=8080
idea如图配置就可以开启两个一模一样的服务
3.2 我们定义一个用户服务
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping("/user/{id}")
public String findById(@PathVariable("id") int id){
// TODO
// 调用订单的服务去获取数据
// Spring 中提供的远程通信
ServiceInstance serviceInstance = loadBalancerClient.choose("order-service");
String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort()+"/orders");
return restTemplate.getForObject(url,String.class);
}
}
引入ribbon的包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
配置文件
# 应用名称
spring.application.name=user-service
# 应用服务 WEB 访问端口
server.port=8088
# 配置制定服务的提供者地址列表
order-service.ribbon.listOfServers=\
localhost:8080,localhost:8082
接着启动三个服务,在浏览器中访问连接
接着看控制台,发现请求多次,轮流调用两个order服务,至此,你已经学会了ribbon的简单使用了。
第二种写法,使用注解的写法
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
@Bean
@LoadBalanced // 这里直接加一个注解,即可实现上述使用loadBalancerClient的功能
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping("/user/{id}")
public String findById(@PathVariable("id") int id){
return restTemplate.getForObject("http://order-service/orders",String.class);
}
}
4. Ribbon的原理
ribbon的工作流程
1、解析配置中的服务器列表
2、基于负载均衡的算法来实现请求的分发