Ribbon
Ribbon 开发公司中文官方文档→
1 简介
1.1 基本情况
- Spring Cloud Ribbon是基于Netflix Ribbon开发公司实现的一套客户端负载开发公司均衡的工具。
功能:
开发公司提供客户端的软件开发公司负载均衡算法和服务调用。Ribbon开发公司客户端组件提供一系列开发公司完善的配置项如连接超时,重试等。优点:
开发公司在配置文件中列出Load Balancer(简称LB)开发公司后面所有的机器,Ribbon开发公司会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。现状:
Ribbon目前也进入维护模式,Ribbon未来可能被Spring Cloud LoadBalacer替代。
1.2 Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别
- Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
- Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。
1.3 Load Balance负载均衡分类
集中式LB:
即在服务的消费方和提供方之间使用独立的LB设施(如nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方;
进程内LB:
将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用(如Ribbon),然后自己再从这些地址中选择出一个合适的服务器。
1.4 工作原理
原理:
Ribbon其实就是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和Eureka结合只是其中的一个实例。
步骤
-
先选择EurekaServer ,它优先选择在同一个区域内负载较少的server。
-
再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。
2 Ribbon实现
2.1 pom.xml
- 引入spring-cloud-starter-netflix-eureka-client,因为spring-cloud-starter-netflix-eureka-client自带了spring-cloud-starter-ribbon引用。
- 引入spring-cloud-starter-ribbon也可以使用ribbon。
<dependency> <groupld>org.springframework.cloud</groupld> <artifactld>spring-cloud-starter-netflix-ribbon</artifactid></dependency>
- 1
- 2
- 3
- 4
2.2 的使用
方法名 | 说明 |
---|---|
读操作 | getForObject(): 返回对象为响应体中数据转化成的对象,基本上可以理解为Json。getForEntity(): 返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等。 |
写操作 | postForObject(): 返回对象为响应体中数据转化成的对象,基本上可以理解为Json。postForEntity(): 返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等。 |
@GetMapping("/consumer/cluster/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) { return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class); } @GetMapping("/consumer/cluster/getForEntity/{id}") public CommonResult<Payment> getForEntity(@PathVariable("id") Long id) { ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL + "/payment/get/" + id,CommonResult.class); boolean successful = entity.getStatusCode().is2xxSuccessful(); if (successful) return new CommonResult(entity.getStatusCodeValue(),entity.getStatusCode().name(),entity.getBody().getData()); return new CommonResult<>(entity.getStatusCodeValue(),"返回失败"); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
运行结果
@PostMapping("/consumer/cluster/create") public CommonResult<Payment> create(Payment payment) { /** * restTemplate三个参数分别为URL、传入的参数、返回的结果类型 */ CommonResult commonResult = restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class); return commonResult; } @PostMapping("/consumer/cluster/postForEntity") public CommonResult<Payment> postForEntity(Payment payment) { // restTemplate三个参数分别为URL、传入的参数、返回的结果类型 ResponseEntity<CommonResult> entity = restTemplate.postForEntity(PAYMENT_URL + "/payment/create", payment, CommonResult.class); //状态码、状态码名称,返回的结果 return new CommonResult(entity.getStatusCodeValue(),entity.getStatusCode().name(),entity.getBody().getData()); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
运行结果
3 Ribbon负载规则
3.1 默认的负载规则
3.2 替换负载规则
警告:FooConfiguration 不能被@ComponentScan 在main application context。这样的话,它将被所有@RibbonClients共享。如果你使用 @ (or @SpringBootApplication) ,你需要避免它被包括其中。(例如:放它到一个独立的,无重叠的包里,或者指明不被@ComponentScan扫描)。
1. 新建package包com.tl.rule
2. 在新包新建BalanceRule规则类
@Configurationpublic class BalanceRule { @Bean public IRule balanceRule(){ return new RandomRule(); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3. 主启动类下添加@RibbonClient注解
@SpringBootApplication@EnableEurekaClient@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = BalanceRule.class)public class OrderMain { public static void main(String[] args) { SpringApplication.run(OrderMain.class,args); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
4. 测试