Ribbon概念
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。
通俗的来说:Ribbon = 负载均衡 + RestTemplate
一、Ribbon策略
当我们在 RestTemplate 上添加 @LoadBalanced 注解后,就可以用服务名称来调用接口了,当有多个服务的时候,还能做负载均衡。然而Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等,并且我们还能够使用Ribbon实现自定义的负载均衡策略。
负载均衡常用策略方式:
- 默认为轮训的策略方式
- 随机
- 重试(如果获取服务失败,在指定时间内进行重试,获取可用服务)
- 过滤掉出故障的服务,选择一个最小并发量的服务
如下图为负载均衡轮训算法的实现:
二、配置使用
这里使用的注册中心为consul、服务发现为openfeign。
因为consul依赖就已经包含了ribbon的依赖,所以无需导入ribbon的依赖
新建配置类:MyRuleConfig.class,注意位置:
/**
* @description: 负载均衡:随机
* @author: ydf
* @date: 2020/12/3 14:18
* @version: v1.0
*/
@Configuration
public class MyRuleConfig {
@Bean
public IRule iRule(){
return new RandomRule();
}
}
启动类中添加注解:
@RibbonClient(name = "provider-service", configuration = MyRuleConfig.class) //自定义负载均衡算法
/**
* @description: 订单控制器
* @author: ydf
* @date: 2020/12/2 23:01
* @version: v1.0
*/
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@RibbonClient(name = "provider-service", configuration = MyRuleConfig.class) //自定义负载均衡算法
@EnableFeignClients //开启Feign服务调用
public class OrderAppMain {
public static void main(String[] args) {
SpringApplication.run(OrderAppMain.class,args);
}
}
创建一个 Ribbon 客户端的配置类,关联 MyRuleConfig,用 name 来指定调用的服务名称。
1.编写服务提供者
9001/9002分别为支付模块和购物模块,都是服务提供者,8001为消费者:
@Value("${server.port}")
private String serverPort;
@RequestMapping(value = "/payment/consul")
public String paymentConsul() {
return "springcloud with consul: " + serverPort + "\t" + UUID.randomUUID().toString();
}
2.编写服务消费者
/**
* 负载均衡调用--随机
* @return 返回端口
*/
@GetMapping(value = "/consumer/payment/consul")
public String paymentInfo() {
return paymentFeignService.paymentConsul();
}
/**
* @description: 服务调用接口
* @author: ydf
* @date: 2020/12/3 14:49
* @version: v1.0
*/
@FeignClient(value = "provider-service")
public interface PaymentFeignService {
@GetMapping(value = "/payment/consul")
String paymentConsul();
}