学习笔记2-客户端负载均衡
继续服务治理,开始客户端负载均衡的学习。由于之前的工程中已经将负载均衡整合到了工程所以。程序上没有大的变动。只是增加了配置信息,及验证。ps:学习资源来自spring+cloud微服务实战
2 客户端负载均衡 Spring Cloud Ribbon
spring cloud ribbon 是基于HTTP和TCP的客户端负载均衡工具,基于Netflix的Ribbon实现。
2.1 客户端负载均衡
服务端负载均衡与客户端负载均衡
负载均衡分为通常指服务端负载均衡,分为硬件负载均衡和软件负载均衡。二者都会下挂可用服务端清单,通过心跳检测来剔除有故障的服务节点以保持清单中都是可以正常访问的服务端节点。
当客户端发送请求到负载均衡设备时。设备按照算法(线性轮询、按权重负载、按流量负载等)从可用的服务端清单中取出一台服务端地址,进行请求转发。
客户端负载均衡和服务端负载均衡的最大的不同在于服务清单的存储位置。客户端负载均衡中所有客户端节点都会维护自己要访问的服务端清单(来自服务注册中心)。客户端负载均衡也需要心跳去维护服务端清单的健康性,这个步骤需要服务注册中心配合完成。
负载均衡作用:
- 系统高可用
- 缓解网络压力
- 处理能力扩容
使用方法
- 服务提供者启动多个服务实例并注册到注册中心。
- 服务消费者直接通过调用被
@LoadBalanced
注解修饰过的RestTemplate来实现面向服务的接口调用。
2.2 RestTemplate
针对几种不同请求类型和参数类型的服务调用。
2.2.1 GET请求
可以通过两种方法实现。
- 使用
getForEntity
方法返回ResponseEntity,该对象是spring对Http请求响应的封装。 - 使用
getForObject
该方法将http响应中的body内容转换为对象。
2.2.2 POST请求
- 使用
postForEntity
- 使用
postForObject
- 使用
postForLocation
,返回资源的URI
这里新增加了Object request 参数,该参数可以是一个普通对象,也可以是一个HttpEntity,后者会被当成HTTP请求对象处理。
2.2.3 PUT请求
使用put
2.2.4 DELETE
使用delete
2.3 参数配置
分为全局配置和指定客户端配置两种方式。
- 全局配置:
ribbon.<key> = <value>
例如:ribbon.ConnectTimeout=250 - 指定客户端配置:
<client>.ribbon.<key> = <value>
例如:<bookservice>.ribbon.listOfServers=localhost:8000, ...
更多的配置可以查看com.netflix.client.config.CommonClientConfigKey
区域化实例配置:eureka.instance.metedataMap.zone=shanghai
禁用eureka对ribbon服务实例的维护ribbon.eureka.enable=false
禁用之后listOfServers
参数配置的方式就能实现了。
2.4 重试机制
CAP原则: 一致性,可用性, 可靠性
Eureka服务治理机制强调AP原则,即接收故障实例不丢弃健康实例。关键在于保护机制,防止剔除故障服务实例。
由于Eureka在可用性与一致性上的取舍,不论是由于触发了保护机制还是服务剔除的延迟,引起服务调用到故障实例的时候,最好能够增加容错机制。因此,我们在实现服务调用的时候通常会加入一些重试机制。
客户端增加配置如下:
spring:
application:
name: customerclient
cloud:
loadbalancer:
retry:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
bookservice:
ribbon:
ConnectTimeout: 250
ReadTimeout: 1000
OkToRetryOnAllOperation: true
MaxAutoRetriesNextServer: 2
MaxAutoRetries: 2
spring.cloud.loadbalancer.retry.enable=true
启动重试机制hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
设置断路器超时时间,改时间必须大于ribbon超时时间,否则会触发重试。
ribbon中的设置一次为:请求连接超时时间、请求处理超时时间、所有操作进行重试、切换实例的重试次数、对当前实例的重试次数。