教學課程:在 Azure 容器應用程式中連線到適用於 Spring 的受控 Eureka 伺服器
適用於 Spring 的 Eureka 伺服器是可讓微服務自我註冊並探索其他服務的服務註冊。 適用於 Spring 的 Eureka Server 可作為 Azure Container Apps 元件。 您可以將容器應用程式系結至 Spring 的 Eureka Server,以便向 Eureka 伺服器自動註冊。
在本教學課程中,您會了解如何:
- 建立適用於 Spring Java 元件的 Eureka 伺服器。
- 將容器應用程式系結至適用於 Spring Java 的 Eureka 伺服器元件。
重要
本教學課程所使用的服務,可能會影響您的 Azure 帳單。 如果您決定跟著操作,請務必刪除本文中精選的資源,以避免非預期的計費。
必要條件
考量
當您在 Container Apps 中執行適用於 Spring 的 Eureka 伺服器時,請注意下列詳細數據:
項目 | 說明 |
---|---|
範圍 | 適用於 Spring 的 Eureka 伺服器元件會在與連線的容器應用程式相同的環境中執行。 |
調整大小 | 適用於 Spring 元件的 Eureka 伺服器無法調整。 縮放屬性 minReplicas 與 maxReplicas 都會設定為 1 。 若要達到高可用性,請參閱 在容器應用程式中建立高可用性的 Eureka 服務。 |
資源 | 已修正適用於 Spring 的 Eureka 伺服器的容器資源配置。 CPU 核心數目為 0.5,記憶體大小為 1 Gi。 |
定價 | 適用於 Spring 的 Eureka 伺服器在計費上會低於使用量型定價。 受控 Java 元件所取用的資源會以使用/閒置費率計費。 您可以刪除不再使用的元件來停止計費。 |
繫結 | 容器應用程式會透過繫結來連線到適用於 Spring 的 Eureka 伺服器元件。 繫結會將設定插入到容器應用程式的環境變數中。 建立系結之後,容器應用程式可以從環境變數讀取組態值,並聯機到適用於 Spring 的 Eureka Server 元件。 |
設定
開始使用適用於 Spring 的 Eureka 伺服器元件之前,您必須先建立必要的資源。
執行下列命令,在容器應用程式環境中建立您的資源群組。
建立變數以支援您的應用程式設定。 這些值是針對本課程的目的而向您提供的。
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
容器應用程式中所使用的容器映像。 使用 Azure CLI 登入 Azure。
az login
建立資源群組。
az group create --name $RESOURCE_GROUP --location $LOCATION
建立容器應用程式環境。
az containerapp env create \ --name $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --location $LOCATION
建立適用於 Spring 的 Eureka 伺服器 Java 元件
現在您已擁有現有的環境,接下來您可以建立容器應用程式,並將其繫結至適用於 Spring 的 Eureka 伺服器 Java 元件執行個體。
建立適用於 Spring 的 Eureka 伺服器 Java 元件。
az containerapp env java-component eureka-server-for-spring create \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $EUREKA_COMPONENT_NAME
選用:更新適用於 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 元件
建立容器應用程式,並將其系結至適用於 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
將應用程式的 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
角色指派給您在受控環境資源上的帳戶。 您可以在資源上明確指派 Owner
或 Contributor
角色。 您也可以遵循步驟來建立自定義角色定義,並將它指派給您的帳戶。
建立自定義角色定義。
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
佔位元取代為您的訂用帳戶標識碼。將自定義角色指派給受控環境資源的帳戶。
取得受控環境的資源識別碼:
export ENVIRONMENT_ID=$(az containerapp env show \ --name $ENVIRONMENT --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
將角色指派給您的帳戶。
執行此命令之前,請以您的使用者或服務主體識別碼和角色名稱取代以括號表示
<>
的佔位元元。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 中指派的名稱。取得適用於 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 的管理員 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 伺服器元件彼此通訊。 被呼叫端應用程式會公開呼叫端應用程式所呼叫的端點。
建立被呼叫端應用程式。 在 Spring Boot 應用程式中啟用 Eureka 用戶端,方法是將
@EnableDiscoveryClient
批註新增至您的主要類別。@SpringBootApplication @EnableDiscoveryClient public class CalleeApplication { public static void main(String[] args) { SpringApplication.run(CalleeApplication.class, args); } }
在被呼叫端應用程式呼叫的被呼叫端應用程式中建立端點。
@RestController public class CalleeController { @GetMapping("/call") public String calledByCaller() { return "Hello from Application callee!"; } }
在應用程式組態檔中設定被呼叫者應用程式的名稱,例如,在 application.yml。
spring.application.name=callee
建立呼叫端應用程式。
@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(); } }
在呼叫端應用程式中建立控制器,以使用
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 元件中設定自己的組態來覆寫它。