1. 程式人生 > >Spring Cloud 探索 | 服務註冊與發現 Eureka(下)

Spring Cloud 探索 | 服務註冊與發現 Eureka(下)

上文 ……

注意:以下是針對Eureka Client進行配置,如果需要對Eureka Server進行配置會有明顯的說明。

4 Spring Cloud Eureka Client 配置過程


4.1 pom.xml 新增依賴

新增Eureka Client依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</
artifactId
>
</dependency>

4.2 配置啟動類

與往常 Spring Boot 啟動類類似,不同的是多了一個 @EnableDiscoveryClient 註解,用來標識當前工程是Discovery Client。因為 Spring Cloud 提供了非常多的服務註冊發現的元件,如 euerka、zookeeper、consul、etcd。所以為統一標識客戶端身份,它用的是 @EnableDiscoveryClient 註解。

也可以使用@EnableEurekaClient,但是此註解只適用於 euerka 服務註冊發現元件。

@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudEurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudEurekaClientApplication.class, args);
    }

}

4.3 application.yml基礎配置

下面是一個Eureka客戶端最基本的配置:

server:
  port
: 9005 spring: application: name: service-provider eureka: instance: hostname: eureka-client.com # 記得修改 hosts 檔案 client: service-url: defaultZone: http://lpf:[email protected]-server.com:9000/eureka #defaultZone: http://eureka-server.com:9000/eureka logging.level.root: info

配置解釋:

  • spring.application.name: 指定微服務的名稱,後續在呼叫的時候只需要使用該名稱就可以進行服務的訪問;
  • eureka.client.service-url.defaultZone: 指定服務註冊中心的位置。如果Eureka Server配置了許可權驗證,則配置格式如下:http://${security.user.name}:${security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/

到此,Eureka Client已經可以和Eureka Server正常連線了。

4.4 Controller、Service等

在編寫程式碼之前需要在 pom.xml 檔案中新增需要的依賴:

<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

在服務提供方中提供一個介面來獲取當前所有的服務資訊:

@RestController
public class ProviderController {

    //日誌記錄器
    Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    DiscoveryClient discoveryClient;

    @GetMapping("/dept/simlpe/{id}")
    public String simlpe(@PathVariable("id") long id) {
        // 獲取已註冊到Eureka的例項資訊
        String result = JSON.toJSONString(discoveryClient.getServices());
        logger.info(result);
        return "來自服務提供者:" + result;
    }
}

4.5 配置/測試/展示結果

4.5.1 訪問 eureka

此時,啟動Eureka Client,訪問 eureka:
在這裡插入圖片描述
可以看到,服務已經註冊成功了。

4.5.2 訪問 /dept/simlpe/{id}

在這裡插入圖片描述
可以看到,Eureka Client成功的從Eureka Server獲取了服務列表。

4.5.3 顯示具體的服務例項

在 application.yml 檔案中新增如下配置項:

eureka:
  instance:
    instance-id: eureka-client-9005

配置解釋:

  • eureka.instance.instance-id: 用於標識此微服務例項。這裡也可以使用這樣的配置方式instance-id: ${spring.application.name}:${server.port}
    在這裡插入圖片描述
4.5.4 使用IP地址註冊服務例項

在新增配置項之前服務註冊資訊如狀態列所示:此時是使用域名進行註冊。
在這裡插入圖片描述
在 application.yml 檔案中新增如下配置項:

eureka:
  instance:
    prefer-ip-address: true

如下圖,此時是使用IP地址進行註冊:
在這裡插入圖片描述

4.5.5 使用指定IP地址註冊服務例項

在 application.yml 檔案中新增如下配置項並設定 prefer-ip-address:=true:

eureka:
  instance:
    ip-address: 127.0.0.12

如下圖,此時是使用我們指定的IP地址進行註冊:
在這裡插入圖片描述

關於 prefer-ip-address 和 ip-address配置項的詳細解釋請參看這裡1

4.5.6 檢視服務例項的詳細資訊

在 pom.xml中新增依賴並新增一個資訊匹配的外掛:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <delimiters>
                    <delimiter>@</delimiter>
                </delimiters>
                <useDefaultDelimiters>false</useDefaultDelimiters>
            </configuration>
        </plugin>
    </plugins>
</build>

修改 application.yml 配置檔案,追加 info 的相關資訊:

info:
    build:
        artifact: @[email protected]
        name: @[email protected]
        description: @[email protected]
        version: @[email protected]

新增完成後,通過Eureka Server頁面檢視相應服務例項的資訊:
在這裡插入圖片描述
顯示如圖:
在這裡插入圖片描述

4.5.6 配置客戶端心跳

Eureka Client之所以可以與 Eureka Server之間保持聯絡,依靠的是心跳機制,也就是說客戶端可以自己來進行心跳的配置處理。在 application.yml 檔案中新增如下配置項:

eureka:
  instance:
    lease-renewal-interval-in-seconds: 3
    lease-expiration-duration-in-seconds: 4

配置解釋:

  • eureka.instance.lease-renewal-interval-in-seconds:設定心跳的時間間隔(預設是30秒);
  • eureka.instance.lease-expiration-duration-in-seconds:eureka伺服器在接受到例項的最後一次發出的心跳後,需要等待多久才可以將此例項刪除(預設是90秒)。
    如果該值太大,則很可能將流量轉發過去的時候,該instance已經不存活了。
    如果該值設定太小了,則instance則很可能因為臨時的網路抖動而被摘除掉。
    另外,該值至少應該大於lease-renewal-interval-in-seconds。

這裡就不演示了,大家可以將日誌級別調整為 debug,從日誌就可以觀察出來。

4.5.7 健康檢查23

預設情況下,Eureka中各個服務例項的健康檢查並不是通過spring-boot-actuator模組的 /health 端點來實現的,而是依靠客戶端心跳的方式保持服務例項的存活,在Eureka的服務續約與剔除機制下,客戶端的監控狀態從註冊到註冊中心開始都會處於UP狀態,除非心跳終止一段時間之後,服務註冊中心將其剔除。預設的心跳實現方式可以有效檢查客戶端程序是否正常運作,但卻無法保證客戶端應用能夠正常提供服務。由於大多數的應用都會有一些其他的外部資源依賴,比如資料庫。快取、訊息代理等,如果應用與這些外部資源無法聯通的時候,實際上已經不能提供正常的對外服務了,但此時心跳依然正常,所以它還是會被服務消費者呼叫,而這樣的呼叫實際上並不能獲得預期的結果。

在Spring Cloud Eureka中,我們可以通過簡單的配置,把Eureka客戶端的監控檢查交給spring-boot-actuator模組的 /health 端點,以實現更加全面的健康狀態維護。

在 application.yml 檔案中新增如下配置項:

eureka.client.healthcheck.enabled: true
management.endpoint.health.show-details: always # 顯示詳細的健康檢查資訊

然後我們在專案中新增如下配置來驗證一下此配置項:

// 自定義健康檢查:用來控制伺服器的健康狀態
@Component
public class MyHealthChecker implements HealthIndicator {

    private boolean up = true;

    @Override
    public Health health() {
        if (up) {
            return Health.up().build();
        } else {
            return Health.down().build();
        }
    }

    public void setUp(boolean up) {
        this.up = up;
    }
}

在 ProviderController 中新增如下方法:

@RestController
public class ProviderController {

    @Autowired
    MyHealthChecker myHealthChecker;

    @RequestMapping("/up")
    public String up(@RequestParam("up") Boolean up) {
        myHealthChecker.setUp(up);
        return up.toString();
    }
}

重啟Eureka Client後將會註冊到Eureka Server中去,此時顯示的是UP:
在這裡插入圖片描述
然後我們呼叫一下服務:http://127.0.0.1:9005/up?up=false ,此時檢視 http://127.0.0.1:9005/actuator/health ,整個應用的 health 狀態變成 DOWN 了:
在這裡插入圖片描述
註冊中心的服務狀態也將變為DOWN:
在這裡插入圖片描述
另外,我們可以試一下把 application.ym l中 eureka.client.healthcheck.enabled=true 這段配置去掉重新啟動服務,然後呼叫服務將 health 變為 DOWN,但是註冊中心中仍然會顯示該服務的 status 為 UP!

4.5.8 修改狀態頁面和健康監控地址

在 application.yml 檔案中新增如下配置項:

management.server.port: 8088
management.endpoints.web.base-path: /monitor

此時,Eureka Client註冊資訊如下圖所示:
在這裡插入圖片描述
可以看到,註冊資訊不正確,點選例項訪問 info 端點返回 404。問了解決這樣的問題,我們新增如下配置項:

eureka.instance.status-page-url-path: ${management.endpoints.web.base-path}/info

此時,註冊資訊如下,可以正常訪問:
在這裡插入圖片描述

5 附加補充


5.1 其他引數

Eureka Client 的其他引數:

spring:
  cloud:
    inetutils:
      # 忽略指定網絡卡(支援正則),假設你的電腦有 VM 那麼該選項是非常有用的一個選項
      ignored-interfaces:
        #忽略 docker0 網絡卡以及 veth 開頭的網絡卡
        - docker0
        - veth.*
      preferred-networks:
        # 使用指定網路地址,選擇 eth0 網絡卡,當然也可以直接寫 IP (192.168)
        - eth0
        - 192.168

eureka:
  # 客戶端進行Eureka註冊的配置
  client:
    # 是否從eureka伺服器上獲取註冊資訊,預設為true
    fetch-registry: true
    # 當前的微服務是否註冊到eureka之中,預設為true
    register-with-eureka: true
    # 從eureka伺服器端獲取註冊資訊的間隔時間(預設:30秒)
    registry-fetch-interval-seconds: 5

5.2 其他功能介紹

暫無

5.3 遺留問題

暫無

5.3 原始碼地址

原始碼:https://gitee.com/liupeifeng3514/Spring-Cloud-Learning


  1. Eureka服務註冊過程詳解之IpAddress(詳解eureka.instance.prefer-ip-address = true 與 eureka.instance.prefer-ip-address) ↩︎

  2. eureka.client.healthcheck.enabled=true改變eureka server中註冊的服務的健康檢測方式 ↩︎

  3. Eureka服務例項類配置 ↩︎