8

これがどのように機能するかを学ぶために、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);
    }
}

メッセージを保持しているメッセージ サーバーのブート クラスには、クライアントのものと同じ注釈があります。

そして、私が言ったように、私のサービスクラスは何も見つけることができません..それは私のすべての質問に私を導きます:

  1. リボン ロード バランサーを実際に使用するには何が必要ですか?
  2. 「自動検出」を使用できるようにするには、リボンを使用する必要がありますか? そうではないと思っていましたが、今は混乱しています。
  3. 私が理解したことから、EnableEurekaClient を使用する場合、EnableDiscoveryClient も使用する必要はありませんか?
  4. 実行時にクライアントの config-server の yml ファイルを変更して、クライアントを再起動するだけでよいですか?
  5. 現在、すべてのクライアントには非常に基本的なbootstrap.ymlファイルが含まれているだけなので、構成サーバーによって実際に共有される構成の量。
  6. 私のymlファイルに設定されているすべてのプロパティについてもっと読むことができる場所への良いリンクを誰かが持っていますか? 存在するプロパティが実際に何をするかのドキュメントと、それらをスプリングクラウドと組み合わせて使用​​する方法に関するドキュメントの両方?
  7. アプリ/クライアントが他のアプリ/クライアントを見つけられるようにするには、特定のプロパティが必要ですか?

編集情報

迅速で優れた返信をありがとう、今日何度も何度もこれを経験し、ついにアプリケーションが機能するようになりました..検出サービスには、ポートや eureka 情報などを指定する他の各クライアントの yml ファイルが含まれています。ここで指定したものも次のとおりです。

eureka:
    client:
        serviceUrl:
            defaultZone: http://localhost:8761/eureka

そのため、この値を設定すると、サービス ディスカバリが機能しない原因となるものを上書きしているように見えます。eureka サーバーですべてのアプリケーションを確認できても、この値を設定すると、お互いを見つけることができませんでした。

この値を設定するには、構成サービスに message-server.yml ファイルを作成し、ブートストラップ後にメッセージ サーバー アプリケーションに送信します。

それでは、2 つの新しい質問があります。

  1. この eureka サーバー プロパティをオーバーライドするにはどうすればよいですか?
  2. この値を設定するとディスカバリ クライアントが動作しなくなるのはなぜですか? 実際には何をしているのですか?
4

1 に答える 1

11

リボン ロード バランサーを実際に使用するには何が必要ですか?

リボン ロードバランサーはクラスパス上にある必要があります (例: "spring-cloud-starter-ribbon" 経由)。次に、1 つを として注入するか、LoadBalancerClientまたは を注入できますRestTemplate( がある場合は、ロード バランサが認識されますLoadBalancerClient)。

「自動検出」を使用できるようにするには、リボンを使用する必要がありますか? そうではないと思っていましたが、今は混乱しています。

「自動検出」とは何ですか? を使用するためにリボンを使用する必要はありませんDiscoveryClient(リボンはロード バランサーであり、サービス レジストリではありません)。

私が理解したことから、EnableEurekaClient を使用する場合、EnableDiscoveryClient も使用する必要はありませんか?

正しい。@EnableEurekaClientに注釈が付けられて@EnableDiscoveryClientいるため、好みを表現するためだけに存在します。

実行時にクライアントの config-server の yml ファイルを変更して、クライアントを再起動するだけでよいですか?

はい。または、/refresh または /restart エンドポイントを使用することもできます (本番環境では、少なくとも定期的に完全な再起動がおそらく最適です)。

現在、すべてのクライアントには非常に基本的なbootstrap.ymlファイルが含まれているだけなので、構成サーバーによって実際に共有される構成の量。

あなたが好きなだけ。ひもの長さはどれくらいですか? 私があなただったら、中央の設定を最小限に抑えようとします (環境間または実行時に変更されるもののみ)。

私のymlファイルに設定されているすべてのプロパティについてもっと読むことができる場所への良いリンクを誰かが持っていますか? 存在するプロパティが実際に何をするかのドキュメントと、それらをスプリングクラウドと組み合わせて使用​​する方法に関するドキュメントの両方?

Spring Boot と Spring Cloud には、外部化されたプロパティのメタデータが自動生成されています。新世代の IDE はそれらを理解し (したがって、STS 3.6.4 または IDEA 14.1 を入手してください)、 http://docs.spring.io/spring-boot/docsの下のユーザーガイド (少なくとも Spring Boot の場合) にリストされています。/current/reference/htmlsingle/#common-application-properties

アプリ/クライアントが他のアプリ/クライアントを見つけられるようにするには、特定のプロパティが必要ですか?

サービス レジストリ (この場合は Eureka) を見つけることができる必要があります。Eureka を使用していて、クライアントが登録している場合は、それで十分です。

于 2015-03-11T16:55:32.877 に答える