Eureka Получение списка услуг
Как я могу получить уже зарегистрированный сервис от eureka?
Приведенный ниже код дает подробную информацию о конкретной услуге. Но я хочу список зарегистрированных сервисов.
Код:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
@RestController
class ServiceInstanceRestController {
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/service-instances/{applicationName}")
public List<ServiceInstance> serviceInstancesByApplicationName(
@PathVariable String applicationName) {
return this.discoveryClient.getInstances(applicationName);
}
}
1 ответ
Довольно просто на самом деле:)
List<Application> applications = discoveryClient.getApplications().getRegisteredApplications();
for (Application application : applications) {
List<InstanceInfo> applicationsInstances = application.getInstances();
for (InstanceInfo applicationsInstance : applicationsInstances) {
String name = applicationsInstance.getAppName();
String url = applicationsInstance.getHomePageUrl();
System.out.println(name + ": " + url);
}
}
Или, если вы не хотите тащить за собой весь мир библиотек spring-boot/Eureka и предпочитаете "чистый" тонкий клиент, вы можете просто выполнить простой GET для
http://<eureka host>:<port>/eureka/apps
как описано здесь Использование Eureka в качестве реестра с использованием REST API или, как мы это делаем, с использованием API администратора Springboot (описанного здесь, например, https://codecentric.github.io/spring-boot-admin/1.5.7/) и просто сделайте простой GET к
http://<springbootadmin host>:<port>/api/applications
при предоставлении учетных данных для входа с использованием заголовка Basic auth, т.е.
"Basic", java.util.Base64.getEncoder().encodeToString(("<springboot admin user>" + ":" + "<pwd>").getBytes());
Затем вы получите красивый ответ JSON, который легко проанализировать в коллекции объектов Java с использованием атрибутов JSON.
private String name; // service name
private String managementUrl; // an url from which host and port can be easily grabbed
private StatusInfo statusInfo; // telling whether this service instance is up or down
например. Добавьте правильный hashcode () на основе toString () и equals(), и у вас будет что-то довольно подходящее для работы, хотите ли вы работать с наборами запущенных служб "в любом экземпляре" или уникальных экземплярах.