Spring Cloud Eureka Server中一個服務會註冊多個服務實例,而每個實例是以Eureka Instance ID來做唯一識別。
Eureka Instance ID預設是以下面的取得的值來命名:
${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}
${spring.cloud.client.hostname}
為實例所在的伺服器位址;
${spring.application.name}
為服務名稱;
${spring.application.instance_id:${server.port}}
為把spring.application.instance_id
設為server.port
。
例如下面為某個Eureka Client服務的application.yml
設定。
application.yml
# Spring properties
spring:
application:
name: message-service #服務名稱
# Discovery Server Access
eureka:
client:
service-url:
default-zone: http://localhost:8761/eureka/
# HTTP Server
server:
port: 2224 # HTTP (Tomcat) port
若該服務的IP為192.169.0.123,結合以上的設定則組合起來的Eureka Instance ID為
192.169.0.123:message-service:2224
也就是在Eureka Server UI畫面看已註冊服務status欄位所顯示的名稱。
若要在服務的應用程式中取得Eureka Instance ID名稱,可透過EurekaClient
取得。
@SpringBootApplication
public class MessageApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(MessageApplication.class, args);
EurekaClient client = ctx.getBean(EurekaClient.class);
String instanceId = client.getApplicationInfoManager().getInfo().getInstanceId();
System.out.println(instanceId); // 192.169.0.123:message-service:2224
}
}
或是使用@Value
注入properties檔的參數設定。但要注意這個方法必須在properites檔中有明確定義eureka.instance.instance-id
,否則會出現Could not resolve placeholder錯誤。
@RestController
@RequestMapping("messages")
public class MessageController {
@Value("${eureka.instance.instance-id}")
private String instanceId;
...
}
參考:
沒有留言:
張貼留言