Ribbon2 核心设计分析

Ribbon 提供基于软件的负载均衡方式与目标集群中的机器进行通信。这里忽略状态统计部分,健康检查的逻辑部分。

下面是个典型的使用方式开始,先指定一些目标服务器地址,

//sample-client.ribbon.listOfServers=www.taobao.com:80,www.baidu.com:80,www.sina.com:80

然后借助ribbon 封装的 httpClient 来发送请求(访问站点首页),循环20次是希望打印出负载均衡的效果。

...
RestClient client = (RestClient) ClientFactory.getNamedClient("sample-client");
HttpRequest request = HttpRequest.newBuilder().setUri(new URI("/")).build();
for (int i = 0; i < 20; i++)  {
  HttpResponse response = client.executeWithLoadBalancer(request);
  System.out.println("Status code for " + response.getRequestedURI() + "  :" + response.getStatus());
}

下面按 Ribbon 的主要模块进行设计分析,并在最后部分分析上述代码的效果。

Ribbon-core 模块

这一模块中,主要定义通用的调用抽象。ribbon 的 client 处理请求并返回响应。

public interface IClient<S extends ClientRequest, T extends IResponse> {
    public T execute(S request, IClientConfig requestConfig) throws Exception;
}

ClientRequest, 是独立于所以具体实现的通信协议的抽象。它主要包括:uri(远程资源的定位符),loadBalancerKey(Object类型,这是决定请求调用到目标服务器的关键信息),isRetriable; 当然它的具体实现类,可能还有请求headers,body等信息。

IResponse, 是服务端响应的抽象,主要包括: body(payload),isSuccess(响应状态的简化),响应headers,请求url;

VipAddress 术语,是一个地址的逻辑名,该逻辑名代表一系列目标服务器。比如“apple.bar:80”。

RetryHandler,用来决定哪些异常(比如:ConnectException,SocketTimeoutException)发生时要做重试,哪些异常(SocketException,SocketTimeoutException)发生时表示应该熔断掉(对应服务器)的调用,默认的是不重试。

Ribbon-loadbalancer 模块

负载均衡,宏观上效果是希望将请求的流量均衡(不是简单意义上的平均)的负载到提供服务的服务器之上。而对于每次请求而言,是通过计算拿到一个目标服务器地址的。

  • ILoadBalancer

ILoadBalancer, 负载均衡器的接口。它的核心方法是 public Server chooseServer(Object key); 每次请求发生时根据参数传入的 loadBalancerKey对象,决定出一个目标的服务器地址。Server 表示一个服务器(包括:主机地址,端口号以及一些元数据标识信息)。 那么服务均衡器应该需要有一批可供选择的目标服务集合吧,所以它还有个重要方法 addServers(List<Server> newServers),一般在启动阶段就要完成初始化地调用。

  • BaseLoadBalancer

BaseLoadBalancer(实现 ILoadBalancer),这里声明了一个基础lb,应该关联个 IRule(负载均衡的规则)默认是轮询规则:RoundRobinRule)。 它还默认支持一个Ping检查功能(可以帮忙我们定时检查目标服务器是否可通信)的定时任务,开发者可以在构造实例时明确指定 Iping(判断一个服务是否还是活的),IPingStrateg 默认是串行地检查策略,但如果目标服务地址过多,或者IPing执行过慢就不太合适。

IRule 路由规则,Rule 和 LoadBalancer 是一对一的相互关联关系,Rule 是具体的负责均衡策略。常见的规则包括: 轮询,随机,基于响应的延迟等; public Server choose(Object key)核心方法的输入输出基本一致,区别是 Rule 拿取目标 server list 是通过借助对应依赖的 LoadBalancer 拿到的。

  • DynamicServerListLoadBalancer

DynamicServerListLoadBalancer(继承 BaseLoadBalancer),事实上从启动后一直不变的 ServerList 场景一般不太多,尤其在微服务场景:服务挂了,扩容,缩容等都会需要对服务消费方的客户端的服务列表做出实时调整(通常借助服务发现产品:eureka,consul,zk...),DynamicServerListLoadBalancer 顾名思义就是针对该类场景的。要做到运行时实时更新,既要保证更新的实时可见,也要保证更新操作本身的同步。

ServerListUpdater,是动态服务列表的更新器。现实场景中一般有个专门提供发布和查询/订阅服务列表服务的角色,这里暂时简称为”远程注册表服务”。更新 ServerList 常见的有两种实现模式:push 或者 pull。 push 机制就是客户端保持对“远程注册表服务”观察就行,服务器发生变化时会,客户端就会及时得到通知。 还有一种 pull 机制,一般是频繁的发请求进行询问“远程注册表服务”是否有变化发生。这个一般建议基于常见的服务发现产品进行实现。

ServerListFilter,是DynamicServerListLoadBalancer的可选构造参数之一。作用是在发生 ServerList 更新时筛选过滤出符合条件的一个子集。 因为 ServerList 可能比较大,包含成百上千台机器地址,如果都尝试去调用,那么客户端的连接数就会非常多,这也会造成必要的消耗。

Ribbon-httpclient 模块

ribbon-loadbalancer 模块中有个 ClientFactory 静态工具类,可以生成和管理多个名字唯一的 IClient 具体实例。ClientFactory.getNamedClient("sample-client");,这里因为未特殊配置(指定具体的 IClient 的实现类),所以选择的是默认的Client实现类 com.netflix.niws.client.http.RestClient。

  • RestClient

RestClient,是 ribbon-httpclient 模块中针对 IClient 的具体实现,通过使用 Jesery Client (实际依赖 apacheHttpClient4 发送 http),同样 HttpRequest 实现 ClientRequest,而HttpResponse 实现了 ClientResponse。

client.executeWithLoadBalancer(request),是client的父类 AbstractLoadBalancerAwareClient 中定义的方法,最终是调用 LoadBalancerContext#getServerFromLoadBalancer(URI,loadBalancerKey)方法,该方法主要LB逻辑如下:

Server svc = lb.chooseServer(loadBalancerKey);
if (svc == null){
    throw new ClientException(ClientException.ErrorType.GENERAL,
            "Load balancer does not have available server for client: "
                    + clientName);
}

//... check host not null

logger.debug("{} using LB returned Server: {} for request {}", new Object[]{clientName, svc, original});
return svc;
时间: 2024-10-27 19:51:32

Ribbon2 核心设计分析的相关文章

网站设计分析:用核心-路径法设计页面

中介交易 SEO诊断 淘宝客 云主机 技术大厅 译者注:文章的原名为Designing Screens Using Cores and Paths.本文作者受到城市规划中"交通需求线"的启发,提出了网站设计的"核心-路径法".区别于通常采用的从框架到主页以及导航的方式,"核心-路径法"让设计者从核心内容入手,由内而外来设计.这个打破常规的方法能够在网站中创造最直接的路径,以便用户找到核心内容. 链接原文:http://boxesandarrows

交互设计分析:紧紧围绕简单进行交互设计

文章描述:交互设计分析:紧紧围绕简单进行交互设计. 交互设计是近几年流行的一个词语.现在市场上有许多资料来介绍什么是交互设计,如何做交互设计等.从场景,任务,用户,操作等分析.但由于受实际情况的限制,往往不能很深入.所以笔者结合实际工作体验与大家分享下,具体做设计时候是怎么考虑的.如果要说什么是一个好的交互设计,个人浅见就是简单.本文以下内容都是围绕简单2字进行展开. 简单在本文中包括认知和操作两个部分: 1. 认知主要是指人的思维过程,本文中主要说明用户是如何做决定的: 2. 操作在本文中说明

交互设计分析:设计原则的要点

文章描述:交互设计分析:设计原则的要点. 在我们开始一个项目的设计的时候,脑子里肯定有无数的构想.是做视觉冲击强烈.夺人眼球的绚丽风格?还是复古的拼贴风?又或者目前最in的极简主义设计,让重点醒目的跃于画面之上?作为设计师,我们总是日积月累的收集各种各样的好创意,好的设计方案.但怎么能在那么多积累的想法中找到对即将开始的项目最合适它的创意或视觉效果呢? 除了靠我们作为设计师的本能感觉和一直以来积累的经验以外,还有一个很重要的东西能帮助我们决定,那就是--制定设计的原则. 什么是设计原则? 设计的

超干货!一套完整的设计分析思路应该是怎样的?

很多交互设计师特别是新手设计师,常常会出现接到一个需求不知道该从何下手的情况.比如一下两种常见场景. "需求是业务方的几句话描述,只能管中窥象的了解他们一些零零碎碎的想法,没理解到本质需求就开始画界面,然后不断的随着他们想法的转产而反复被动修改交互稿-" "PM已经画好完整的demo,交互看着似乎能做的只是根据demo做细节优化和完善,做着做着就迷茫了,设计的价值到底在哪呢?" 这些情况要解决的关键还是在于理清思路,本文主要是根据个人在各个大大小小的项目中总结而来的

《计算机网络课程设计(第2版)》——2.4节课程设计分析

2.4 课程设计分析 校验和的计算过程主要分为三个步骤:数据文件的输入.校验和的计算和校验结果的输出.其中,主要的是数据的输入和校验和的计算. 1. 数据的输入方式 输入数据可能是以字符形式存储的,而校验和的计算则要采用数据形式,所以在从文件读取数据时,都要进行字符到数据的相互转换. 1) 将读入的ASCII码转化为相应的整型变量. if(ch>='0'&&ch<='9') ch-='0'; else { if(ch>='a'&&ch<='f') c

Web API应用架构设计分析(1)

Web API 是一种应用接口框架,它能够构建HTTP服务以支撑更广泛的客户端(包括浏览器,手机和平板电脑等移动设备)的框架, ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台.本文主要以ASP.NET Web API 的框架实现来介绍整个Web API应用架构设计,但不局限于.NET的技术. 1.Web API的核心层设计 在目前发达的应用场景下,我们往往需要接入Winform客户端.APP程序.网站程序.以及目前热火朝天的

核心显卡是什么意思

  核心显卡是什么意思?随着整合时代的到来,如今很多处理器内部都集成了核心显卡,也就本文所说的核心显卡.那么,核心显卡是什么意思?它与我们过去所说的集成显卡又有哪些区别呢?这是很多菜鸟朋友所不够了解的,今天我们就来通俗易懂的科普一下核心显卡与集成显卡的关系. 核心显卡是什么意思? 核芯显卡是新一代的智能图形核心,它整合在智能处理器当中,依托处理器强大的运算能力和智能能效调节设计,在更低功耗下实现同样出色的图形处理性能和流畅的应用体验. 核心显卡的重点就是"心",它是Intel在酷睿i系

CCAI 2017 | 专访德国语言技术领军者 Hans Uszkoreit:深度学习还不足以解决 NLP 核心问题

会前,我们采访到了大会 Keynote 嘉宾.德国人工智能研究中心科技总监 Hans Uszkoreit 博士. Uszkoreit 博士是中德两国人工智能合作的核心人物,负责德国人工智能研究中心在中国的所有合作项目,今年 3 月,他刚被任命为在北京新成立的人工智能技术中心(AITC)总监兼首席科学家.在访谈中,Uszkoreit 博士谈到了人工智能在工业 4.0 和商业智能上的应用,以及中.美.欧在人工智能领域的差异. 对于他的老本行,Uszkoreit 博士认为,语言技术是人工智能的核心部分

珠三角已成为中国高端电子产品制造业核心

"广东此轮招商引资的目光,已从简单的'组装.制造'转向'核心技术'."广东省外经贸厅厅长梁耀文接受南方日报记者采访时,反复强调广东的经济产业正进行优化升级,而作为广东经济重要组成部分的外资招商,风向标也随之改变. 近20年来,美国微软.谷歌.苹果公司先后占据全球市值最高公司宝座,不可否认,这是个电子信息产业的时代.如何吸引全球500强的电子信息企业落户或增资,正是广东招商引资的重要部分. 上世纪80年代初,乘着改革开放之风,广东珠三角地区凭着优厚的政策和优越的地理位置,承接了大批来自香