共用方式為


教學課程:在 Azure 容器應用程式中連線到適用於 Spring 的受控 Eureka 伺服器

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

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

  • 建立適用於 Spring Java 元件的 Eureka 伺服器。
  • 將容器應用程式系結至適用於 Spring Java 的 Eureka 伺服器元件。

重要

本教學課程所使用的服務,可能會影響您的 Azure 帳單。 如果您決定跟著操作,請務必刪除本文中精選的資源,以避免非預期的計費。

必要條件

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

考量

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

項目 說明
範圍 適用於 Spring 的 Eureka 伺服器元件會在與連線的容器應用程式相同的環境中執行。
調整大小 適用於 Spring Conponent 的 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 元件的名稱。 在本案例中,您會建立適用於 Spring 的 Eureka 伺服器 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 的 Eureka 伺服器 Java 元件

現在您已擁有現有的環境,接下來您可以建立容器應用程式,並將其繫結至適用於 Spring 的 Eureka 伺服器 Java 元件執行個體。

  1. 建立適用於 Spring 的 Eureka 伺服器 Java 元件。

    az containerapp env java-component eureka-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME
    
  2. 選用:更新適用於 Spring 的 Eureka 伺服器 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
    

將容器應用程式繫結至適用於 Spring 的 Eureka 伺服器 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 伺服器 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 ,因為容器應用程式環境中的特定域名系統解析規則。 請勿修改此值,以免中斷系結。

選擇性:從適用於 Spring Java 的 Eureka Server 元件解除系結您的容器應用程式

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

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

透過儀表板檢視應用程式

重要

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

  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 佔位元取代為您的訂用帳戶標識碼。

  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 伺服器螢幕快照。

選用:整合適用於 Spring 的 Eureka 伺服器與適用於 Spring 的管理員 Java 元件

如果您想要整合適用於 Spring 的 Eureka 伺服器與適用於 Spring 的管理員 Java 元件,請參閱整合適用於 Spring 的受控管理員與適用於 Spring 的 Eureka 伺服器

清除資源

本教學課程中建立的資源會影響您的 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 伺服器限制。 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 程式代碼,以在已向 Spring 元件的 Eureka Server 註冊的應用程式之間進行呼叫。 當容器應用程式與 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 用戶端功能。 此外,使用@LoadBalanced註釋建立 WebClient.Builder 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 其應用程式名稱呼叫被呼叫端應用程式, 被呼叫者。

    @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 元件中設定自己的組態來覆寫它。

下一步

整合適用於 Spring 的受控管理員與適用於 Spring 的 Eureka 伺服器