上一讲讲了Ribbon的基础知识,通过一个简单的demo看了下Ribbon的负载均衡,我们在RestTemplate上加了@LoadBalanced注解后,就能够自动的负载均衡了。
目前项目多个区域多个集群,这些集群共用同一个Eureka集群。通过设置eureka.instance.metadata-map.zone设置不同实例所属的zone,zone之间不互相调用,只有zone内部调用(其实这里用zone做了集群隔离,实际上集群肯定是跨可用区的,这里的eureka中的zone在我们项目里面并不是可用区的概念)。
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面对服务的REST模块请求自动转换成客户端负载均衡的服务调用。
上文介绍了负载均衡器ILoadBalancer的基本内容,并且详述了基本实现:BaseLoadBalancer。它实现了作为ILoadBalancer负载均衡器的基本功能,比如:服务列表维护、服务定时探活、负载均衡选择Server等。
本文在前一篇文章的基础上来继续分析Ribbon的核心内容。 不懂Ribbon原理的可以进来看看哦,分析SpringBoot自动装配完成了Ribbon哪些核心操作
在上篇文章中(RestTemplate的逆袭之路,从发送请求到负载均衡)我们完整的分析了RestTemplate的工作过程,在分析的过程中,我们遇到过一个ILoadBalancer接口,这个接口中有一
这里通过@LoadBalance注解, 引入了ribbon, 自动实现ribbon的负载均衡策略
书接上篇,本文我们将来看看SpringCloud团队如何巧妙设计,完成客户端负载均衡器能够轻松从各个不同注册中心获取服务实例列表的过程。
Ribbon的作用是负载均衡,但是根据我面试他人的情况来看,很多人只忙于业务,而不清楚具体的底层原理,在面试中是很容易吃亏的。基于此,本文就来分析一下这里面的请求流程,里面贴的源码会比较多,如果看不惯的话,可以直接看最后的总结。
开篇提示:本文的讲解中,ribbon底层依赖于OkHttpClient,配置如下:
Ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为,一般都是Ribbon搭配Feign一起使用;Feign默认集成了ribbon
依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.2.3.RELEASE</version> </dependency> 配置 假设订单服务有两台,分别分8060、8061的两个服务 micro-order-service.ribbon.listOfServers=\
ribbon是Netflix开源的客户端负载均衡工具,ribbon实现一系列的负载均衡算法,通过这些负载均衡算法去查找相应的服务。ribbon被大家所熟知,可能是来源于spring cloud,今天就来聊聊如何单独使用ribbon来实现业务客户端负载均衡
本文主要研究一下RibbonLoadBalancerClient的choose方法
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。
ILoadBalancer负责存储并更新服务实例列表,并调用IRule(即根据配置的负载均衡规则)来返回Server以供于服务调用
二、FeignClent注解剖析+Spring Cloud Feign基本功能配置解读
大家好,本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码。本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文章写了一半发现,如果不把Ribbon好好讲清楚,那么有些Ribbon的细节理解起来就很困难,所以我还是打算单独写一篇文章来剖析Ribbon的源码,这样在讲Feign整合Ribbon的时候,我就不再赘述这些细节了。好了,话不多说,直接进入主题。
调用时,直接使用在eureka中注册的服务名进行调用,就可以由ribbon来进行负载均衡了
前面说过在微服务架构中, 各个服务之间通常是基于HTTP的Restful API进行通信, Spring Cloud有两种服务调用方式,一种是Ribbon+RestTemplate,另一种是Feign,本文先将讲解前者
载均衡算法数量较多,而且可以根据一些业务特性进行定制开发,抛开细节上的差异,根据算法期望达到的目的,大体上可以分为下面几类。
在微服务环境下每个服务实例少则几个,多则上百个,如何让请求均匀分布到各服务实例上是微服务架构下必须解决的一个问题,这方面有2种解决方案:
Nacos 提供了开放 API 可通过 /nacos/v1/ns/instance/list 获取服务列表。如果我们采用 spring-cloud 方式去获取服务,最终会通过 Nacos Client + loadbalancer 的方式进行客户端负载均衡。
假设有一个分布式系统,该系统由在不同计算机上运行的许多服务组成。但是,当用户数量很大时,通常会为服务创建多个副本。每个副本都在另一台计算机上运行。此时,出现 “Load Balancer(负载均衡器)”。它有助于在服务器之间平均分配传入流量。
以下项目可以参考:https://github.com/HashZhang/ScanfoldAll/tree/master/Scanfold-SpringCloud/Scanfold-SpringCloud-Ribbon/Scanfold-SpringCloud-RibbonOnly
上一篇讲了Ribbon的初始化过程,从LoadBalancerAutoConfiguration 到RibbonAutoConfiguration 再到RibbonClientConfiguration,我们找到了ILoadBalancer默认初始化的对象等。
随着微服务、云源生的流行,多云、多区域(zone)、跨机房部署的case越来越多。Ribbon作为微服务领域的优秀组件,自然也提供了对多区域支持的负载均衡能力。
1. Eureka服务配置与进阶 1.1. 主要配置 1.1.1. 服务端(eureka.server.*) enableSelfPreservation默认true,启用注册中心的自保护机制,Eureka如果统计到15分钟之内损失>15%的微服务心跳,则会触发自保护机制,不再提出服务提供者 waitTimeInMsWhenSyncEmpty默认1000605,在Eureka服务器获取不到集群里对等服务器上的实例时,需要等待的时间,单位为毫秒,单机开发模式建议设置为0 1.1.2. 客户信息配置(eurek
上篇文章我们详细的介绍了RestTemplate发送请求的问题,熟悉Spring的小伙伴可能会发现:RestTemplate不就是Spring提供的一个发送请求的工具吗?它什么时候具有了实现客户端负载
如需自定义负载均衡规则,只需实现IRule 接口或继承AbstractLoadBalancerRule、PredicateBasedRule即可 ,读者可参考 RandomRule 、 RoundRobinRule、 ZoneAvoidanceRule 等内置Rule编写自己的负载均衡规则。
在上一篇文章,讲了服务的注册和发现。在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。在这一篇文章首先讲解下基于ribbon+rest。
在SpringCloud中,我们最常使用到的负载均衡库就是ribbon。使用方式,一般是通过自动配置类注入,然后在类中定义负载均衡实例bean
个人博客纯净版:https://www.fangzhipeng.com/springcloud/2018/08/02/sc-f2-ribbon.html
在学习Ribbon之前,先看一下这张图,这张图完美的把Ribbon的基础架构给描述出来了
ribbon依赖包含spring-cloud-commons依赖,而在spring-cloud-commons包中spring.factories自动配置LoadBalancerAutoConfiguration类:
Spring Cloud Zuul是Spring Cloud在Netflix开源的Zuul网关的基础上,经过整合与增强实现的生产级别的微服务网关系统。
Ribbon是一个客户端负载平衡器,它可以很好地控制HTTP和TCP客户端的行为。Feign已经使用Ribbon,所以如果你使用@FeignClient,那么这一节也适用。
现在已经了解了 Ribbon 的负载均衡原理,我们可以来猜想下,Feign 的原理,仅仅通过一个注解 @FeignClient + 一个接口,就可以服务之间的调用。
优雅停机,通常是指在设备、系统或应用程序中止运作前,先执行一定的流程或动作,以确保数据的安全、预防错误并保证系统的整体稳定。
负载均衡(Load Balance), 是利用特定的方式将流量分摊到多个操作单元上的一种手段, 它对系统吞吐量和系统处理能力有质的提升. 可分为软负载和硬负载, 软负载即通过软件的方式实现负载均衡, 软负载有分为客户端负载和服务端负载, Ribbon 属于客户端负载均衡.
可以看到,在整合 Ribbon 之前,请求Rest是通过IP端口直接请求。整合 Ribbon 之后,请求的地址改成了 http://applicationName ,官方取名为虚拟主机名(virtual host name),当 Ribbon 和 Eureka 配合使用时,会自动将虚拟主机名转换为微服务的实际IP地址,我们后面会分析这个过程。
1.下面的2个配置对单个接口超时并没有起作用,作为eureka客户端使用时,起作用的其实是默认超时时间,作为普通http客户端时,起作用的其实也是默认超时时间。
领取专属 10元无门槛券
手把手带您无忧上云