SpringBootマイクロサービスとa RESTクライアントを作成しました。クライアントは別のモジュールの一部であり、マイクロサービスに対してRESTful呼び出しを行います。マイクロサービスはEurekaレジストリに登録されますクライアント(Spring Bootプロジェクトではありません)がEurekaを使用してサービスエンドポイントをクエリおよび取得するようにします。
私の問題は、クライアントがSpring-Bootアプリケーションではないため、@SpringBootApplication
、@EnableDiscoveryClient
などのアノテーションを使用できず、DiscoveryClient
がアプリケーションに自動配線されないことです。アノテーションを使用せずにDiscoveryClient
Beanをクライアントに手動で自動配線する方法はありますか?
さて、これは私がそれをした方法です。基本的には思ったよりずっと簡単です。以下は Netflix eurekaプロジェクトからコピーされました。
DiscoveryManager.getInstance().initComponent(new MyDataCenterInstanceConfig(), new DefaultEurekaClientConfig());
String vipAddress = "MY-SERVICE";
InstanceInfo nextServerInfo = null;
try {
nextServerInfo = DiscoveryManager.getInstance()
.getEurekaClient()
.getNextServerFromEureka(vipAddress, false);
} catch (Exception e) {
System.err.println("Cannot get an instance of example service to talk to from eureka");
System.exit(-1);
}
System.out.println("Found an instance of example service to talk to from eureka: "
+ nextServerInfo.getVIPAddress() + ":" + nextServerInfo.getPort());
System.out.println("healthCheckUrl: " + nextServerInfo.getHealthCheckUrl());
System.out.println("override: " + nextServerInfo.getOverriddenStatus());
System.out.println("Server Host Name "+ nextServerInfo.getHostName() + " at port " + nextServerInfo.getPort() );
また、構成ファイルをクラスパスに追加する必要があります。 Eurekaクライアントは、このファイルを使用してeurekaサーバーに関する情報を読み取ります。
eureka.preferSameZone=true
eureka.shouldUseDns=false
eureka.serviceUrl.default=http://localhost:8761/eureka/
eureka.decoderName=JacksonJson
また、依存関係としてeurekaクライアントを提供する必要があります。 Eureka1はJDK7をサポートしていますが、その一部はJDK8で構築されています。ただし、JDK7で実行するには、古いバージョンの「archaius-core」と「servo-core」を提供する必要がありました。
<dependency>
<groupId>com.netflix.archaius</groupId>
<artifactId>archaius-core</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>com.netflix.servo</groupId>
<artifactId>servo-core</artifactId>
<version>0.10.0</version>
</dependency>
Eureka2はJDK7を完全にサポートしています。
Spring-cloudなしでnetflix-eureka-clientを使用し、すべてを自分で構成する必要があります(つまり、EurekaDiscoveryClientConfigurationを複製します)
または、サイドカーサービスを実行することもできます。サイドカーには、eurekaによって検出されたサービスをプロキシするzuulプロキシが含まれています。 Spring Cloud Docs-SidecarによるPolyglotのサポート をご覧ください
レガシースプリング(非ブート)からEurekaにアクセスすることも、@ EnableEurekaや@EnableFeignClientのように簡単になります。
これは私がそれを機能させることができる最も近いものです。この例はEurekaで利用できます-GitHubの例
public class EurekaConfiguration {
private static ApplicationInfoManager applicationInfoManager;
private static EurekaClient eurekaClient;
private static synchronized ApplicationInfoManager initializeApplicationInfoManager(
EurekaInstanceConfig instanceConfig) {
if (applicationInfoManager == null) {
InstanceInfo instanceInfo = new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get();
applicationInfoManager = new ApplicationInfoManager(instanceConfig, instanceInfo);
}
return applicationInfoManager;
}
private static synchronized EurekaClient initializeEurekaClient(ApplicationInfoManager applicationInfoManager,
EurekaClientConfig clientConfig) {
if (eurekaClient == null) {
eurekaClient = new DiscoveryClient(applicationInfoManager, clientConfig);
}
return eurekaClient;
}
public static EurekaClient getEurekaClient()
{
ApplicationInfoManager applicationInfoManager = initializeApplicationInfoManager(new MyDataCenterInstanceConfig());
EurekaClient client = initializeEurekaClient(applicationInfoManager, new DefaultEurekaClientConfig());
return eurekaClient;
}
}
私の顧客
String vipAddress = "NLPService";
InstanceInfo nextServerInfo = null;
try {
nextServerInfo = EurekaConfiguration.getEurekaClient().getNextServerFromEureka(vipAddress, false);
} catch (Exception e) {
System.err.println("Cannot get an instance of example service to talk to from eureka");
System.exit(-1);
}
System.out.println("Found an instance of example service to talk to from eureka: "
+ nextServerInfo.getVIPAddress() + ":" + nextServerInfo.getPort());
String serviceBaseURL = "http://"+ nextServerInfo.getHostName()
+":"+nextServerInfo.getPort();
String nlpServiceURL = serviceBaseURL +"/nlp";
RestTemplate restTemplate = new RestTemplate();
NLPInputToBeTransformed input = new NLPInputToBeTransformed();
input.setInputText(" Test Input ");
NLPResponse nlpResponse = restTemplate.postForObject
(nlpServiceURL, input, NLPResponse.class, new HashMap<>());
System.out.println( " Service Response " + nlpResponse.getTags());