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-replicashttp://localhost:9091/eureka/

Eureka Server2 里面的replicas信息:

registered-replicashttp://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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐