SpringCloud入门之Ribbon

服务消费者:服务的发现有eureka的客户端实现,而服务的消费由Ribbon实现。
Ribbon是基于TCP/http的客户端的负载均衡器,可以在客户端配置ribbonServerList用轮询服务达到负载均衡的作用,当ribbon与eureka联合使用时,Ribbon的服务实例清单的RibbonServerList 还会被DiscoveryEnabledNIWSServerList 重写,扩展成从Eureka 注册中心获取服务端列表。同事他也会NIWSDiscoveryPing代替IPing,他将职责委托Eureka来确定服务是否已经启动。

RestTemplate 使用Ribbon实现负载均衡进行服务的消费

API:
针对 get 请求
getForEntity 返回的是ResponseEntity对象 该对象封装了HTTP请求的状态码,请求体对象 请求头
本方法实现了三种重载
1.getForEntity(“url”,Clazz); 请求额Url及返回的实体
2.getForEntity(“url”,Clazz,Object…args); 本方法中的第三个参数是为url实现占位符参数拼接
例如 url:http://HELLO-SERVICE/test/user?name={1} 用{param}实现占位符
3.getForEntity(url,clazz,Map) 将占位符的参数名设置为与Map 集合中的键一一对应实现参数的赋值

getForObject() 对getForEntity的再次封装与getForEntity类似有三种重载

针对 post 请求
postForEntity 返回ResponseEntity 泛型是指返回的实体对象
postForEntity(url,clazz,Object request,params) 参数用作和url拼接
postForObject 和 postForEntity 类似将响应的body封装为对象返回
postForLocation 返回 URI 对象 此方法无需指定clazz参数 因为返回的是URI

针对 put 请求
put 请求的函数名为put 使用的重载与postForEntity 类似,无返回类型
针对 DELETE 请求
与put 类似执行delete函数无需body中的信息

Ribbon 使用 @LoadBalanced 实现负载均衡 有两个条件
RestTemplate 类必须存在于当前工程中
在Spring 的bean工程中必须要有一个LoadBalancerClient 的实现bean
ribbon 的负载均衡策略
三个集合 分别是 所有的服务实例 可用的服务实例 不可用的服务实例
RandomRule 该策略是从服务清单中随机出一个服务实例的功能。
利用选择server是否为空来判断是否返回,如果出现了死循环或者无法获取服务实例是出现了并发的bug

RoundRobinRule 该策略采用线性轮询的方式 会有一个循环次数的累计,如果循环十次也是无法取得服务的实例则会打出警告并且停止访问

RetryRule 该策略是会在设置的时间内反复调用内部设置的策略函数去获取实例,如果在规定的时间超出仍无法获取实例,返回null

WeightResponseTimeRule 该策略是以实例运行的情况来挑选实例,以达到更优的分配效果
启动定时任务来进行服务实例的权重计算,每30s计算一次。
A B C D 响应时间 10 20 30 40
则总的响应时间就是 10 + 20 + 30 + 40 = 100

A 的权重 = 0 + 100 - 10 = 90 区间[0,90]
B 的权重 = 90 + 100 - 20 = 170 区间(90,170]
C 的权重 = 170 + 100 - 30 = 240 区间(170,240]
D 的权重 = 240 + 100 - 40 = 300 区间(240,300)

平均响应时间最短的 权重区间则是越大 下次被选中的可能性也是越大

ClientConfigEnabledRoundRobinRule
该策略实现了RoundRobinRule 一般不是直接实现,是通过被继承来进行拓展从而实现高级策略

BestAvailableRule 该策略继承了ClientConfigEnabledRoundRobinRule 在线性轮询的基础上加入了loadBalancerStarts 保存的十里统计信息来选在满足要求的实例,本策略是可以过滤掉故障的实例,选择出空闲的实例。

PredicateBaseRule 是一个抽象策略,继承自ClientConfigEnabledRoundRobinRule Predicate 是Google Guava Collection 工具对集合进行过滤的条件接口,先使用该接口进行过滤,然后采用线性轮询的方式产生实例。Guava Clollections 可以快速处理集合,简短处理,大大的增加了代码的可读性。

Ribbon 配置详解
自动化配置:
IClientConfig:Ribbon 的客户端配置,默认采用com.netflix.client.config.DefaultClientConfigImpl 实现

IRule:负载均衡策略,采用com.netflix.loadbalancer.zoneAvoidanceRule 实现,该策略能在多区域的环境下选出最佳区域的实例进行访问。

Iping:Ribbon 的实例检查策略,默认采用com.netflix.loadbalancer.NoOpPing来实现,该检查策略是一特殊的实现,默所以的实例是可用的。

ServerList 服务实例清单的维护机制

ServerListFilter 服务的实例清单的过滤机制,该策略能优先过滤出与请求调用方处于同区域的服务实例

ILoadBalancer:负载均衡器采用ZoneAwareLoadBalancer 实现,具备有区域感知的能力
手动配置:
利用@Configuration @bean 来顶替上面的配置

猜你喜欢

转载自blog.csdn.net/qq_36755772/article/details/88954289