一、什么是Ribbon?
Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具。简单的说,Ribbonn是Netflix的开源项目,主要功能 是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。就是在配置文件中列出 Loa Balancer后面所有机器,Ribbon会自动帮助你基于某种规则 (如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
二、Ribbon的作用
1、负载均衡:
将用户的请求平摊的分配到多个服务上,从而达到HA(高可用),常见的负载均衡有 Nginx,LVS,硬件 F5等。
2、Ribbon 本地负载均衡客户端 VS Nginx 服务端负载均衡
- Nginx 是服务器 负载均衡,客户端所有请求都会交给 nginx,然后由 nginx实现请求转发。即负载均衡是由服务端实现的。
- Ribbon 是本地负载均衡,在微服务调用接口时,在注册中心上获取注册信息服务列表 之后缓存在JVM本地,从而实现本地RPC远程服务调用技术。
三、RestTemplate
1、什么是 RestTemplate?
RestTemplate是Spring提供的一个访问Http服务的客户端类。通过RestTemplate可以实现微服务之间的调用。
示例代码:
@RestController
@Slf4j
public class OrderController {
private static final String PAYMENT_URL = "http://localhost:8001";
@GetMapping(value="/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
}
四、RestTemplate 使用
- getForObject 返回json
- getForEntity 返回ResponseEnity对象,包括响应头,响应体等信息。
- postForObject,与 get 方法一样,不同的是传进去的参数是对象
- postForEntity
- GET 请求方法
- POST请求方法
五、Ribbon使用
1、引入依赖
由于spring-cloud-starter-netflix-eureka-client 已经引入了 Ribbon-Balance的依赖,所以不需要添加依赖。
2、配置文件yml
server:
port: 80
spring:
application:
name: cloud-order-server
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
fetch-registry: true
service-url:
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
3、添加启动类
@SpringBootApplication
@EnableEurekaClient
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
4、配置RestTemplate
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //使用LoadBalanced注解赋予RestTemplate负载均衡能力
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
5、业务
@GetMapping(value="/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
6、结果
由于默认为轮询策略,所以每次刷新请求为8001,8002轮询
六、负载均衡规则替换
1、Ribbon 的几种负载均衡算法
- RoundRobinRule :轮询策略。Ribbon 默认采用的策略。若经过一轮轮询没有找到可用的 provider,其最多轮询 10 轮。若最终还没有找到,则返回 null。(默认)
- RandomRule : 随机策略,从所有可用的 provider 中随机选择一个。
- RetryRule : 重试策略。先按照 RoundRobinRule 策略获取 provider,若获取失败,则在指定的时限内重试。默认的时限为 500 毫秒。
2、添加规则类
这个自定义配置类不能放在 @ComponentScan 所扫描的当前包下以及子包下,否则自定义的配置类就会被所有的 Ribbon 客户端所共享,达不到特殊化定制的目的了。
@Configuration
public class MyRule {
@Bean
public IRule myselfRule(){
return new RandomRule();//改为随机
}
}
3、主启动类添加 @RibbonClient
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PROVIDER-SERVICE", configuration = MyRule.class)
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
4、测试
多次刷新,8001,8002随机出现 ,负载规则就更改为随机了。