Spring cloud 针对发现服务(eureka)的loadbalanced ribbon客户端初始化

Spring cloud 针对发现服务(eureka)的loadbalanced ribbon客户端初始化,spring-cloud,netflix,netflix-eureka,spring-cloud-netflix,netflix-ribbon,Spring Cloud,Netflix,Netflix Eureka,Spring Cloud Netflix,Netflix Ribbon,我有一个服务,它在应用程序启动后运行一些init脚本(用ApplicationListener实现)是示例应用程序。我主要感兴趣的是如何工作 edit2: 现在有了创建EurekaListener的解决方案 public static class InitializerListener implements EurekaEventListener { private EurekaClient eurekaClient; private RestOperations restTe

我有一个服务,它在应用程序启动后运行一些init脚本(用
ApplicationListener实现)是示例应用程序。我主要感兴趣的是如何工作

edit2:

现在有了创建EurekaListener的解决方案

public static class InitializerListener implements EurekaEventListener {

    private EurekaClient eurekaClient;
    private RestOperations restTemplate;

    public InitializerListener(EurekaClient eurekaClient, RestOperations restTemplate) {
        this.eurekaClient = eurekaClient;
        this.restTemplate = restTemplate;
    }

    @Override
    public void onEvent(EurekaEvent event) {
        if (event instanceof StatusChangeEvent) {
            if (((StatusChangeEvent) event).getStatus().equals(InstanceInfo.InstanceStatus.UP)) {
                ResponseEntity<String> helloResponse = restTemplate.getForEntity("http://api-service/hello-controller/{name}", String.class, "my friend");
                logger.debug("Response from controller is {}", helloResponse.getBody());
                eurekaClient.unregisterEventListener(this);
            }
        }
    }
}

但是,这仅在应用程序首次注册到discovery service时执行。下次当我停止api服务并再次运行它时,事件不会发布。是否还有其他可以捕获的事件?

目前,在Camden和更早版本中,应用程序需要在Eureka中注册,然后才能查询其他事件r应用程序。在注册生命周期中,您的呼叫可能太早。有一个
InstanceRegistereEvent
可能会有所帮助。Dalston发布系列中有计划处理这个问题。

即使我将事件更改为
InstanceRegistereEvent
我也会得到相同的异常(没有可用的实例-我将其推送到github)。还有什么可以帮助我的吗?我可以看到事件中的配置对象可以转换到
EurekaInstanceConfigBean
,从那里我可以获得目标服务的ip地址和端口,但我认为在这种情况下我不能使用@LoadBalanced rest模板。如果我可以帮助您调查这个问题,请告诉我。我需要在当前项目中使用此功能。谢谢我已经创建了侦听器(请参阅编辑的问题),但存在的问题是,它不是每次重新启动应用程序时都执行。是否可以侦听每次应用程序注册到注册表服务器时调用的某个事件?
public static class InitializerListener implements EurekaEventListener {

    private EurekaClient eurekaClient;
    private RestOperations restTemplate;

    public InitializerListener(EurekaClient eurekaClient, RestOperations restTemplate) {
        this.eurekaClient = eurekaClient;
        this.restTemplate = restTemplate;
    }

    @Override
    public void onEvent(EurekaEvent event) {
        if (event instanceof StatusChangeEvent) {
            if (((StatusChangeEvent) event).getStatus().equals(InstanceInfo.InstanceStatus.UP)) {
                ResponseEntity<String> helloResponse = restTemplate.getForEntity("http://api-service/hello-controller/{name}", String.class, "my friend");
                logger.debug("Response from controller is {}", helloResponse.getBody());
                eurekaClient.unregisterEventListener(this);
            }
        }
    }
}
EurekaEventListener initializerListener = new InitializerListener(discoveryClient, restTemplate);
discoveryClient.registerEventListener(initializerListener);