SpringCloud微服务之服务调用-Ribbon的使用及自定义策略的实现

前言一、Ribbon是什么?二、负载均衡LB?三、Ribbon 的工作逻辑四、使用步骤1.引入库2.启动类添加@EnableDiscoveryClient3.使用@LoadBalanced注解实现负载均衡4.controller

五、使用自定义的策略算法总结

前言

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.引入库

代码如下:

org.springframework.cloud

spring-cloud-starter-netflix-ribbon

如果你配合Eureka使用,则只需要引用一个Eureka包,因为Eureka内部已经集成了Ribbon包。 代码如下:

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

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 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可以方便地实现客户端负载均衡,提高了服务的可用性和可靠性。

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: