Ribbon - 介绍
Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具;提供客户端的软件负载均衡算法和服务调用;
Ribbon工作时分两步:
第一步先选择 EurekaServer(或者nacos),它优先选择在同一个区域内负载较少的 server;
第二步再根据用户指定的策略,在从 server 取到的服务注册列表中选择一个地址;
一、Ribbon 核心组件
引入 Ribbon:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
IRule 定义了负载均衡的方式:
二、Ribbon 交互的三种级别层次
a)Spring DiscoveryClient:提供了对 Ribbon 和 Ribbon 中缓存的注册服务的最低层次访问;
b)启用了 RestTemplate 的 Spring DiscoveryClient;
c)Netflix Feign 客户端;
注册中心必不可少,在主程序类上添加注解
@EnableDiscoveryClient:表明可以被注册中心发现。是 Sring Cloud 的触发器,其作用是使应用程序能够使用 DiscoveryClient 和 Ribbon 库;
2.1、使用 DiscoveryClient 查找信息
@Component public class ProviderDiscoveryClient { //自动注入 DiscoveryClient 类,该类用于与 Ribbon 交互 @Autowired private DiscoveryClient discoveryClient; public Provide getProvide(String providerId) { RestTemplate restTemplate = new RestTemplate(); //获取服务提供者的所有实例列表,ServiceInstance 用于保存关于服务的特定实例(包括主机名、端口荷 URL) List<ServiceInstance> instances = discoveryClient.getInstances("provider-instance-name"); if (instances.size()==0) return null; //检索要调用的服务端点 String serviceUri = String.format("%s/providers/%s",instances.get(0).getUri().toString(), providerId); //使用标准的 Spring REST 模板类去调用服务 ResponseEntity< provider > restExchange = restTemplate.exchange( serviceUri, HttpMethod.GET, null, Provider.class, providerId); return restExchange.getBody(); } }
2.2、使用带有 Ribbon 功能的 Spring RestTemplate 调用服务
需要对 RestTemplate 类用 @LoadBalanced 注解显示声明;
@SpringBootApplication //只需要这个注解即可 public class Application { @LoadBalanced //告诉 Spring Cloud 创建一个支持 Ribbon 的 RestTemplate @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
使用 Ribbon 的 RestTemplate 来调用服务:
@Component public class ProviderRestTemplateClient { //自动注入即可,不用实例化 @Autowired RestTemplate restTemplate; public Provider getProvider(String providerId){ ResponseEntity<Provider> restExchange = restTemplate.exchange( //使用 Eureka 服务 ID 来构建目标 URL "http://provider-instance-name/providers/{providerId}", HttpMethod.GET, null, Provider.class, providerId); return restExchange.getBody(); } }
修改负载均衡策略:
2.3、使用 springcloud OpenFeign 客户端调用服务
参考:https://www.cnblogs.com/trustnature/articles/15896398.html
转自:https://www.cnblogs.com/dlhjw/p/15845348.html
posted on 2022-01-27 14:51 TrustNature 阅读(101) 评论(0) 编辑 收藏 举报