網頁

2019/7/16

Spring Cloud Eureka 取得服務的instanceId名稱

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;
    ...   
}

參考:

沒有留言:

張貼留言