扩展Ribbon支持Nacos集群配置

标签: Spring Cloud Alibaba Spring Cloud Ribbon Spring Cloud Alibaba | 发表时间:2019-06-30 17:11 | 作者:
出处:http://www.itmuch.com/

在Nacos上,支持集群配置。集群是对指定微服务的一种虚拟分类。集群还是比较有用的,例如:

  • 为了容灾,把指定微服务同时部署在两个机房(例如同城多活【其中1个机房崩溃另一个机房还能顶】、异地多活【防止自然灾害,例如地震什么的】),比如南京机房和北京机房。
    • 调用时,可优先调用同机房的实例,如果同机房没有实例,再跨机房调用。

当然cluster还有很多其他作用,请各位看客自行脑补,本文将围绕上面描述的场景展开。

虽然Spring Cloud Alibaba支持集群配置,例如:

1     
2
3
4
5
6
spring:     
cloud:
nacos:
discovery:
# 北京机房集群
cluster-name: BJ

但在调用时,服务消费者并不会优先调用同集群的实例。

本节来探讨如何扩展Ribbon,从而实现 同集群优先调用的效果,并且还能 支持Nacos权重配置。关于权重配置,在 扩展Ribbon支持Nacos权重的三种方式 一文中已经写得比较详细了。本文在前面的基础上实现同集群优先策略。

写代码

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**     
* 支持优先调用同集群实例的ribbon负载均衡规则.
*
* @author itmuch.com
*/
@Slf4j
public class NacosRule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;

@Override
public Server choose(Object key) {
try {
String clusterName = this.nacosDiscoveryProperties.getClusterName();
DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
String name = loadBalancer.getName();

NamingService namingService = this.nacosDiscoveryProperties.namingServiceInstance();

List<Instance> instances = namingService.selectInstances(name, true);
if (CollectionUtils.isEmpty(instances)) {
return null;
}

List<Instance> instancesToChoose = instances;
if (StringUtils.isNotBlank(clusterName)) {
List<Instance> sameClusterInstances = instances.stream()
.filter(instance -> Objects.equals(clusterName, instance.getClusterName()))
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(sameClusterInstances)) {
instancesToChoose = sameClusterInstances;
} else {
log.warn("发生跨集群的调用,name = {}, clusterName = {}, instance = {}", name, clusterName, instances);
}
}

Instance instance = ExtendBalancer.getHostByRandomWeight2(instancesToChoose);

return new NacosServer(instance);
} catch (Exception e) {
log.warn("NacosRule发生异常", e);
return null;
}
}

@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
}

负载均衡算法:

1     
2
3
4
5
6
7
8
9
10
11
12
// Balancer来自于com.alibaba.nacos.client.naming.core.Balancer,也就是Nacos Client自带的基于权重的负载均衡算法。     
public class ExtendBalancer extends Balancer {
/**
* 根据权重,随机选择实例
*
* @param instances 实例列表
* @return 选择的实例
*/
public static Instance getHostByRandomWeight2(List<Instance> instances) {
return getHostByRandomWeight(instances);
}
}

写配置

1     
2
3
microservice-provider-user:     
ribbon:
NFLoadBalancerRuleClassName: com.itmuch.cloud.study.ribbon.NacosClusterAwareWeightedRule

这样,服务在调用microservice-provider-user 这个服务时,就会优先选择相同集群下的实例。

配套代码

相关 [扩展 ribbon nacos] 推荐:

扩展Ribbon支持Nacos集群配置

- - 周立的博客 - 关注Spring Cloud、Docker
在Nacos上,支持集群配置. 集群是对指定微服务的一种虚拟分类. 为了容灾,把指定微服务同时部署在两个机房(例如同城多活【其中1个机房崩溃另一个机房还能顶】、异地多活【防止自然灾害,例如地震什么的】),比如南京机房和北京机房. 调用时,可优先调用同机房的实例,如果同机房没有实例,再跨机房调用. 当然cluster还有很多其他作用,请各位看客自行脑补,本文将围绕上面描述的场景展开.

聊聊 Nacos 配置隔离和分类的使用

- - IT瘾-dev
最近在使用Nacos来作为配置中心和注册中心,在使用的过程难免会有些问题. 有的是框架问题,有的是使用方式的问题,不久前也分享了一篇 《最近使用Nacos的一些问题》,感兴趣的可以看看. 今天要聊的话题也是在使用过程中发现的,主要是前期赶进度太忙了,停下来之后才有时间去整理,去思考更优的方式. 环境隔离是最基本的一个需求,在日常开发过程中,常需要不同的环境,比如开发,测试,预发,线上环境.

Microsoft 展示加入 Ribbon 界面的 Windows 8 Explorer

- leafduo - Engadget 中国版
在 Microsoft 的新系统 Windows 8 中的许多既有功能,若没有被大肆的重新改造过,都至少经过一些细微的调整,其中也包括了目前尚未公布的新版 Windows Explorer 程序. 有如其它的 Windows 8 程序,这次已经用了 N 年没变的 Windows 档案管理程序,加入了当年首度出现在 Office 2007 上的「Ribbon 接口」,也对触控操作变得更为友善.

评论:Windows 8 Ribbon UI分析:反对出于成见

- Adam - cnBeta.COM
Window 8中Ribbon UI的地位已经是板上钉钉了,无论反对的呼声再高,也无法阻止这一变化了. 实际上如果真正去体会Ribbon的设计,可以看出反对不过是出于成见和习惯而已. 本文以资源管理器为案例,对Ribbon UI的一些设计做一些初步的分析.

Netflix发布云中间层服务开源项目Ribbon

- - InfoQ cn
1月28日,全球最大的互联网视频提供商Netflix在自己的技术团队博客上 发布文章,对外公布了他们的开源项目Ribbon,其主要功能是将Netflix的中间层服务连接在一起. 文章开头说到Ribbon项目的背景:. Netflix使用了细粒度的SOA架构,这是我们基于云的部署模式的根基. 目前,我们运行着上百个细粒度服务,使用诸如Netflix API Services这样的“边缘服务(Edge Service)”,共同负责处理面向客户的请求.

为Spring Cloud Ribbon配置请求重试(Camden.SR2+)

- - 程序猿DD
下面的例子,实现了对服务名为 hello-service的 /hello接口的调用. 由于 RestTemplate被 @LoadBalanced修饰,所以它具备客户端负载均衡的能力,当请求真正发起的时候,url中的服务名会根据负载均衡策略从服务清单中挑选出一个实例来进行访问. 大多数情况下,上面的实现没有任何问题,但是总有一些意外发生,比如:有一个实例发生了故障而该情况还没有被服务治理机制及时的发现和摘除,这时候客户端访问该节点的时候自然会失败.

Chrome Remote Desktop 扩展

- Larry Li - Wow! Ubuntu
Google 发布了一款重量级的 Chrome 扩展,名为 Chrome Remote Desktop,通过它你可直接在 Chrome/Chromium 浏览器上远程访问其它人的电脑,或共享自已的电脑让别人远程遥控. Chrome Remote Desktop 目前还处于 Beta 阶段,它是一款跨平台软件,完全支持 Windows, Linux, Mac 和 Chromebooks,使用条件是你必须具备一个 Google 帐号.

腾讯CMEM的PHP扩展

- duyue - 平凡的世界
最近公司在做相关的业务,由于Memcached协议缺少返回码,为了保证业务数据的安全性,不得已只好自己写个扩展来实现需求. 基于memcache扩展的2.2.6的稳定版开发而来. 代码已经开源,有需要的朋友请拿走,License是PHP License,请自觉遵守. 项目主页:http://code.google.com/p/cmem/.

ibus的GNOME Shell扩展

- 小汐 - 画猫不成反类虎
更新代码,支持横排模式(设置后需要重启gnome shell). 这个扩展使用了ibus的一些新API,该API还没有发布,需要自行编译ibus的git仓库代码. 以前说过GNOME3的一个缺点,在通知栏聊天时,无法看到ibus的候选词界面,确切地说是候选词界面被通知栏聊天界面挡住了. 这是GNOME Shell的架构所决定的,目前没有方法可以绕过(除非修改GNOME Shell)本身.

Chrome+Firefox 扩展推荐

- - 笨兔兔
Adblock – 阻击网页广告. Google Mail Checker – Gmail 收件箱提示. Turn Off The Lights –观看网页视频时候”关灯”. Google Chrome to Phone –将链接或信息直接发送到Android 手机上. IE Tab –Chrome 下使用IE风格显示网页.