在 Azure 容器應用程式中連接到托管的 Spring Eureka 伺服器

適用於 Spring 的 Eureka 伺服器是可讓微服務自我註冊並探索其他服務的服務註冊。 Eureka Server for Spring 係 Azure 容器應用程式 組件之一。 您可以將容器應用程式系結至 Spring 的 Eureka Server,以便向 Eureka 伺服器自動註冊。

在本教學課程中,您會了解如何:

  • 建立一個 Eureka Server 給 Spring Java 組件。
  • 將你的容器應用程式綁定到 Eureka Server for Spring Java 元件。

重要

本教學使用可能影響 Azure 帳單的服務。 如果您決定跟著這篇文章操作,請務必刪除這篇文章提到的資源,以免發生非預期的計費。

必要條件

  • 一個有有效訂閱的 Azure 帳號。 如果您還沒有帳戶,您可以 免費建立一個。
  • Azure CLI

考量

當您在 Container Apps 中執行適用於 Spring 的 Eureka 伺服器時,請注意下列詳細數據:

項目 說明
Scope 適用於 Spring 的 Eureka 伺服器元件會在與連線的容器應用程式相同的環境中執行。
調整大小 適用於 Spring 的 Eureka 伺服器無法擴展。 縮放屬性 minReplicasmaxReplicas 都會設定為 1。 若要達到高可用性,請參閱 在容器應用程式中建立高可用性的 Eureka 服務。
資源 已修正適用於 Spring 的 Eureka 伺服器的容器資源配置。 CPU 核心數為 0.5,記憶體大小為 1 Gi
定價 適用於 Spring 的 Eureka 伺服器使用按使用量計費的定價策略。 受管理的 Java 元件所消耗的資源會依活動/閒置速率計費。 您可以刪除不再使用的元件來停止計費。
綁定 容器應用程式會透過繫結來連線到適用於 Spring 的 Eureka 伺服器元件。 繫結會將設定插入到容器應用程式的環境變數中。 建立系結之後,容器應用程式可以從環境變數讀取組態值,並聯機到適用於 Spring 的 Eureka Server 元件。

設定

開始使用適用於 Spring 的 Eureka 伺服器元件之前,您必須先建立必要的資源。

執行下列命令,在容器應用程式環境中建立您的資源群組。

  1. 建立變數以支援您的應用程式設定。 這些值是針對本課程的目的而向您提供的。

    export LOCATION=eastus
    export RESOURCE_GROUP=my-services-resource-group
    export ENVIRONMENT=my-environment
    export EUREKA_COMPONENT_NAME=eureka
    export APP_NAME=my-eureka-client
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-service-eureka-client:latest"
    
    變數 描述
    LOCATION 就是你建立容器應用程式和 Java 元件的 Azure 區域位置。
    ENVIRONMENT 示範應用程式的容器應用程式環境名稱。
    RESOURCE_GROUP 用於示範應用程式的 Azure 資源群組名稱。
    EUREKA_COMPONENT_NAME 為你的容器應用程式建立的 Java 元件名稱。 在這種情況下,你需要建立一個 Eureka Server for Spring Java 元件。
    IMAGE 容器應用程式中所使用的容器映像。
  2. 用 Azure CLI 登入 Azure。

    az login
    
  3. 建立資源群組。

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. 建立容器應用程式環境。

    az containerapp env create \
      --name $ENVIRONMENT \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION
    

為 Spring Java 元件建立 Eureka Server

既然你已經有了環境,就可以建立容器應用程式,並將其綁定到 Eureka Server for Spring 的 Java 元件實例。

  1. 建立 Eureka Server for Spring Java 元件。

    az containerapp env java-component eureka-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME
    
  2. 可選:更新 Eureka Server 以支援 Spring Java 元件配置。

    az containerapp env java-component eureka-server-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME
        --configuration eureka.server.renewal-percent-threshold=0.85 eureka.server.eviction-interval-timer-in-ms=10000
    

將你的容器應用程式綁定到 Eureka Server for Spring Java 元件

  1. 建立容器應用程式,並將其系結至適用於 Spring 的 Eureka 伺服器元件。

    az containerapp create \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT \
        --image $IMAGE \
        --min-replicas 1 \
        --max-replicas 1 \
        --ingress external \
        --target-port 8080 \
        --bind $EUREKA_COMPONENT_NAME \
        --query properties.configuration.ingress.fqdn
    
  2. 將應用程式的 URL 複製到文字編輯器,讓您可以在後續步驟中使用它。

返回入口網站中的容器應用程式。 將應用程式的 URL 複製到文字編輯器,讓您可以在後續步驟中使用它。

移至 /allRegistrationStatus 路由,以檢視已向 Eureka Server for Spring 元件註冊的所有應用程式。

繫結會將數個設定插入到應用程式中作為環境變數,主要是 eureka.client.service-url.defaultZone 屬性。 此屬性表示 Eureka Server Java 元件的內部端點。

繫結也會注入下列屬性:

"eureka.client.register-with-eureka":    "true"
"eureka.client.fetch-registry":          "true"
"eureka.instance.prefer-ip-address":     "true"

eureka.client.register-with-eureka 屬性會設定為 true,以強制向 Eureka 伺服器註冊。 此註冊會覆寫 application.properties 中的本機設定,以及來自組態伺服器等位置的設定。 如果您想要將其設定為 false,則可以在容器應用程式中設定環境變數來加以覆寫。

屬性 eureka.instance.prefer-ip-address 會設定為 true ,因為容器應用程式環境中的特定域名系統解析規則。 請勿修改此值,以免中斷系結。

可選:解除您的容器應用程式與 Eureka Server for Spring Java 元件的綁定

若要從容器應用程式中移除繫結,請使用 --unbind 選項。

az containerapp update \
    --name $APP_NAME \
    --unbind $JAVA_COMPONENT_NAME \
    --resource-group $RESOURCE_GROUP

透過儀表板檢視應用程式

重要

若要檢視儀表板,您至少需要在受控環境資源上,將 Microsoft.App/managedEnvironments/write 角色指派給您的帳戶。 您可以在資源上明確指派 OwnerContributor 角色。 您也可以遵循步驟來建立自定義角色定義,並將它指派給您的帳戶。

注意

這個儀表板在 21Vianet 營運的 Azure 中無法使用。

  1. 建立自定義角色定義。

    az role definition create --role-definition '{
        "Name": "<YOUR_ROLE_NAME>",
        "IsCustom": true,
        "Description": "Can access managed Java Component dashboards in managed environments",
        "Actions": [
            "Microsoft.App/managedEnvironments/write"
        ],
        "AssignableScopes": ["/subscriptions/<SUBSCRIPTION_ID>"]
    }'
    

    請務必將 <SUBSCRIPTION_ID> 值中的 AssignableScopes 預留位置替換為您的訂用帳戶 ID。

  2. 將自訂角色指派給您在受控環境資源上的帳戶。

    取得受控環境的資源識別碼:

    export ENVIRONMENT_ID=$(az containerapp env show \
        --name $ENVIRONMENT --resource-group $RESOURCE_GROUP \
        --query id \
        --output tsv)
    
  3. 將角色指派給您的帳戶。

    在執行此命令之前,請用您的使用者或服務主體識別碼以及角色名稱替換由<>括號表示的佔位符。

    az role assignment create \
        --assignee <USER_OR_SERVICE_PRINCIPAL_ID> \
        --role "<ROLE_NAME>" \
        --scope $ENVIRONMENT_ID
    

    注意

    <USER_OR_SERVICE_PRINCIPAL_ID> 值通常應該是你用來存取 Azure 入口網站的身份。 值 <ROLE_NAME> 是您在步驟 1 中指派的名稱。

  4. 取得 Spring 控制面板的 Eureka 伺服器 URL。

    az containerapp env java-component eureka-server-for-spring show \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME \
        --query properties.ingress.fqdn \
        --output tsv
    

    此命令會傳回可用來存取 Spring 儀錶板的 Eureka 伺服器 URL。 透過儀錶板,您也可以看到容器應用程式,如下列螢幕快照所示。

    顯示適用於 Spring 儀錶板的 Eureka 伺服器螢幕快照。

可選:整合 Eureka Server for Spring 及 Admin for Spring Java 元件

如果你想將 Spring 的 Eureka 伺服器與 Spring Java 元件的 Admin 管理工具整合,請參見 將 Spring 的 Eureka 伺服器與 Spring 的 Admin 管理工具整合

清除資源

本教學中建立的資源會影響你的 Azure 帳單。 如果您不打算長期使用這些服務,請執行下列命令來移除您在本教學課程中建立的所有專案。

az group delete --resource-group $RESOURCE_GROUP

適用於 Spring 的 Eureka 伺服器允許的組態清單

下列各節說明支援的組態。 如需詳細資訊,請參閱 Spring Cloud Eureka Server

注意

你可以提交支援單以申請新功能。

設定選項

az containerapp update命令使用--configuration參數來控制 Spring 的 Eureka 伺服器的設定方式。 只要多個參數是以空格分隔,就可以一次使用多個參數。 如需詳細資訊,請參閱 Spring Cloud Eureka Server

eureka.server 組態屬性上可用的下列組態設定:

名稱 描述 預設值
eureka.server.enable-self-preservation 啟用後,伺服器會追蹤在伺服器端預期應收到的續約數量。 當續約次數低於定義 eureka.server.renewal-percent-threshold的門檻百分比時。 原始 Eureka 伺服器的預設值設為 true,但在 Eureka Server Java 元件中,預設值設為 false。 請參閱 Spring Java 元件的 Eureka Server 限制 false
eureka.server.renewal-percent-threshold eureka.server.renewal-threshold-update-interval-ms 指定期間內,預期用戶端傳送的最小續約百分比。 如果更新低於閾值,並且 eureka.server.enable-self-preservation 已啟用,則到期日將被停用。 0.85
eureka.server.renewal-threshold-update-interval-ms 必須根據eureka.server.renewal-percent-threshold中指定的時間間隔來更新閾值。 0
eureka.server.expected-client-renewal-interval-seconds 預期用戶端傳送活動訊號的間隔。 預設為 30 秒。 如果用戶端傳送的心跳頻率不同,例如每 15 秒一次,則應相應調整此參數,否則自我保護機制將無法如預期運作。 30
eureka.server.response-cache-auto-expiration-in-seconds 如果變更事件沒有使登錄檔有效載荷失效,則會取得該登錄檔有效載荷應該在快取中保留的時間。 180
eureka.server.response-cache-update-interval-ms 取得應更新用戶端承載快取的時間間隔。 0
eureka.server.use-read-only-response-cache com.netflix.eureka.registry.ResponseCache目前使用雙層快取策略來處理回應。 具有到期原則的 readWrite 快取,以及不設到期時間的 readonly 快取。 true
eureka.server.disable-delta 檢查是否可以將差異資訊提供給用戶端。 false
eureka.server.retention-time-in-m-s-in-delta-queue 取得應快取差異資訊的時間,讓用戶端擷取該值時不會遺漏。 0
eureka.server.delta-retention-timer-interval-in-ms 取得清理工作喚醒並檢查過期差異資訊的時間間隔。 0
eureka.server.eviction-interval-timer-in-ms 取得讓執行個體過期的工作應喚醒並執行的時間間隔。 60000
eureka.server.sync-when-timestamp-differs 檢查在時間戳記不相同時是否要同步實例。 true
eureka.server.rate-limiter-enabled 指出是否應該啟用或停用速率限制子。 false
eureka.server.rate-limiter-burst-size 速率限制器,令牌桶算法屬性。 10
eureka.server.rate-limiter-registry-fetch-average-rate 速率限制器,令牌桶算法屬性。 指定平均強制要求速率。 500
eureka.server.rate-limiter-privileged-clients 這是一份除了標準 Eureka Java 客戶端外,還能獲得認證的客戶名單。 N/A
eureka.server.rate-limiter-throttle-standard-clients 請確認是否對標準客戶端進行速率限制。 如果設定為 false,則只有非標準用戶端的速率有限。 false
eureka.server.rate-limiter-full-fetch-average-rate 速率限制器,令牌桶算法屬性。 指定平均強制要求速率。 100

一般設定

  • 記錄相關設定:
    • logging.level.*
    • logging.group.*
    • 命名空間下 logging.* 的任何其他設定都應該禁止 ,例如,應該禁止使用 logging.file 寫入記錄檔。

在應用程式之間呼叫

這個範例展示了如何撰寫 Java 程式碼,在註冊於 Eureka Server for Spring 元件的應用程式之間呼叫。 當容器應用程式與 Eureka 系結時,它們會透過 Eureka 伺服器彼此通訊。

此範例會建立兩個應用程式、呼叫端和被呼叫者。 這兩個應用程式會使用適用於 Spring 的 Eureka 伺服器元件彼此通訊。 被呼叫端應用程式會公開一個端點,供呼叫端應用程式呼叫。

  1. 建立被呼叫端應用程式。 在 Spring Boot 應用程式中啟用 Eureka 用戶端,方法是將 @EnableDiscoveryClient 批註新增至您的主要類別。

    @SpringBootApplication
    @EnableDiscoveryClient
    public class CalleeApplication {
      public static void main(String[] args) {
        SpringApplication.run(CalleeApplication.class, args);
      }
    }
    
  2. 在被呼叫端應用程式中建立一個端點,供呼叫端應用程式呼叫。

    @RestController
    public class CalleeController {
    
        @GetMapping("/call")
        public String calledByCaller() {
            return "Hello from Application callee!";
        }
    }
    
  3. 在應用程式組態檔中設定受呼叫應用程式的名稱,例如,在 application.yml 內。

    spring.application.name=callee
    
  4. 建立呼叫端應用程式。

    @EnableDiscoveryClient新增註釋以啟用 Eureka 用戶端功能。 另外,建立具有 WebClient.Builder 註釋的 @LoadBalanced Bean,以對其他服務執行負載平衡呼叫。

    @SpringBootApplication
    @EnableDiscoveryClient
    public class CallerApplication {
      public static void main(String[] args) {
        SpringApplication.run(CallerApplication.class, args);
      }
    
      @Bean
      @LoadBalanced
      public WebClient.Builder loadBalancedWebClientBuilder() {
        return WebClient.builder();
      }
    }
    
  5. 在呼叫端應用程式中建立控制器,使用 WebClient.Builder 並透過應用程式名稱 callee 來呼叫被呼叫端應用程式。

    @RestController
    public class CallerController {
        @Autowired
        private WebClient.Builder webClientBuilder;
    
        @GetMapping("/call-callee")
        public Mono<String> callCallee() {
            return webClientBuilder.build()
                .get()
                .uri("http://callee/call")
                .retrieve()
                .bodyToMono(String.class);
        }
    }
    

現在,您已擁有呼叫端和被呼叫端應用程式,它們會使用適用於 Spring Java 元件的 Eureka Server 彼此通訊。 在呼叫端應用程式中測試 /call-callee 端點之前,請確定這兩個應用程式都正在執行並系結到 Eureka 伺服器。

限制

  • Eureka Server Java 元件預設配置為 eureka.server.enable-self-preservation,設定為 false。 此預設組態有助於避免在啟用自我保留后未刪除實例的時間。 如果實例被過早刪除,某些請求可能會導向不存在的實例。 如果你想把這個設定改成 true,可以在 Java 元件裡自訂配置來覆蓋它。
  • Eureka 儀表板在 21Vianet 的 Azure 中無法使用。

下一步

將受控的適用於 Spring 的 Admin 與適用於 Spring 的 Eureka Server 整合