乐趣区

关于spring-cloud:SpringCloud升级之路20200x版20-启动一个-Eureka-Server-集群

本系列代码地址:https://github.com/HashZhang/…

咱们的业务集群构造是这样的:

  • 不同 Region,应用不同的 Eureka 集群治理,不同 Region 之间不相互拜访。
  • 同一 Region 内,可能有不同的业务集群,不同业务集群之间也不相互拜访,共用同一套业务集群。
  • 同一业务集群内能够随便拜访,同时同一业务集群会做跨可用区的容灾。
  • 在咱们这里的形象中,zone 代表不同集群,而不是理论的不同可用区

在这里,咱们提供一个 Eureka Server 的集群模板,供大家参考。

首先,我的项目依赖是:

<dependencies>
    <dependency>
        <groupId>com.github.hashjang</groupId>
        <artifactId>spring-cloud-iiford-spring-cloud-webmvc</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

其实就是蕴含之前咱们定义的所有同步微服务的依赖,以及 eureka-server 的相干依赖。

编写启动类,其实外围就是增加注解 @EnableEurekaServer

package com.github.hashjang.spring.cloud.iiford.eureka.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);
    }
}

咱们筹备启动一个两个 Eureka Server 实例的集群,首先编写两个实例公共的配置,放入 application.yml

spring:
  application:
    name: eureka-server

eureka:
  server:
    #被动查看服务实例是否生效的工作执行距离,默认是 60s
    eviction-interval-timer-in-ms: 1000
    #这个配置在两个中央被应用:#如果启用用了自我爱护,则会 renewal-threshold-update-interval-ms 指定的工夫内,收到的心跳申请个数是否小于实例个数乘以这个 renewal-percent-threshold
    #定时工作查看过期实例,每次最多过期 1 - renewal-percent-threshold 这么多比例的实例
    renewal-percent-threshold: 0.85
    #留神,最好所有的客户端实例配置的心跳工夫相干的配置,是雷同的。这样应用自我爱护的个性最精确。#敞开自我爱护
    #咱们这里不应用自我爱护,因为:#自我爱护次要针对集群中网络呈现问题,导致有很多实例无奈发送心跳导致很多实例状态异样,然而理论实例还在失常工作的状况,不要让这些实例不参加负载平衡
    #启用自我爱护的状况下,就会进行对于实例的过期
    #然而,如果呈现这种状况,其实也代表很多实例无奈读取注册核心了。#并且还有一种状况就是,Eureka 重启。尽管不常见,然而对于镜像中其余的组件更新咱们还是很频繁的
    #我偏向于从客户端对于实例缓存机制来解决这个问题,如果返回实例列表为空,则应用上次的实例列表进行负载平衡,这样既能解决 Eureka 重启的状况,又能解决一些 Eureka 网络隔离的状况
    #自我保护模式基于每分钟须要收到 renew(实例心跳)申请个数,如果启用了自我保护模式,只有上一分钟接管到的 renew 个数,大于这个值,实例过期才会被登记
    enable-self-preservation: false
    # 增量实例队列实例过期工夫,默认 3 分钟
    retention-time-in-m-s-in-delta-queue: 180000
    # 增量实例队列过期工作距离,默认 30s
    delta-retention-timer-interval-in-ms: 30000
    # 响应缓存中有两个次要元素,一个是 readOnlyCacheMap,另一个是 readWriteCacheMap
    # 是否应用 readOnlyCacheMap,默认为 true
    # 如果为是,则从 readOnlyCacheMap 读取,否则间接读取 readWriteCacheMap
    use-readonly-response-cahce: true
    # 初始 readWriteCacheMap 大小,默认 1000
    initial-capacity-of-response-cache: 1000
    # LoadingCache 缓存过期工夫,默认 180s
    response-cache-auto-expiration-in-seconds: 9
    # 定时从 LoadingCache 同步到只读缓存的间隔时间,默认为 30s
    response-cache-update-interval-ms: 3000
  client:
    service-url:
      # 默认 eureka 集群, 这里必须是 defaultZone,不能用 - 替换大写,与其余的配置不一样,因为切实 EurekaClientConfigBean 外面写死的
      defaultZone: 'http://127.0.0.1:8211/eureka/,http://127.0.0.1:8212/eureka/'
    # 是否从 eureka 下面拉取实例, eureka server 不调用其余微服务,所以没必要拉取
    fetch-registry: false
    # 是否将本人注册到 eureka 下面,eureka server 不参加负载平衡,所以没必要注册
    register-with-eureka: false

server:
  undertow:
    # 以下的配置会影响 buffer, 这些 buffer 会用于服务器连贯的 IO 操作
    # 如果每次须要 ByteBuffer 的时候都去申请,对于堆内存的 ByteBuffer 须要走 JVM 内存调配流程(TLAB -> 堆),对于间接内存则须要走零碎调用,这样效率是很低下的。# 所以,个别都会引入内存池。在这里就是 `BufferPool`。# 目前,UnderTow 中只有一种 `DefaultByteBufferPool`,其余的实现目前没有用。# 这个 DefaultByteBufferPool 绝对于 netty 的 ByteBufArena 来说,非常简单,相似于 JVM TLAB 的机制
    # 对于 bufferSize,最好和你零碎的 TCP Socket Buffer 配置一样
    # `/proc/sys/net/ipv4/tcp_rmem` (对于读取)
    # `/proc/sys/net/ipv4/tcp_wmem` (对于写入)
    # 在内存大于 128 MB 时,bufferSize 为 16 KB 减去 20 字节,这 20 字节用于协定头
    buffer-size: 16364
    # 是否调配的间接内存 (NIO 间接调配的堆外内存),这里开启,所以 java 启动参数须要配置下间接内存大小,缩小不必要的 GC
    # 在内存大于 128 MB 时,默认就是应用间接内存的
    directBuffers: true
    threads:
      # 设置 IO 线程数, 它次要执行非阻塞的工作, 它们会负责多个连贯, 默认设置每个 CPU 外围一个读线程和一个写线程
      io: 4
      # 阻塞工作线程池, 当执行相似 servlet 申请阻塞 IO 操作, undertow 会从这个线程池中获得线程
      # 它的值设置取决于零碎线程执行工作的阻塞系数,默认值是 IO 线程数 *8
      worker: 128
    # http post body 大小,默认为 -1B,即不限度
    max-http-post-size: -1B
    # 是否在启动时创立 filter,默认为 true,不必批改
    eager-filter-init: true
    # 限度门路参数数量,默认为 1000
    max-parameters: 1000
    # 限度 http header 数量,默认为 200
    max-headers: 200
    # 限度 http header 中 cookies 的键值对数量,默认为 200
    max-cookies: 200
    # 是否容许 / 与 %2F 本义。/ 是 URL 保留字, 除非你的利用明确须要,否则不要开启这个本义,默认为 false
    allow-encoded-slash: false
    # 是否容许 URL 解码,默认为 true,除了 %2F 其余的都会解决
    decode-url: true
    # url 字符编码集,默认是 utf-8
    url-charset: utf-8
    # 响应的 http header 是否会加上 'Connection: keep-alive',默认为 true
    always-set-keep-alive: true
    # 申请超时,默认是不超时,咱们的微服务因为可能有长时间的定时工作,所以不做服务端超时,都用客户端超时,所以咱们放弃这个默认配置
    no-request-timeout: -1
    # 是否在跳转的时候放弃 path,默认是敞开的,个别不必配置
    preserve-path-on-forward: false
    options:
      # spring boot 没有形象的 xnio 相干配置在这里配置,对应 org.xnio.Options 类
      socket:
        SSL_ENABLED: false
      # spring boot 没有形象的 undertow 相干配置在这里配置,对应 io.undertow.UndertowOptions 类
      server:
        ALLOW_UNKNOWN_PROTOCOLS: false
    # access log 相干配置
    accesslog:
      # 寄存目录,默认为 logs
      dir: ./logs/${server.port}
      # 是否开启
      enabled: true
      # 格局,各种占位符前面会具体阐明
      pattern: '{"transportProtocol":"%{TRANSPORT_PROTOCOL}","scheme":"%{SCHEME}","protocol":"%{PROTOCOL}","method":"%{METHOD}","reqHeaderUserAgent":"%{i,User-Agent}","reqHeaderUserId":"%{i,uid}","traceId":"%{i,X-B3-TraceId}","spanId":"%{i,X-B3-SpanId}","queryString":"%q","uri":"%U","thread":"%I","hostPort":"%{HOST_AND_PORT}","localIp":"%A","localPort":"%p","localServerName":"%v","remoteIp":"%a","bytesSent":"%b","time":"%{time,yyyy-MM-dd HH:mm:ss.S}","status":"%s","reason":"%{RESPONSE_REASON_PHRASE}","timeUsed":"%Dms"}'
      # 文件前缀,默认为 access_log
      prefix: access.
      # 文件后缀,默认为 log
      suffix: log
      # 是否另起日志文件写 access log,默认为 true
      # 目前只能依照日期进行 rotate,一天一个日志文件
      rotate: true

management:
  endpoint:
    health:
      show-details: always
  endpoints:
    jmx:
      exposure:
        exclude: '*'
    web:
      exposure:
        include: '*'

除了同步微服务 undertow 的配置以及 actuator 的配置,Eureka 配置中, 因为 Eureka Server 感知其余实例,仅仅通过 eureka.client.service-url 这个配置读取,所以不须要 eureka server 注册到 eureka server 或者读取 eureka server 下面的实例 ,因而这里咱们配置不注册也不读取。而后,咱们这里依照之前剖析的,敞开了自我爱护,开启了定时过期工作,并且将相干的定时工作工夫距离都调低了不少,因为咱们的集群不是万个实例级别的,而是一千左右,所以能够调高这些工作频率。

之后,咱们编写两个实例特定 profile 的配置,其实就是提供服务的端口不一样,即:

application-eureka1.yml

server:
  port: 8211

application-eureka2.yml

server:
  port: 8212

之后,咱们通过 IDEA 的环境变量配置,第一个 Eureka Server 的环境变量指定 spring.profiles.active=eureka1,第二个 Eureka Server 的环境变量指定 spring.profiles.active=eureka2,别离启动。即可成为一个 Eureka 集群。大家能够尝试往其中一个实例注册一个服务实例,看另一个实例上是否被同步了这个服务实例。

咱们这一节给大家提供一个配置模板,启动一个 Eureka Server 集群。下一节,咱们将开始剖析并应用咱们我的项目中的负载均衡器 Spring Cloud Loadbalancer

微信搜寻“我的编程喵”关注公众号,每日一刷,轻松晋升技术,斩获各种 offer

退出移动版