これがどのように機能するかを学ぶために、Hystrix、Eureka、Ribbon などの netflix アドオンを使用して、Spring Cloud を使用して基本的なプロジェクトを作成しようとしています。私が作成しようとしているプロジェクトは、メッセージを保持する単純なメッセージ サーバーです。そして、サーバーにメッセージを要求するだけのメッセージクライアントです。これには自動検出クライアント、または RestTemplate 検出を使用したいと考えています。しかし、私はどちらも機能させることができません。
私は次の構造を持っています:
- メッセージクライアント (eureka クライアント)
- メッセージサーバー (eureka クライアント)
- 構成サービス (構成サーバー)
- 発見サービス (eureka サーバー)
私が現在行っていることは、構成サービスを起動し、次の構造で接続しているときに、これらすべての「アプリ/クライアント」に application.yml の詳細を公開することです。
- config-service\src\main\resources\config\appname.yml
- app\src\main\resources\bootstrap.yml (アプリ名とクラウド構成への URL が含まれています)
これは問題なく動作しており、私のアプリは構成サーバーから受け取ったポートで起動し、すべてが私の eureka サーバーに接続され、そこにすべてが表示されます。Hystrix フェールオーバーも機能しているだけでなく、これに関連しているわけではありませんが、完全に間違っているとは言えません。
しかし、ここで混乱が生じます... クライアントモジュール内のサービスクラス (@Service アノテーション付き) で @Autowired アノテーションを使用すると、discoveryClient オブジェクトを取得できますが、それを使用する他のサービスを見つけることができません。
メッセージ クライアント - ブート クラス:
@EnableAutoConfiguration
@EnableHystrix
@EnableEurekaClient
@ComponentScan("cloud.rest.resources, spring.cloud.client")
public class ClientBoot {
public static void main(String[] args) {
SpringApplication.run(ClientBoot.class, args);
}
}
メッセージ クライアント - REST リソース:
@RestController
public class MessageResource {
@Autowired
private MessageClient messageClient;
@RequestMapping(value = "/message/{client}", method = RequestMethod.GET)
public Message getMessage(@PathVariable String client) {
return messageClient.getMessage(client);
}
}
メッセージ クライアント - MessageClient:
@Service
public class RestMessageClient implements MessageClient {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@Override
public Message getMessage(String client) {
return restTemplate.getForObject(String.format("http://message-server/message/%s", client), Message.class);
}
}
メッセージを保持しているメッセージ サーバーのブート クラスには、クライアントのものと同じ注釈があります。
そして、私が言ったように、私のサービスクラスは何も見つけることができません..それは私のすべての質問に私を導きます:
- リボン ロード バランサーを実際に使用するには何が必要ですか?
- 「自動検出」を使用できるようにするには、リボンを使用する必要がありますか? そうではないと思っていましたが、今は混乱しています。
- 私が理解したことから、EnableEurekaClient を使用する場合、EnableDiscoveryClient も使用する必要はありませんか?
- 実行時にクライアントの config-server の yml ファイルを変更して、クライアントを再起動するだけでよいですか?
- 現在、すべてのクライアントには非常に基本的なbootstrap.ymlファイルが含まれているだけなので、構成サーバーによって実際に共有される構成の量。
- 私のymlファイルに設定されているすべてのプロパティについてもっと読むことができる場所への良いリンクを誰かが持っていますか? 存在するプロパティが実際に何をするかのドキュメントと、それらをスプリングクラウドと組み合わせて使用する方法に関するドキュメントの両方?
- アプリ/クライアントが他のアプリ/クライアントを見つけられるようにするには、特定のプロパティが必要ですか?
編集情報
迅速で優れた返信をありがとう、今日何度も何度もこれを経験し、ついにアプリケーションが機能するようになりました..検出サービスには、ポートや eureka 情報などを指定する他の各クライアントの yml ファイルが含まれています。ここで指定したものも次のとおりです。
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
そのため、この値を設定すると、サービス ディスカバリが機能しない原因となるものを上書きしているように見えます。eureka サーバーですべてのアプリケーションを確認できても、この値を設定すると、お互いを見つけることができませんでした。
この値を設定するには、構成サービスに message-server.yml ファイルを作成し、ブートストラップ後にメッセージ サーバー アプリケーションに送信します。
それでは、2 つの新しい質問があります。
- この eureka サーバー プロパティをオーバーライドするにはどうすればよいですか?
- この値を設定するとディスカバリ クライアントが動作しなくなるのはなぜですか? 実際には何をしているのですか?