Ribbon(有关介绍见RestTemplate末尾)

Ribbon负载均衡实现策略

Ribbon负载均衡实现策略通过接口IRule进行实现,默认使用ZoneAvoidanceRule规则进行负载均衡。

实现自定义负载均衡算法:

使用@Configuration注解进行配置

@Configuration
public class RibbonConfig {
@LoadBalanced //如果使用了loadBalancerClient进行了代理,则已经做过一次负载均衡,此处的注解不能加
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}

可以将主启动类中的RestTemplate配置转入到此类中。在此类中可以通过@Bean 创建IRule的实例来实现替换负载均衡的规则:

编写规则类的时候需要继承AbstractLoadBalancerRule ,最上层还是实现IRule接口,但是如果直接实现IRule接口的话,需要实现其中的三个方法,比较繁琐,并不推荐:

如果继承AbstractLoadBalancerRule类的话还是实现了IRule接口,但是对于setLoadBalancer方法和getLoadBalancer方法在其中已经默认实现了,不需要我们再去进行实现:

继承抽象方法的负载均衡算法是需要实现两个方法:

initWithNiwsConfig中基本不需要实现,这个方法是初始化一些配置信息。我们将方法编写在choose方法中。

我们也可以通过配置文件远程指定负载均衡策略:

前面添加的是服务提供者的名字,后面指定负载均衡算法的位置即可。

官方提供了很多种已经实现好的负载均衡算法可供选择:


Ribbon的组成

远程配置扩展接口:


Nacos实现权重负载均衡

启动两台以上的服务提供者,客户端的负载均衡算法必须为NacosRule负载均衡算法:

打开Nacos服务面板,点击服务管理-服务列表找到对应的服务:

点击详情进入配置面板:

通过点击编辑按钮,配置每一个服务的权重值:


Nacos实现优先调用同集群服务功能

客户端调用服务时,如果有两个同样的服务一个在同集群,一个在另外的集群中,会优先调用与客户端在同集群中的服务。只有当同集群的集群宕机了,才会从另外的集群中调用服务,在客户端中同时也会出现调用其他集群的警告信息。应用场景:异地容灾

实现方式:需要在客户端和服务端的配置文件中增加配置:

后面添加所指向的集群名称。


实现基于版本的负载均衡策略

客户端指定调用版本的服务,在配置文件中指定版本号。服务端在配置文件中配置版本号。符合客户端中的版本的服务,才会被调用。

服务端配置:

客户端配置:

​ spring.cloud.discoery.metadata.version=v2

实现策略:

public class MyRuleRibbon extends AbstractLoadBalancerRule {

    @Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties; //Logger是Log4j包里面的类 主要用来书写日志文件 和输出相关报错信息 并将报错或异常信息输出到控制台或日志文件 private修饰符 将产生的Logger对象私有化 static修饰符表示静态的 总之只有一个对象产生
private static final Logger log = LoggerFactory.getLogger(MyRuleRibbon.class); public void initWithNiwsConfig(IClientConfig iClientConfig) {
//初始化一些配置信息,不需要我们实现
} public Server choose(Object key) {
System.out.println("正在使用MyRuleRibbon基于版本号的负载均衡算法");
//负载均衡规则:优先选择同集群下,符合metadata的实例
//如果没有,就选择所有集群下,符合metadata的实例
//===================================================
//1.查询所有实例A
//2.筛选元数据匹配的实例B
//3.筛选出同cluster下元数据匹配的实例C
//4.弱国C为空,就用B
//5.随机选择实例
//===================================================
try{
String clusterName = this.nacosDiscoveryProperties.getClusterName();
final String targetVersion = this.nacosDiscoveryProperties.getMetadata().get("version"); DynamicServerListLoadBalancer listLoadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
String name = listLoadBalancer.getName(); NamingService namingService = this.nacosDiscoveryProperties.namingServiceInstance(); //所有实例
List<Instance> instances = namingService.selectInstances(name,true); List<Instance> metadataMatchInstances = instances; //如果配置了版本映射,那么只调用元数据匹配的实例
if (StringUtils.isNotBlank(targetVersion)){
metadataMatchInstances = instances.stream()
.filter(instance-> Objects.equals(targetVersion,instance.getMetadata().get("version")))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(metadataMatchInstances)){
log.warn("未找到元数据匹配的目标服务实例,请检查配置:targetVersion = {},instance = {}",targetVersion,instances);
return null;
}
}
List<Instance> clusterMetadataMatchInstances = metadataMatchInstances;
//如果配置了集群的名称,需要筛选同集群下元数据匹配的实例
if (StringUtils.isNotBlank(clusterName))
{
clusterMetadataMatchInstances = metadataMatchInstances.stream()
.filter(instance -> Objects.equals(clusterName,instance.getClusterName()))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(clusterMetadataMatchInstances)){
clusterMetadataMatchInstances = metadataMatchInstances;
log.warn("发生跨集群调用,clusterName = {},targetVersion = {}, clusterMetadataMatchInstance={}",clusterName,targetVersion,clusterMetadataMatchInstances);
}
}
Instance instance = ExtendBalancer.getHostByRandomWeight2(clusterMetadataMatchInstances);
return new NacosServer(instance);
} catch (Exception e) {
log.warn("发生异常",e);
return null;
} }
}

Nacos不可以跨命名空间调用

服务可以指定命名空间:

dev 可以替换为命名空间的id来指定一个唯一的命名空间

Spring Cloud Aliaba - Ribbon的更多相关文章

  1. spring cloud 使用ribbon简单处理客户端负载均衡

    假如我们的multiple服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端口8762修改 ...

  2. spring cloud: 关闭ribbon负载均衡

    spring cloud: 关闭ribbon负载均衡 1.eureka服务 2.2个user服务:7900/7901 3,movie服务 movie服务去请求 user的用户信息,而此时只想请求790 ...

  3. Spring Cloud 之 Ribbon

    新建Spring Boot工程,命名为ribbon 1.pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"? ...

  4. 笔记:Spring Cloud Feign Ribbon 配置

    由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...

  5. Spring cloud 之Ribbon(一)基本使用

    简介 Spring cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它是基于Netflix的Riboon实现的.Ribbon是客户端负载均衡器,这有别语例如Nginx服务端负载 ...

  6. Spring Cloud Gateway Ribbon 自定义负载均衡

    在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...

  7. 从零开始学spring cloud(六) -------- Ribbon

    一.Ribbon介绍 Ribbon就是客户端侧负责均衡实现的一种方式,那么Ribbon是什么呢? Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端侧负载均衡算法.Ribb ...

  8. spring cloud 自定义ribbon客户端

    一.自定义Ribbon客户端-[方式一]配置类 1.1.自定义负载规则 增加RibbonConfiguration.java配置类 public class RibbonConfiguration { ...

  9. Spring Cloud Feign Ribbon 配置

    由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...

随机推荐

  1. Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记

    目录 k8s高可用架构解析 Kubeadm基本环境配置 Kubeadm系统及内核升级 Kubeadm基本组件安装 Kubeadm高可用组件安装 Kubeadm集群初始化 高可用Master及Token ...

  2. AcWing 1127. 香甜的黄油

    农夫John发现了做出全威斯康辛州最甜的黄油的方法:糖. 把糖放在一片牧场上,他知道 N 只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油. 当然,他将付出额外的费用在奶牛上. 农夫John很狡猾, ...

  3. Nacos实战一:架构及部署

    2018年,阿里巴巴开源 Nacos,由此成为继 Eureka.Consul.Apollo 等服务注册发现&配置的又一开源框架,到如今2021年,Nacos 已经历了 0.01->1.4 ...

  4. ESP32的Flash加密知识

    一.Flash 加密功能用于加密与 ESP32-S2 搭载使用的 SPI Flash 中的内容.启用 Flash 加密功能后,物理读取 SPI Flash 便无法恢复大部分 Flash 内容.通过明文 ...

  5. python使用笔记25--深拷贝、浅拷贝

    1.循环删除list 1 ll = [1,1,32,4,3,2,3,2,4,6,4,5,6,7,8] 2 for i in ll: 3 if i % 2 !=0: 4 ll.remove(i) 5 p ...

  6. python 交换变量的值 不需要借助第三个变量

    >>> a,b,c,d=1,2,3,4>>> a,b,c,d=d,c,b,a>>> print(a,b,c,d)4 3 2 1>>&g ...

  7. [.NET大牛之路 003] .NET 的发展简史

    如果你热爱某产品,你一定想了解它的历史.今天我们简单回顾一下 .NET 平台的发展历史,来看看它在历史上的里程碑,这对我们更好地了解和学习 .NET 有着重要的意义. 微软 .NET 战略初衷 20 ...

  8. apt-key Debian packages密钥管理命令

    adv子命令 Pass advanced options to gpg. With adv --recv-key you can e.g. download key from keyservers  ...

  9. Android系统编程入门系列之界面Activity响应丝滑的传统动画

    上篇文章介绍了应用程序内对用户操作响应的相关方法位置,简单的响应逻辑可以是从一个界面Activity跳转到另一个界面Activity,也可以是某些视图View的相对变化.然而不管是启动一个界面执行新界 ...

  10. 【Mysql】InnoDB 中的 B+ 树索引

    接上一篇内容,InnoDB 的作者想到一种更灵活的方式来管理所有目录项,是什么? 一.目录项记录页 其实这些用户目录项与用户记录很像,只是目录项中的两个列记录的是主键和页号而已,那么就可以复用之前存储 ...