Spring Cloud - 4 (Spring Cloud Netflix Ribbon)
Eureka 高可用架构
高可用注册中心集群
只需要增加Eurke服务器注册URL:
## Eureka Server 服务 URL,用于客户端注册
eureka.client.serviceUrl.defaultZone=http://localhost:9090/eureka,http://localhost:9091/eureka
如果Eureka客户端应用配置了多个Eureka注册服务器,那么默认情况只有第一台可用的服务器,存在注册信息。
如果第一台可用的Eureka服务器Down掉了,那么Eureka客户端应用将会选择下一台可用的Eureka服务器。
配置源码(EurekaClientConfigBean)
配置项eureka.client.serviceUrl实际映射的字段为serviceUrl,它是Map类型,Key为自定义,默认值“defaultZone”,value是需要配置的Eureka注册服务器URL。
private Map<String, String> serviceUrl = new HashMap<>();
{
this.serviceUrl.put(DEFAULT_ZONE, DEFAULT_URL);
}
value可以是多值字段,通过“,”分割:
public List<String> getEurekaServerServiceUrls(String myZone) {
String serviceUrls = this.serviceUrl.get(myZone);
if (serviceUrls == null || serviceUrls.isEmpty()) {
serviceUrls = this.serviceUrl.get(DEFAULT_ZONE);
}
if (!StringUtils.isEmpty(serviceUrls)) {
final String[] serviceUrlsSplit = StringUtils
.commaDelimitedListToStringArray(serviceUrls); //“,”分割
List<String> eurekaServiceUrls = new ArrayList<>(serviceUrlsSplit.length);
for (String eurekaServiceUrl : serviceUrlsSplit) {
if (!endsWithSlash(eurekaServiceUrl)) {
eurekaServiceUrl += "/";
}
eurekaServiceUrls.add(eurekaServiceUrl.trim());
}
return eurekaServiceUrls;
}
return new ArrayList<>();
}
获取注册信息时间间隔
Eureka 客户端需要获取Eureka服务器注册信息,方便服务调用。
Eureka客户端:EurekaClient,关联应用集合:Applications
单个应用信息:Application,关联过个应用实例
单个应用实例:InstanceInfo
当Eureka客户端需要调用具体某个服务时,比如user-service-consumer调用user-service-provider,user-service-provider实际应用对象时Application,关联了许多应用实例(InstanceInfo)。
如果应用user-service-provider的应用实例发生变化时,那么user-service-consumer是需要感知的。比如user-service-provider服务器从10台降到了5台,那么,作为调用方的user-service-consumer需要知道这个变化情况。可是这个变化过程,可能存在一定的延迟,可以通过调整注册信息时间间隔来减少错误。
注:user-service-consumer服务调用者,user-service-provider服务提供者
具体配置项
##调整注册信息的获取周期,默认值:30秒
eureka.client.registry-fetch-interval-seconds=5
实例信息复制时间间隔
就是客户端信息上报到Eureka服务器的时间。当Eureka客户端应用上报的频率越频繁,那么Eureka服务器的应用状态管理一致性就越高。
具体配置项
##调整客户端应用状态上报的周期
eureka.client.instance-info-replication-interval-seconds= 5
Eureka的应用信息获取方式:拉模式
Eureka的应用信息上报的方式:推模式
实例ID
从Eureka Server Dashboard里面可以看到具体某个应用中的实例信息,比如:
UP (2) - 192.168.1.103:user-service-provider:7077 , 192.168.1.103:user-service-provider:7070
其中,它们的命名模式:
${hostname}:${spring.application.name}:${server.port}
实例类:EurekaInstanceConfigBean
配置项
##Eureka 客户端应用实例的ID
eureka.instance.instance-id=${spring.application.name}:${server.port}
#
实例端点映射
源码位置:EurekaInstanceConfigBean
private String actuatorPrefix = "/actuator";
private String statusPageUrlPath = actuatorPrefix + "/info";
配置项
## Eureka 客户端应用实例状态URL
eureka.instance.status-page-url-path=/actuator/health
Eureka服务端高可用
构建Eureka服务器相互注册
Eureka Server1 -> Proflie:peer1
配置项
spring.application.name=eureka-server
server.port=9090
##取消服务器自我注册
eureka.client.register-with-eureka=true
##不需要检索服务
eureka.client.fetch-registry=true
## Eureka Service 服务URL,用于客户端注册
eureka.client.serviceUrl.defaultZone=http://localhost:9091/eureka
Eureka Server1 -> Proflie:peer2
配置项
spring.application.name=eureka-server
server.port=9091
##取消服务器自我注册
eureka.client.register-with-eureka=true
##不需要检索服务
eureka.client.fetch-registry=true
## Eureka Service 服务URL,用于客户端注册
eureka.client.serviceUrl.defaultZone=http://localhost:9090/eureka
通过 —spring.profiles.active=peer1 和 —spring.profiles.active=peer2 分别激活 Eureka Server1 和 Eureka Server2
Eureka Server1 里面的replicas信息:
registered-replicas | http://localhost:9091/eureka/ |
Eureka Server2 里面的replicas信息:
registered-replicas | http://localhost:9090/eureka/ |
Spring RestTemplate
HTTP消息转换器:HttpMessageConvertor
自定义实现
编码问题
切换序列化/反序列化的协议
HTTP Client 适配工厂:ClientHttpRequestFactory
Spring实现
- SimpleClientHttpRequestFactory
HTTPClient
- HttpComponentsClientHttpRequestFactory
OkHttp
- OkHttp3ClientHttpRequestFactory
- OkHttpClientHttpRequestFactory
举例说明
RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory()); //HTTP Client
切换HTTP通讯实现,提升性能
HTTP请求拦截器:ClientHttpRequestInterceptor
加深RestTemplate拦截过程
整合NetFlix Ribbon
RestTemplate增加一个LoadBalancerInterceptor,调用Netfilx中的LoadBalander实现,根据Eureka客户端应用获取目标应用IP+Port信息,轮询的方式调用。
实际请求客户端
LoadBalancerClient
- RibbonLoadBalancerClient
负载均衡上下文
LoadBalancerContext
- RibbonLoadBalancerContext
负载均衡器
ILoadBalancer
- BaseLoadBalancer
- DynamicServerListLoadBalancer
- ZoneAwareLoadBalancer
- NoOpLoadBalancer
负载均衡规则
核心规则接口
IRule
- 随机规则:RandomRule
- 最可用规则:BestAvailableRule
- 轮询规则:RoundRobinRule
- 重试实现:RetryRule
- 客户端配置:ClientConfigEnableRoundRobinRule
- 可用性过滤规则:AvailabilityFilteringRule
- RT权重规则:WeightedResponseTimeRule
- 规避区域规则:ZoneAvoidanceRule
PING策略
核心策略接口
IPingStrategy
PING接口
IPing
- NoOpPing
- DummyPing
- PingConstant
- PingUrl
#
Discovery Client实现
NIWSDiscoveryPing
还没有评论,来说两句吧...