Spring Cloud - 4 (Spring Cloud Netflix Ribbon)

╰半夏微凉° 2021-11-29 10:10 283阅读 0赞

Eureka 高可用架构


高可用注册中心集群

只需要增加Eurke服务器注册URL:

  1. ## Eureka Server 服务 URL,用于客户端注册
  2. 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。

  1. private Map<String, String> serviceUrl = new HashMap<>();
  2. {
  3. this.serviceUrl.put(DEFAULT_ZONE, DEFAULT_URL);
  4. }

value可以是多值字段,通过“,”分割:

  1. public List<String> getEurekaServerServiceUrls(String myZone) {
  2. String serviceUrls = this.serviceUrl.get(myZone);
  3. if (serviceUrls == null || serviceUrls.isEmpty()) {
  4. serviceUrls = this.serviceUrl.get(DEFAULT_ZONE);
  5. }
  6. if (!StringUtils.isEmpty(serviceUrls)) {
  7. final String[] serviceUrlsSplit = StringUtils
  8. .commaDelimitedListToStringArray(serviceUrls); //“,”分割
  9. List<String> eurekaServiceUrls = new ArrayList<>(serviceUrlsSplit.length);
  10. for (String eurekaServiceUrl : serviceUrlsSplit) {
  11. if (!endsWithSlash(eurekaServiceUrl)) {
  12. eurekaServiceUrl += "/";
  13. }
  14. eurekaServiceUrls.add(eurekaServiceUrl.trim());
  15. }
  16. return eurekaServiceUrls;
  17. }
  18. return new ArrayList<>();
  19. }

获取注册信息时间间隔

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服务提供者

具体配置项

  1. ##调整注册信息的获取周期,默认值:30秒
  2. eureka.client.registry-fetch-interval-seconds=5

实例信息复制时间间隔

就是客户端信息上报到Eureka服务器的时间。当Eureka客户端应用上报的频率越频繁,那么Eureka服务器的应用状态管理一致性就越高。

具体配置项

  1. ##调整客户端应用状态上报的周期
  2. eureka.client.instance-info-replication-interval-seconds= 5

Eureka的应用信息获取方式:拉模式

Eureka的应用信息上报的方式:推模式

实例ID

从Eureka Server Dashboard里面可以看到具体某个应用中的实例信息,比如:

  1. UP (2) - 192.168.1.103:user-service-provider:7077 , 192.168.1.103:user-service-provider:7070

其中,它们的命名模式:

  1. ${hostname}:${spring.application.name}:${server.port}

实例类:EurekaInstanceConfigBean

配置项

  1. ##Eureka 客户端应用实例的ID
  2. eureka.instance.instance-id=${spring.application.name}:${server.port}

#

实例端点映射

源码位置:EurekaInstanceConfigBean

  1. private String actuatorPrefix = "/actuator";
  2. private String statusPageUrlPath = actuatorPrefix + "/info";

配置项

  1. ## Eureka 客户端应用实例状态URL
  2. eureka.instance.status-page-url-path=/actuator/health

Eureka服务端高可用


构建Eureka服务器相互注册

Eureka Server1 -> Proflie:peer1

配置项

  1. spring.application.name=eureka-server
  2. server.port=9090
  3. ##取消服务器自我注册
  4. eureka.client.register-with-eureka=true
  5. ##不需要检索服务
  6. eureka.client.fetch-registry=true
  7. ## Eureka Service 服务URL,用于客户端注册
  8. eureka.client.serviceUrl.defaultZone=http://localhost:9091/eureka

Eureka Server1 -> Proflie:peer2

配置项

  1. spring.application.name=eureka-server
  2. server.port=9091
  3. ##取消服务器自我注册
  4. eureka.client.register-with-eureka=true
  5. ##不需要检索服务
  6. eureka.client.fetch-registry=true
  7. ## Eureka Service 服务URL,用于客户端注册
  8. 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

举例说明

  1. 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

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读