使用領事は、サービス・ディスカバリを実現:instance-idにカスタム(3通り)

TIPS

春の雲ホクストン、春の雲のすべてのバージョンのための理論的なサポートに基づきます。

サービス登録ののInstanceId領事にマイクロをカスタマイズする方法この記事では説明します。

領事は、一意の識別子としてINSTANCEID、そして春クラウド領事のデフォルトのInstanceId市${spring.application.name}-${server.port}

質問へのこのリードは次のとおりです。マイクロサービスに複数のインスタンスがある場合でも、限り同一のポートとして、領事まだ一つだけのセーブデータ!この問題を解決するには、ちょうど別のインスタンスは、あなたが別のInstanceIdを持つことができましょう。

実施例1:ランダムな値スプライシング

設定を追加します。

spring:
  cloud:
    consul:
      discovery:
        instance-id: ${spring.application.name}-${server.port}-${random.long}复制代码

現時点では、市場での記事の数が楽しいようです。しかし、そうするために、いくつかのシナリオではまだ少し問題を抱えています。

例えば:、マイクロサービスインスタンスがクラッシュしたとし、時間の非常に短い期間で(領事は、このインスタンスを削除するには時間がなかった)、アプリケーションを再起動し、それは二つのデータにつながることは総領事に表示されますが、実際に表しています一例(オーバー時間後、領事は役に立たない例を削除するが、しかし、2つのデータ時間の期間にわたって起こる非常に奇妙です)。

TIPS

${random.long} 春ブーツが内蔵されている「拡張設定」、使用姿勢がたくさんあります。マニュアルを参照してください

オプション2:縫い合わせるマシン固有の識別子

このことについて話して、スマートな学生は、合理的なインスタンスID 2には、次の要件を満たすべきだと思います。

  • 異なるインスタンスID異なるインスタンス。
  • 例としては、同じ開始時間は、インスタンスIDは同じでなければなりません。

これら2つの要求を実現するためには、単にインスタンスIDにマシンを追加すると、一意なIPまたはホスト名として、OKを識別し、というように。

spring:
  cloud:
    consul:
      discovery:
        instance-id: ${spring.application.name}-${server.port}-${spring.cloud.client.hostname}复制代码

または:

spring:
  cloud:
    consul:
      discovery:
        instance-id: ${spring.application.name}-${server.port}-${spring.cloud.client.ip-address}复制代码

TIPS

ここでは、${spring.cloud.client.hostname}同様に${spring.cloud.client.ip-address}、環境変数の特性を読み取ることができる春のブート・コンフィギュレーション・ファイルを使用することです。

長いアプリケーションの統合などとしてSpring Boot Actuator、次のことができ/actuator/env、すべての環境変数それを見ます!環境変数のキー値は、設定ファイルに書き込むことができます。

【実施例3:コード延長

上記の2つの方法がまだあなたのニーズを満たすことができない場合は、コードを書くの方法によって拡大して行くことができます。

コード:

public class WiiConsulAutoRegistration extends ConsulAutoRegistration {
    public WiiConsulAutoRegistration(NewService service, AutoServiceRegistrationProperties autoServiceRegistrationProperties, ConsulDiscoveryProperties properties, ApplicationContext context, HeartbeatProperties heartbeatProperties, List<ConsulManagementRegistrationCustomizer> managementRegistrationCustomizers) {
        super(service, autoServiceRegistrationProperties, properties, context, heartbeatProperties, managementRegistrationCustomizers);
    }
    
    public static String getInstanceId(WiiProperties wiiProperties,
                                       Environment environment) {
        return String.format("%s-%s-%s",
                environment.getProperty("spring.application.name"),
                wiiProperties.getIp(),
                wiiProperties.getPort());
    }
}复制代码

構成:

@Configuration
public class XXXConfiguration {
    @Bean
    public ConsulAutoRegistration consulRegistration(
            AutoServiceRegistrationProperties autoServiceRegistrationProperties,
            ConsulDiscoveryProperties properties,
            ApplicationContext applicationContext,
            ObjectProvider<List<ConsulRegistrationCustomizer>> registrationCustomizers,
            ObjectProvider<List<ConsulManagementRegistrationCustomizer>> managementRegistrationCustomizers,
            HeartbeatProperties heartbeatProperties) {
        return WiiConsulAutoRegistration.registration(autoServiceRegistrationProperties,
                properties, applicationContext, registrationCustomizers.getIfAvailable(),
                managementRegistrationCustomizers.getIfAvailable(), heartbeatProperties);
    }
}复制代码

TIPS

このアプローチは、あなたがプレイする方法を再生する方法のように、より柔軟です。あなたは、MACアドレスまたは他のどのようなものを継ぐことができます......しかし、ただ唯一のユニークな識別子をカスタマイズするために、そうのInstanceIdでプレイすることは少し高い費用がかかり、私がお勧め:最後の支障がない場合、それは投げていないことを望みました *。

*私の個人的なプロジェクト(今春クラウドアリババサイドカーである) `春クラウドWii`は、カスタムの、このようにのInstanceIdに使用されています。Wiiの自体はWiiConsulAutoRegistration`は、カスタムルックのInstanceIdはそれを掘り下げる `拡大していきますので、しかし、Wiiのは、このような方法で採用されています。ここでは、関連するコード、興味の缶を見ている: `https://github.com/eacdy/spring-cloud-wii/blob/master/spring-cloud-wii/src/main/java/com/itmuch/wii/領事/ WiiConsulAutoRegistration.java`

今後の...

これはプル要求合併の未来である場合には、......参照を投げるません。https://github.com/spring-cloud/spring-cloud-consul/pull/570

この記事は最初に

instance-idにカスタム:使用領事は、サービス検出を実現します

おすすめ

転載: juejin.im/post/5dfb37766fb9a0162d60b002