0

Eureka/Ribbon を介してサービスのインスタンスを取得しようとしている Spring Boot アプリがあります。

@LoadBalanced
@Autowired
RestTemplate restTemplate;

@RequestMapping("/hi")
public String hi(@RequestParam(value="name", defaultValue="superuser") String name) {
    AccountRest account = this.restTemplate.getForObject("http://AUTHENTICATION-SERVICE/authservice/v1/accounts/userId/"+name,
        AccountRest.class);
return "hi, " + account.getId(); 
}

「AUTHENTICATION-SERVICE」を手動で登録しています。このサービスは自分自身を登録するだけでよく、eureka に問い合わせる必要はないことに注意してください。

public class ServiceDiscoveryManager {

    private ApplicationInfoManager applicationInfoManager;
    private EurekaClient eurekaClient;

    public void start() {
        MyDataCenterInstanceConfig instanceConfig = new MyDataCenterInstanceConfig();
        DefaultEurekaClientConfig clientConfig = new DefaultEurekaClientConfig();

        InstanceInfo instanceInfo = new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get();
        applicationInfoManager = new ApplicationInfoManager(instanceConfig, instanceInfo);
        eurekaClient = new DiscoveryClient(applicationInfoManager, clientConfig);

        applicationInfoManager.getInfo();
        eurekaClient.getApplications();

        instanceInfo.setStatus(InstanceStatus.UP);
    }

    public void stop() {
        eurekaClient.shutdown();
    }

}

ServiceDiscoveryManager のスプリング ワイヤリング:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

    <bean id="serviceDiscoveryManager" class="com.embotics.authervice.serviceDiscovery.ServiceDiscoveryManager" init-method="start"/>

</beans>

authentication-service eureka-client.properties ファイル:

eureka.name=AUTHENTICATION-SERVICE
eureka.appGroup=AUTHENTICATION-SERVICE
eureka.vipAddress=http://localhost:9080
eureka.port.enabled=true
eureka.port=9080
eureka.traffic.enabled=true
eureka.preferSameZone=true
eureka.serviceUrl.default=http://localhost:8000/eureka/
eureka.decoderName=JacksonJson
eureka.healthCheckUrl=http://localhost:9080/authservice/health
eureka.healthCheckPath=/authservice/health

Eureka ダッシュボードには、認証サービスが登録済みとして表示されます。

捕獲

ロード バランサーで認証サービスのインスタンスを取得しようとすると、次の例外が発生します。

java.lang.IllegalStateException: No instances available for AUTHENTICATION-SERVICE
    at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:90) ~[spring-cloud-netflix-core-1.2.5.RELEASE.jar:1.2.5.RELEASE]

ロード バランサーが authentication-service を認識していることを確認しましたが、DynamicServerListLoadBalancer の allServerList プロパティは空です。

いくつかの構成が無効ではないかと考えて、これを数時間いじっています。助けてくれてありがとう。

4

0 に答える 0