SpringCloud微服务之服务调用-Ribbon的使用及自定义策略的实现
前言
springcloud技术栈分布图:
一、Ribbon是什么?
Ribbon是一个负载均衡的客户端组件,可以在客户端进行负载均衡,使客户端可以根据自身的需要选择一个可用的服务实例进行调用。Ribbon集成在Spring Cloud Netflix中,常常与Eureka等注册中心进行配合使用,实现自动化的服务发现和负载均衡(Load Load Banlance)。
二、负载均衡LB?
我们最常见的实现负载均衡的有Nginx,其实负载均衡就是将用户的请求平摊的分配在多个服务器上,从而达到系统的HA(高可用)。那么Nginx和Ribbon实现方式有什么区别呢?
Ribbon是进程式LB,是本地负载均衡,调用微服务接口时,会在注册中心获取注册信息服务列表之后缓存到JVM本地,从而实现RPC远程调用技术。
Nginx是集中式LB,是服务器负载均衡,客户端所有请求都交给Ngninx来实现转发,它是由服务端实现的。
三、Ribbon 的工作逻辑
First:选择注册中心,优先选择同一个区域内的负载较少的服务器。
Two:根据用户指定的策略,从获取的服务注册列表中选择一个地址。
常用的Ribbon策略:轮询 、随机、重试等。
四、使用步骤
1.引入库
代码如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
如果你配合Eureka使用,则只需要引用一个Eureka包,因为Eureka内部已经集成了Ribbon包。
代码如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.启动类添加@EnableDiscoveryClient
代码如下:
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3.使用@LoadBalanced注解实现负载均衡
代码如下:
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
4.controller
@RestController
@Slf4j
public class OrderController {
private static final String URL = "http://注册中心服务地址";
@Resource
private RestTemplate restTemplate;
@Resource
private DiscoveryClient discoveryClient;
@GetMapping(value = "/pay/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
return restTemplate.getForObject(URL + "/payment/get/" + id, CommonResult.class);
}
}
五、使用自定义的策略算法
自定义之前,先去查看Ribbon的核心组件IRule接口,IRule的常用的实现类有轮询(RoundRobinRule) 、随机(RandomRule)、重试(RetryRule)等。
1、在和启动类的package同级新建一个package,新建文件:MySelfRule.class
说明:此目录的创建必须和启动类不在同一目录下,因为Ribbon官网有规范说明,否则不生效,具体查看目录图。
代码如下:
@Configuration
public class MySelfRule {
@Bean
public IRule iRule() {
return new RandomRule();//随机
}
}
2、修改启动类,增加@RibbonClient注解,name是注册中心服务名称,configuration是自定义的文件
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RibbonClient(name = "service-name",configuration = MySelfRule.class)
public class OrderMain {
public static void main(String[] args) {
SpringApplication.run(OrderMain.class, args);
}
}
在以上代码中,@LoadBalanced注解会自动为RestTemplate实例添加负载均衡功能。当调用时,Ribbon会根据负载均衡算法选择一个可用的服务器实例进行调用。
总结
总的来说,使用Ribbon可以方便地实现客户端负载均衡,提高了服务的可用性和可靠性。