服務註冊中心:Eureka

  • 2021 年 1 月 30 日
  • 筆記

第一章 註冊中心介紹

1.1、什麼是註冊中心

註冊中心可以說是微服務架構中的「通訊錄」,它記錄了服務和服務地址的映射關係。在分佈式系統中,服務會註冊到這裡,當服務需要調用其它服務時,就到這裡找到服務的地址,進行調用。簡單的來說:服務註冊中心的作用就是服務的註冊服務的發現

1.2、為啥用註冊中心

了解了什麼是註冊中心,那麼我們繼續談談,為什麼需要註冊中心。在分佈式系統中,我們不僅僅是需要在註冊中心找到服務和服務地址的映射關係這麼簡單,我們還需要考慮更多更複雜的問題:

  • 服務註冊後,如何及時發現
  • 服務宕機後,如何及時下線
  • 服務發現時,如何進行路由
  • 服務異常時,如何進行降級
  • 服務如何有效的水平擴展

這些問題的解決都依賴於註冊中心。簡單來看,注 冊中心的功能有點類似於 DNS 服務器或者負載均衡器,而實際上,註冊中心作為微服務的基礎組件,可能要更加複雜,也需要更多的靈活性和時效性。所以,我們還需要學習更多 Spring Cloud 微服務組件協同完成應用開發。

1.3、常見的註冊中心

特性 Eureka(會用) Nacos(重點) Consul(了解) Zookeeper(了解)
CAP AP CP + AP CP CP
健康檢查 Client Beat TCP/HTTP/MYSQL/Client Beat TCP/HTTP/gRPC/Cmd Keep Alive
雪崩保護
自動註銷實例 支持 支持 不支持 支持
訪問協議 HTTP HTTP/DNS HTTP/DNS TCP
監聽支持 支持 支持 支持 支持
多數據中心 支持 支持 支持 不支持
跨註冊中心同步 不支持 支持 支持 不支持
SpringCloud集成 支持 支持 支持 支持

第二章 Eureka介紹

2.1、Eureka的介紹

Eureka 是 Netflix 開發的服務發現組件,本身是一個基於 REST 的服務。Spring Cloud 將它集成在其子項目 Spring Cloud Netflix 中,實現 Spring Cloud 的服務註冊與發現,同時還提供了負載均衡、故障轉移等能力。

2.2、Eureka的三種角色

  • Eureka Server:通過 Register、Get、Renew 等接口提供服務的註冊和發現。
  • Service Provider:服務提供方,把自身的服務實例註冊到 Eureka Server 中。
  • Service Consumer:服務調用方,通過 Eureka Server 獲取服務列表,消費服務。

2.3、Eureka的運行流程

第三章 Eureka入門案例

3.1、創建註冊中心

(1)在spring-cloud-study下創建一個子模塊,名稱叫:eureka-server7001

(2)在eureka-server7001的pom.xml中,添加以下依賴信息

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.16</version>
    </dependency>    
</dependencies>

(3)創建一個配置文件,名字叫application.yaml,然後把以下這段配置拷貝進去

server:
  port: 7001

spring:
  application:
    #該名稱在集群模式下應該保持一致
    name: eureka-server

eureka:
  instance:
    #服務註冊中心實例的主機名
    hostname: localhost
  client:
    #是否將自己註冊到註冊中心,默認為 true,單實例模式下需要設置為 false
    register-with-eureka: false
    #是否從註冊中心獲取服務註冊信息,默認為 true,單實例模式下需要設置為 false
    fetch-registry: false
    #註冊中心對外暴露的註冊地址
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

(4)創建一個包名字叫com.caochenlei,在這個包下創建一個主啟動類EurekaServer7001Application

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

(5)啟動當前註冊中心應用服務,然後打開瀏覽器,在瀏覽器地址欄中輸入://localhost:7001/

3.2、創建服務提供者

(1)在spring-cloud-study下創建一個子模塊,名稱叫:service-provider8001

(2)在service-provider8001的pom.xml中,添加以下依賴信息

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.16</version>
    </dependency>
</dependencies>

(3)創建一個配置文件,名字叫application.yaml,然後把以下這段配置拷貝進去

server:
  port: 8001

spring:
  application:
    #該名稱在集群模式下應該保持一致
    name: service-provider

eureka:
  instance:
    #是否使用 ip 地址註冊
    prefer-ip-address: true
    #該實例註冊到服務中心的唯一ID
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
  client:
    #設置服務註冊中心地址
    service-url:
      defaultZone: http://localhost:7001/eureka/

(4)創建一個包名字叫com.caochenlei,在這個包下創建一個主啟動類ServiceProvider8001Application

@EnableEurekaClient
@SpringBootApplication
public class ServiceProvider8001Application {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProvider8001Application.class);
    }
}

(5)編寫實體類代碼(com.caochenlei.pojo.Product)

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product implements Serializable {
    private Integer pid;
    private String name;
    private Double price;
    private Integer count;
}

(6)編寫服務層接口(com.caochenlei.service.ProductService)

public interface ProductService {
    /**
     * 查找所有商品
     * @return
     */
    public List<Product> findAll();
}

(7)編寫服務層實現(com.caochenlei.service.impl.ProductServiceImpl)

@Service
public class ProductServiceImpl implements ProductService {
    @Override
    public List<Product> findAll() {
        return Arrays.asList(
                new Product(1, "小米手機", 1000.0D, 100),
                new Product(2, "華為手機", 2000.0D, 200),
                new Product(3, "蘋果手機", 3000.0D, 300)
        );
    }
}

(8)編寫控制層代碼(com.caochenlei.controller.ProductController)

@RestController
public class ProductController {
    @Autowired
    private ProductService productService;

    @RequestMapping("/provider/product/findAll")
    public List<Product> findAll() {
        return productService.findAll();
    }
}

(9)啟動當前服務提供者,然後打開瀏覽器,在瀏覽器地址欄中輸入://localhost:7001/

image-20210129215639316

(10)測試我們剛才寫的業務代碼,在瀏覽器地址欄中輸入://localhost:8001/provider/product/findAll

3.3、創建服務消費者

(1)在spring-cloud-study下創建一個子模塊,名稱叫:service-consumer9001

(2)在service-consumer9001的pom.xml中,添加以下依賴信息

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.16</version>
    </dependency>
</dependencies>

(3)創建一個配置文件,名字叫application.yaml,然後把以下這段配置拷貝進去

server:
  port: 9001

spring:
  application:
    name: service-consumer9001

eureka:
  client:
    #是否將自己註冊到註冊中心,默認為 true
    register-with-eureka: false
    #表示 Eureka Client 間隔多久去服務器拉取註冊信息,默認為 30 秒
    registry-fetch-interval-seconds: 10
    #設置服務註冊中心地址
    service-url:
      defaultZone: http://localhost:7001/eureka/

(4)創建一個包名字叫com.caochenlei,在這個包下創建一個主啟動類ServiceConsumer9001Application

@EnableEurekaClient
@SpringBootApplication
public class ServiceConsumer9001Application {
    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumer9001Application.class);
    }

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

(5)編寫實體類代碼(com.caochenlei.pojo.Product)

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product implements Serializable {
    private Integer pid;
    private String name;
    private Double price;
    private Integer count;
}

(6)編寫控制層代碼(com.caochenlei.controller.ProductController)

@RestController
public class ProductController {
    public static final String BASE_URL = "//localhost:8001";

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/consumer/product/findAll")
    public List<Product> findAll() {
        String findAllUrl = BASE_URL + "/provider/product/findAll";
        Product[] products = restTemplate.getForObject(findAllUrl, Product[].class);
        return Arrays.asList(products);
    }
}

(7)啟動當前服務消費者,然後打開瀏覽器,在瀏覽器地址欄中輸入://localhost:9001/consumer/product/findAll

注意:我們現在雖然可以正常調用成功,但聰明的你一定要知道,我們現在只是學習了註冊中心的搭建和服務的註冊,並沒有學習服務的遠程調用,這個restTemplate本身就是spring提供的一種訪問restful風格的模板類,他不是spring cloud的知識點,spring cloud下服務的調用我們會在後續章節或技術中進行介紹,這裡特別說明,是怕大家混淆,我們這一章節重點學習註冊中心。

第四章 Eureka集群配置

4.1、配置集群環境

(1)在剛才的父工程下再創建一個eureka-server7002註冊中心的項目,如果是多機器部署不用修改端口,通過 IP 區分服務,如果在一台機器上演示需要修改端口區分服務。

(2)添加域名映射,eureka會把hostname相同的url移除掉,如果我們配置的都是localhost,所以雖然你啟動了兩個eureka,但是它們不會把自己當成集群

C:\Windows\System32\drivers\etc\hosts

127.0.0.1 eureka-server7001.com
127.0.0.1 eureka-server7002.com

(3)修改eureka-server7001application.yaml

server:
  port: 7001

spring:
  application:
    #該名稱在集群模式下應該保持一致
    name: eureka-server

eureka:
  instance:
    #服務註冊中心實例的主機名
    hostname: eureka-server7001.com
    #是否使用 ip 地址註冊
    prefer-ip-address: true
    #該實例註冊到服務中心的唯一ID
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
  client:
    #設置服務註冊中心地址,指向另一個註冊中心(除自己之外所有,多個使用逗號隔開)
    service-url:
      defaultZone: http://localhost:7002/eureka/

(4)修改eureka-server7002application.yaml

server:
  port: 7002

spring:
  application:
    #該名稱在集群模式下應該保持一致
    name: eureka-server

eureka:
  instance:
    #服務註冊中心實例的主機名
    hostname: eureka-server7002.com
    #是否使用 ip 地址註冊
    prefer-ip-address: true
    #該實例註冊到服務中心的唯一ID
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
  client:
    #設置服務註冊中心地址,指向另一個註冊中心(除自己之外所有,多個使用逗號隔開)
    service-url:
      defaultZone: http://localhost:7001/eureka/

(5)啟動兩個註冊中心,他們會自動構成一個集群環境,我們先啟動7001的,然後再啟動7002的,先啟動哪一個無所謂,但是會報錯,這屬於正常現象,因為你另一台還沒有啟動,沒有辦法註冊,等兩台都啟動了,過一會清除一下控制台,就發現不報錯了。

4.2、修改服務提供者

application.yaml

server:
  port: 8001

spring:
  application:
    #該名稱在集群模式下應該保持一致
    name: service-provider

eureka:
  instance:
    #是否使用 ip 地址註冊
    prefer-ip-address: true
    #該實例註冊到服務中心的唯一ID
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
  client:
    #設置服務註冊中心地址
    service-url:
      defaultZone: http://eureka-server7001.com:7001/eureka/,http://eureka-server7002.com:7002/eureka/

//localhost:7001/ , //localhost:7002/

4.3、修改服務消費者

application.yaml

server:
  port: 9001

spring:
  application:
    name: service-consumer9001

eureka:
  client:
    #是否將自己註冊到註冊中心,默認為 true
    register-with-eureka: false
    #表示 Eureka Client 間隔多久去服務器拉取註冊信息,默認為 30 秒
    registry-fetch-interval-seconds: 10
    #設置服務註冊中心地址
    service-url:
      defaultZone: http://eureka-server7001.com:7001/eureka/,http://eureka-server7002.com:7002/eureka/

ProductController

@RestController
public class ProductController {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/consumer/product/findAll")
    public List<Product> findAll() {
        //獲取註冊中心服務列表
        List<ServiceInstance> instances = discoveryClient.getInstances("SERVICE-PROVIDER");
        if (CollectionUtils.isEmpty(instances)) {
            return null;
        }

        //循環遍歷打印服務實體
        for (ServiceInstance instance : instances) {
            System.out.println(instance.getUri());
            System.out.println(instance.getHost());
            System.out.println(instance.getPort());
            System.out.println("====================");
        }

        //我們拿出第一個服務實體
        ServiceInstance si = instances.get(0);
        String findAllUrl = si.getUri() + "/provider/product/findAll";
        Product[] products = restTemplate.getForObject(findAllUrl, Product[].class);
        return Arrays.asList(products);
    }
}

//localhost:9001/consumer/product/findAll

注意:這裡我們使用了discoveryClient獲取了註冊中心SERVICE-PROVIDER服務的服務列表,就是discoveryClient用來發現服務中心對應服務的地址,然後使用restTemplate進行遠程調用,上一章節的服務地址是咱們自己寫死的,這裡就更進一步,往後還有更好用的調用方式。

第五章 Eureka架構原理

  • Register(服務註冊):把自己的 IP 和端口註冊給 Eureka。
  • Renew(服務續約):發送心跳包,每 30 秒發送一次,告訴 Eureka 自己還活着。如果 90 秒還未發送心跳,宕機。
  • Cancel(服務下線):當 Provider 關閉時會向 Eureka 發送消息,把自己從服務列表中刪除,防止 Consumer 調用到不存在的服務。
  • Get Registry(獲取服務註冊列表):獲取其他服務列表。
  • Replicate(集群中數據同步):Eureka 集群中的數據複製與同步。
  • Make Remote Call(遠程調用):完成服務的遠程調用。

第六章 Eureka自我保護

6.1、什麼是自我保護

一般情況下,服務在 Eureka 上註冊後,會每 30 秒發送心跳包,Eureka 通過心跳來判斷服務是否健康,同時會定期刪除超過 90 秒沒有發送心跳的服務。Eureka Server 在運行期間會去統計心跳失敗比例在 15 分鐘之內是否低於 85%,如果低於 85%,Eureka Server 會將這些實例保護起來,讓這些實例不會過期,同時提示一個警告,這種算法叫做 Eureka Server 的自我保護模式,這種自我保護模式默認開啟。

有兩種情況會導致 Eureka Server 收不到微服務的心跳:

  • 微服務自身的原因
  • 微服務與 Eureka 之間的網絡故障

6.2、為啥用自我保護

  • 因為同時保留”好數據”與”壞數據”總比丟掉任何數據要更好,當網絡故障恢復後,這個 Eureka 節點會退出”自我保護模式”。
  • Eureka 還有客戶端緩存功能(也就是微服務的緩存功能),即使 Eureka 集群中所有節點都宕機失效,微服務的 Provider 和 Consumer 都能正常通信。
  • 微服務的負載均衡策略會自動剔除死亡的微服務節點。

6.3、如何關自我保護

註冊中心配置自我保護:

eureka:
  server:
    #true:開啟自我保護模式,false:關閉自我保護模式
    enable-self-preservation: false
    #清理間隔(單位:毫秒,默認是 60*1000)
    eviction-interval-timer-in-ms: 60000

第七章 Eureka優雅停服

7.1、什麼是優雅停服

在上一章節中,我們知道註冊中心註冊的服務默認會有自我保護模式,我們想要關閉這個模式也很簡單,要是我不想關閉這個模式,讓他正常默認啟用,現在我想要下線某一個服務,讓註冊中心知道,這個服務是我們人為的下線的,這時候,註冊中心應該正常踢出這個下線服務,而不是保護起來,這樣就不會觸發自我保護模式了,而其他的服務因為沒有停止仍然有可能會觸發自我保護模式,這個就是一種優雅的停止服務的方式。

7.2、如何配優雅停服

服務提供者配置優雅停服:

#度量指標監控與健康檢查
management:
  endpoints:
    web:
      exposure:
        #開啟 shutdown 端點訪問
        include: shutdown
  endpoint:
    #開啟 shutdown 實現優雅停服
    shutdown:
      enabled: true

打開postman使用post方式關閉服務://localhost:8001/actuator/shutdown

image-20210130113259668

第八章 Eureka安全認證

8.1、什麼是安全認證

現在我們已經學會搭建Eureka註冊中心集群,但是,這個訪問地址我們是可以直接訪問的,既然我們可以直接訪問,那要是部署到線上,別人是不是也可以通過地址直接來訪問咱們的註冊中心,這會存在安全隱患,我們能不能在訪問註冊中心的時候,需要賬號和密碼的驗證,以此來保證訪問當前註冊中心的一定是咱們可信的人,那這個就是註冊中心的安全認證。

8.2、如何配安全認證

(1)註冊中心添加 security 依賴,兩個都要加

<!-- spring boot security 依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

(2)註冊中心配置 security 認證,兩個都要配

eureka-server7001的application.yaml

server:
  port: 7001

spring:
  application:
    #該名稱在集群模式下應該保持一致
    name: eureka-server
  # 安全認證
  security:
    user:
      name: root
      password: 123456

eureka:
  instance:
    #服務註冊中心實例的主機名
    hostname: eureka-server7001.com
    #是否使用 ip 地址註冊
    prefer-ip-address: true
    #該實例註冊到服務中心的唯一ID
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
  client:
    #設置服務註冊中心地址,指向另一個註冊中心(除自己之外所有,多個使用逗號隔開)
    service-url:
      defaultZone: http://root:123456@eureka-server7002.com:7002/eureka/

eureka-server7002的application.yaml

server:
  port: 7002

spring:
  application:
    #該名稱在集群模式下應該保持一致
    name: eureka-server
  # 安全認證
  security:
    user:
      name: root
      password: 123456

eureka:
  instance:
    #服務註冊中心實例的主機名
    hostname: eureka-server7002.com
    #是否使用 ip 地址註冊
    prefer-ip-address: true
    #該實例註冊到服務中心的唯一ID
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
  client:
    #設置服務註冊中心地址,指向另一個註冊中心(除自己之外所有,多個使用逗號隔開)
    service-url:
      defaultZone: http://root:123456@eureka-server7001.com:7001/eureka/

(3)修改服務提供者的註冊中心地址

server:
  port: 8001

spring:
  application:
    #該名稱在集群模式下應該保持一致
    name: service-provider

#度量指標監控與健康檢查
management:
  endpoints:
    web:
      exposure:
        #開啟 shutdown 端點訪問
        include: shutdown
  endpoint:
    #開啟 shutdown 實現優雅停服
    shutdown:
      enabled: true

eureka:
  instance:
    #是否使用 ip 地址註冊
    prefer-ip-address: true
    #該實例註冊到服務中心的唯一ID
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
  client:
    #設置服務註冊中心地址
    service-url:
      defaultZone: http://root:123456@eureka-server7001.com:7001/eureka/,http://root:123456@eureka-server7002.com:7002/eureka/

(4)修改服務消費者的註冊中心地址

server:
  port: 9001

spring:
  application:
    name: service-consumer9001

eureka:
  client:
    #是否將自己註冊到註冊中心,默認為 true
    register-with-eureka: false
    #表示 Eureka Client 間隔多久去服務器拉取註冊信息,默認為 30 秒
    registry-fetch-interval-seconds: 10
    #設置服務註冊中心地址
    service-url:
      defaultZone: http://root:123456@eureka-server7001.com:7001/eureka/,http://root:123456@eureka-server7002.com:7002/eureka/

(5)配置註冊中心的csrf

Eureka 會自動化配置 CSRF 防禦機制,Spring Security 認為 POST, PUT, and DELETE http methods 都是有風險的,如果這些 method 發送過程中沒有帶上 CSRF token 的話,會被直接攔截並返回 403 forbidden。我們應該使 CSRF 忽略/eureka/**的所有請求。

在每一個註冊中心的com.caochenlei包下創建一個配置類,名字叫WebSecurityConfig

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http); // 加這句是為了訪問 eureka 控制台和 /actuator 時能做安全控制
        http.csrf().ignoringAntMatchers("/eureka/**"); // 忽略 /eureka/** 的所有請求
    }
}

(6)重新啟動所有的項目,啟動的順序以此是

  1. eureka-server7001
  2. eureka-server7002
  3. service-provider8001
  4. service-consumer9001

(7)打開瀏覽器輸入Eureka的控制台地址,分別訪問

//localhost:7001/

//localhost:7002/

image-20210130123236854

第九章 Eureka配置詳解

9.1、server

9.1.1、server與client之間關聯配置

#服務端開啟自我保護模式。無論什麼情況,服務端都會保持一定數量的服務。避免client與server的網絡問題,而出現大量的服務被清除。
eureka.server.enable-self-preservation=true
#開啟清除無效服務的定時任務,時間間隔。默認1分鐘
eureka.server.eviction-interval-timer-in-ms= 60000
#間隔多長時間,清除過期的delta數據
eureka.server.delta-retention-timer-interval-in-ms=0
#過期數據,是否也提供給client
eureka.server.disable-delta=false
#eureka服務端是否記錄client的身份header
eureka.server.log-identity-headers=true
#請求頻率限制器
eureka.server.rate-limiter-burst-size=10
#是否開啟請求頻率限制器
eureka.server.rate-limiter-enabled=false
#請求頻率的平均值
eureka.server.rate-limiter-full-fetch-average-rate=100
#是否對標準的client進行頻率請求限制。如果是false,則只對非標準client進行限制
eureka.server.rate-limiter-throttle-standard-clients=false
#註冊服務、拉去服務列表數據的請求頻率的平均值
eureka.server.rate-limiter-registry-fetch-average-rate=500
#設置信任的client list
eureka.server.rate-limiter-privileged-clients=
#在設置的時間範圍類,期望與client續約的百分比。
eureka.server.renewal-percent-threshold=0.85
#多長時間更新續約的閾值
eureka.server.renewal-threshold-update-interval-ms=0
#對於緩存的註冊數據,多長時間過期
eureka.server.response-cache-auto-expiration-in-seconds=180
#多長時間更新一次緩存中的服務註冊數據
eureka.server.response-cache-update-interval-ms=0
#緩存增量數據的時間,以便在檢索的時候不丟失信息
eureka.server.retention-time-in-m-s-in-delta-queue=0
#當時間戳不一致的時候,是否進行同步
eureka.server.sync-when-timestamp-differs=true
#是否採用只讀緩存策略,只讀策略對於緩存的數據不會過期。
eureka.server.use-read-only-response-cache=true

9.1.2、server與remote之間關聯配置

#過期數據,是否也提供給遠程region
eureka.server.disable-delta-for-remote-regions=false
#回退到遠程區域中的應用程序的舊行為 (如果已配置) 如果本地區域中沒有該應用程序的實例, 則將被禁用。
eureka.server.disable-transparent-fallback-to-other-region=false
#指示在服務器支持的情況下, 是否必須為遠程區域壓縮從尤里卡服務器獲取的內容。
eureka.server.g-zip-content-from-remote-region=true
#連接eureka remote note的連接超時時間
eureka.server.remote-region-connect-timeout-ms=1000
#remote region 應用白名單
eureka.server.remote-region-app-whitelist.
#連接eureka remote note的連接空閑時間
eureka.server.remote-region-connection-idle-timeout-seconds=30
#執行remote region 獲取註冊信息的請求線程池大小
eureka.server.remote-region-fetch-thread-pool-size=20
#remote region 從對等eureka加點讀取數據的超時時間
eureka.server.remote-region-read-timeout-ms=1000
#從remote region 獲取註冊信息的時間間隔
eureka.server.remote-region-registry-fetch-interval=30
#remote region 連接eureka節點的總連接數量
eureka.server.remote-region-total-connections=1000
#remote region 連接eureka節點的單機連接數量
eureka.server.remote-region-total-connections-per-host=50
#remote region抓取註冊信息的存儲文件,而這個可靠的存儲文件需要全限定名來指定
eureka.server.remote-region-trust-store=
#remote region 儲存的文件的密碼
eureka.server.remote-region-trust-store-password=
#remote region url.多個逗號隔開
eureka.server.remote-region-urls=
#remote region url.多個逗號隔開
eureka.server.remote-region-urls-with-name=

9.1.3、server與other之間關聯配置

#緩存ASG信息的過期時間。
eureka.server.a-s-g-cache-expiry-timeout-ms=0
#查詢ASG信息的超時時間
eureka.server.a-s-g-query-timeout-ms=300
#服務更新ASG信息的頻率
eureka.server.a-s-g-update-interval-ms=0
#AWS訪問ID
eureka.server.a-w-s-access-id=
#AWS安全密鑰
eureka.server.a-w-s-secret-key=
#AWS綁定策略
eureka.server.binding-strategy=eip
#用於從第三方AWS 帳戶描述自動擴展分組的角色的名稱。
eureka.server.list-auto-scaling-groups-role-name=
#是否應該建立連接引導
eureka.server.prime-aws-replica-connections=true
#服務端嘗試綁定候選EIP的次數
eureka.server.e-i-p-bind-rebind-retries=3
#服務端綁定EIP的時間間隔.如果綁定就檢查;如果綁定失效就重新綁定。當且僅當已經綁定的情況
eureka.server.e-i-p-binding-retry-interval-ms=10
#服務端綁定EIP的時間間隔.當且僅當服務為綁定的情況
eureka.server.e-i-p-binding-retry-interval-ms-when-unbound=
#服務端嘗試綁定route53的次數
eureka.server.route53-bind-rebind-retries=3
#服務端間隔多長時間嘗試綁定route53
eureka.server.route53-binding-retry-interval-ms=30
#用於建立route53域的ttl,默認為30
eureka.server.route53-domain-t-t-l=10

9.1.4、node與node之間關聯配置

#發送複製數據是否在request中,總是壓縮
eureka.server.enable-replicated-request-compression=false
#指示群集節點之間的複製是否應批處理以提高網絡效率。
eureka.server.batch-replication=false
#允許備份到備份池的最大複製事件數量。而這個備份池負責除狀態更新的其他事件。可以根據內存大小,超時和複製流量,來設置此值得大小
eureka.server.max-elements-in-peer-replication-pool=10000
#允許備份到狀態備份池的最大複製事件數量
eureka.server.max-elements-in-status-replication-pool=10000
#多個服務中心相互同步信息線程的最大空閑時間
eureka.server.max-idle-thread-age-in-minutes-for-peer-replication=15
#狀態同步線程的最大空閑時間
eureka.server.max-idle-thread-in-minutes-age-for-status-replication=15
#服務註冊中心各個instance相互複製數據的最大線程數量
eureka.server.max-threads-for-peer-replication=20
#服務註冊中心各個instance相互複製狀態數據的最大線程數量
eureka.server.max-threads-for-status-replication=1
#instance之間複製數據的通信時長
eureka.server.max-time-for-replication=30000
#正常的對等服務instance最小數量。-1表示服務中心為單節點。
eureka.server.min-available-instances-for-peer-replication=-1
#instance之間相互複製開啟的最小線程數量
eureka.server.min-threads-for-peer-replication=5
#instance之間用於狀態複製,開啟的最小線程數量
eureka.server.min-threads-for-status-replication=1
#instance之間複製數據時可以重試的次數
eureka.server.number-of-replication-retries=5
#eureka節點間間隔多長時間更新一次數據。默認10分鐘。
eureka.server.peer-eureka-nodes-update-interval-ms=600000
#eureka服務狀態的相互更新的時間間隔。
eureka.server.peer-eureka-status-refresh-time-interval-ms=0
#eureka對等節點間連接超時時間
eureka.server.peer-node-connect-timeout-ms=200
#eureka對等節點連接後的空閑時間
eureka.server.peer-node-connection-idle-timeout-seconds=30
#節點間的讀數據連接超時時間
eureka.server.peer-node-read-timeout-ms=200
#eureka server 節點間連接的總共最大數量
eureka.server.peer-node-total-connections=1000
#eureka server 節點間連接的單機最大數量
eureka.server.peer-node-total-connections-per-host=10
#在服務節點啟動時,eureka嘗試獲取註冊信息的次數
eureka.server.registry-sync-retries=
#在服務節點啟動時,eureka多次嘗試獲取註冊信息的間隔時間
eureka.server.registry-sync-retry-wait-ms=
#當eureka server啟動的時候,不能從對等節點獲取instance註冊信息的情況,應等待多長時間。
eureka.server.wait-time-in-ms-when-sync-empty=0

9.2、client

#該客戶端是否可用
eureka.client.enabled=true
#實例是否在eureka服務器上註冊自己的信息以供其他服務發現,默認為true
eureka.client.register-with-eureka=false
#此客戶端是否獲取eureka服務器註冊表上的註冊信息,默認為true
eureka.client.fetch-registry=false
#是否過濾掉,非UP的實例。默認為true
eureka.client.filter-only-up-instances=true
#與Eureka註冊服務中心的通信zone和url地址
eureka.client.serviceUrl.defaultZone=//${eureka.instance.hostname}:${server.port}/eureka/
#client連接Eureka服務端後的空閑等待時間,默認為30 秒
eureka.client.eureka-connection-idle-timeout-seconds=30
#client連接eureka服務端的連接超時時間,默認為5秒
eureka.client.eureka-server-connect-timeout-seconds=5
#client對服務端的讀超時時長
eureka.client.eureka-server-read-timeout-seconds=8
#client連接all eureka服務端的總連接數,默認200
eureka.client.eureka-server-total-connections=200
#client連接eureka服務端的單機連接數量,默認50
eureka.client.eureka-server-total-connections-per-host=50
#執行程序指數回退刷新的相關屬性,是重試延遲的最大倍數值,默認為10
eureka.client.cache-refresh-executor-exponential-back-off-bound=10
#執行程序緩存刷新線程池的大小,默認為5
eureka.client.cache-refresh-executor-thread-pool-size=2
#心跳執行程序回退相關的屬性,是重試延遲的最大倍數值,默認為10
eureka.client.heartbeat-executor-exponential-back-off-bound=10
#心跳執行程序線程池的大小,默認為5
eureka.client.heartbeat-executor-thread-pool-size=5
# 詢問Eureka服務url信息變化的頻率(s),默認為300秒
eureka.client.eureka-service-url-poll-interval-seconds=300
#最初複製實例信息到eureka服務器所需的時間(s),默認為40秒
eureka.client.initial-instance-info-replication-interval-seconds=40
#間隔多長時間再次複製實例信息到eureka服務器,默認為30秒
eureka.client.instance-info-replication-interval-seconds=30
#從eureka服務器註冊表中獲取註冊信息的時間間隔(s),默認為30秒
eureka.client.registry-fetch-interval-seconds=30
# 獲取實例所在的地區。默認為us-east-1
eureka.client.region=us-east-1
#實例是否使用同一zone里的eureka服務器,默認為true,理想狀態下,eureka客戶端與服務端是在同一zone下
eureka.client.prefer-same-zone-eureka=true
# 獲取實例所在的地區下可用性的區域列表,用逗號隔開。(AWS)
eureka.client.availability-zones.china=defaultZone,defaultZone1,defaultZone2
#eureka服務註冊表信息里的以逗號隔開的地區名單,如果不這樣返回這些地區名單,則客戶端啟動將會出錯。默認為null
eureka.client.fetch-remote-regions-registry=
#服務器是否能夠重定向客戶端請求到備份服務器。 如果設置為false,服務器將直接處理請求,如果設置為true,它可能發送HTTP重定向到客戶端。默認為false
eureka.client.allow-redirects=false
#客戶端數據接收
eureka.client.client-data-accept=
#增量信息是否可以提供給客戶端看,默認為false
eureka.client.disable-delta=false
#eureka服務器序列化/反序列化的信息中獲取「_」符號的的替換字符串。默認為「__「
eureka.client.escape-char-replacement=__
#eureka服務器序列化/反序列化的信息中獲取「$」符號的替換字符串。默認為「_-」
eureka.client.dollar-replacement="_-"
#當服務端支持壓縮的情況下,是否支持從服務端獲取的信息進行壓縮。默認為true
eureka.client.g-zip-content=true
#是否記錄eureka服務器和客戶端之間在註冊表的信息方面的差異,默認為false
eureka.client.log-delta-diff=false
# 如果設置為true,客戶端的狀態更新將會點播更新到遠程服務器上,默認為true
eureka.client.on-demand-update-status-change=true
#此客戶端只對一個單一的VIP註冊表的信息感興趣。默認為null
eureka.client.registry-refresh-single-vip-address=
#client是否在初始化階段強行註冊到服務中心,默認為false
eureka.client.should-enforce-registration-at-init=false
#client在shutdown的時候是否顯示的註銷服務從服務中心,默認為true
eureka.client.should-unregister-on-shutdown=true
# 獲取eureka服務的代理主機,默認為null
eureka.client.proxy-host=
#獲取eureka服務的代理密碼,默認為null
eureka.client.proxy-password=
# 獲取eureka服務的代理端口, 默認為null
eureka.client.proxy-port=
# 獲取eureka服務的代理用戶名,默認為null
eureka.client.proxy-user-name=
#屬性解釋器
eureka.client.property-resolver=
#獲取實現了eureka客戶端在第一次啟動時讀取註冊表的信息作為回退選項的實現名稱
eureka.client.backup-registry-impl=
#這是一個短暫的×××的配置,如果最新的×××是穩定的,則可以去除,默認為null
eureka.client.decoder-name=
#這是一個短暫的編碼器的配置,如果最新的編碼器是穩定的,則可以去除,默認為null
eureka.client.encoder-name=
#是否使用DNS機制去獲取服務列表,然後進行通信。默認為false
eureka.client.use-dns-for-fetching-service-urls=false
#獲取要查詢的DNS名稱來獲得eureka服務器,此配置只有在eureka服務器ip地址列表是在DNS中才會用到。默認為null
eureka.client.eureka-server-d-n-s-name=
#獲取eureka服務器的端口,此配置只有在eureka服務器ip地址列表是在DNS中才會用到。默認為null
eureka.client.eureka-server-port=
#表示eureka註冊中心的路徑,如果配置為eureka,則為//x.x.x.x:x/eureka/,在eureka的配置文件中加入此配置表示eureka作為客戶端向註冊中心註冊,從而構成eureka集群。此配置只有在eureka服務器ip地址列表是在DNS中才會用到,默認為null
eureka.client.eureka-server-u-r-l-context=

9.3、instance

#服務註冊中心實例的主機名
eureka.instance.hostname=localhost
#註冊在Eureka服務中的應用組名
eureka.instance.app-group-name=
#註冊在的Eureka服務中的應用名稱
eureka.instance.appname=
#該實例註冊到服務中心的唯一ID
eureka.instance.instance-id=
#該實例的IP地址
eureka.instance.ip-address=
#該實例,相較於hostname是否優先使用IP
eureka.instance.prefer-ip-address=false
#用於AWS平台自動擴展的與此實例關聯的組名,
eureka.instance.a-s-g-name=
#部署此實例的數據中心
eureka.instance.data-center-info=
#默認的地址解析順序
eureka.instance.default-address-resolution-order=
#該實例的環境配置
eureka.instance.environment=
#初始化該實例,註冊到服務中心的初始狀態
eureka.instance.initial-status=up
#表明是否只要此實例註冊到服務中心,立馬就進行通信
eureka.instance.instance-enabled-onit=false
#該服務實例的命名空間,用於查找屬性
eureka.instance.namespace=eureka
#該服務實例的子定義元數據,可以被服務中心接受到
eureka.instance.metadata-map.test = test
#服務中心刪除此服務實例的等待時間(秒為單位),時間間隔為最後一次服務中心接受到的心跳時間
eureka.instance.lease-expiration-duration-in-seconds=90
#該實例給服務中心發送心跳的間隔時間,用於表明該服務實例可用
eureka.instance.lease-renewal-interval-in-seconds=30
#該實例,註冊服務中心,默認打開的通信數量
eureka.instance.registry.default-open-for-traffic-count=1
#每分鐘續約次數
eureka.instance.registry.expected-number-of-renews-per-min=1
#該實例健康檢查url,絕對路徑
eureka.instance.health-check-url=
#該實例健康檢查url,相對路徑
eureka.instance.health-check-url-path=/health
#該實例的主頁url,絕對路徑
eureka.instance.home-page-url=
#該實例的主頁url,相對路徑
eureka.instance.home-page-url-path=/
#該實例的安全健康檢查url,絕對路徑
eureka.instance.secure-health-check-url=
#https通信端口
eureka.instance.secure-port=443
#https通信端口是否啟用
eureka.instance.secure-port-enabled=false
#http通信端口
eureka.instance.non-secure-port=80
#http通信端口是否啟用
eureka.instance.non-secure-port-enabled=true
#該實例的安全虛擬主機名稱(https)
eureka.instance.secure-virtual-host-name=unknown
#該實例的虛擬主機名稱(http)
eureka.instance.virtual-host-name=unknown
#該實例的狀態呈現url,絕對路徑
eureka.instance.status-page-url=
#該實例的狀態呈現url,相對路徑
eureka.instance.status-page-url-path=/status

9.4、dashboard

#是否啟用Eureka的儀錶板。默認為true.
eureka.dashboard.enabled=true
#到Eureka儀錶板的服務路徑(相對於servlet路徑)。默認為「/」
eureka.dashboard.path=/