適用於 Spring 的 Eureka 伺服器是可讓微服務自我註冊並探索其他服務的服務註冊。 適用於 Spring 的 Eureka Server 可作為 Azure Container Apps 元件。 您可以將容器應用程式系結至 Spring 的 Eureka Server,以便向 Eureka 伺服器自動註冊。
在本教學課程中,您會了解如何:
- 建立適用於 Spring Java 元件的 Eureka 伺服器。
- 將容器應用程式系結至適用於 Spring Java 的 Eureka 伺服器元件。
重要
本教學課程所使用的服務,可能會影響您的 Azure 帳單。 如果您決定跟著這篇文章操作,請務必刪除這篇文章提到的資源,以免發生非預期的計費。
必要條件
考量
當您在 Container Apps 中執行適用於 Spring 的 Eureka 伺服器時,請注意下列詳細數據:
| 項目 | 說明 |
|---|---|
| Scope | 適用於 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 Java 應用程式建立一個 Eureka 伺服器。 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 Java 组件的 Eureka 伺服器
現在您已擁有現有的環境,接下來您可以建立容器應用程式,並將其繫結至適用於 Spring 的 Eureka 伺服器 Java 元件執行個體。
建立適用於 Spring Java 的 Eureka 伺服器元件。
az containerapp env java-component eureka-server-for-spring create \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $EUREKA_COMPONENT_NAME可選擇:更新 Spring Java 元件的 Eureka 伺服器設定。
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 Java 元件的 Eureka 伺服器
建立容器應用程式,並將其系結至適用於 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 角色。 您也可以遵循步驟來建立自定義角色定義,並將它指派給您的帳戶。
注意
Azure China 21Vianet 中無法使用儀錶板。
建立自定義角色定義。
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 的 Admin 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.BuilderBean,以執行對其他服務的負載均衡呼叫。@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和應用程式名稱 '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); } }
您現在擁有呼叫者和被呼叫者應用程式,這兩個應用程式使用 Eureka Server 來為 Spring Java 元件之間進行通訊。 在呼叫端應用程式中測試 /call-callee 端點之前,請確定這兩個應用程式都正在執行並系結到 Eureka 伺服器。
限制
- Eureka Server Java 元件隨附預設組態
eureka.server.enable-self-preservation,設定為false。 此預設組態有助於避免在啟用自我保留后未刪除實例的時間。 如果實例被過早刪除,某些請求可能會導向不存在的實例。 如果您想要將此設定變更為true,您可以在 Java 元件中設定自己的組態來覆寫它。 - Azure China 21Vianet 上無法使用 Eureka 儀錶板。