スプリング雲EurekaClient複数のネットワークアダプタのIP構成とソースコード解析(RPM)

https://blog.csdn.net/qq_30062125/article/details/83856655

 

 

1はじめに
春の雲に、各サービスインスタンスは、ユーレカレジストリに登録する必要があります。
登録された通常のIP、すなわちeureka.instance.prefer-IPアドレス=真。
しかし、複数のネットワークカードがあるサービスインスタンス環境ならば、多くの場合、登録されたIPのIP過去には、我々が表示されます望むものではありません。

2、解決を支援するための設定手順
上記のためのケースでは、我々は一般的に解決するには、いくつかのアイデアを持っています。

2.1、方法:直接設定eureka.instance.ipアドレス
など:eureka.instance.ipアドレス= 192.168.1.7
直接単一のシーン環境、複雑なシーンに有利なサポートの欠如に一般的に適用、完全なIPを設定します。

具体的な実装はorg.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration#eurekaInstanceConfigBean参照することができ
、そしてorg.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean#GETHOSTNAMEを
ここでは説明しません。明確な場合は、ソース論理分析は、同様のアイデアを見て、当時の背中を見て、とあります。

2.2方法II:増加のinetutils構成
含む構成org.springframework.cloud.commons.util.InetUtilsPropertiesに対応します。

構成手順
spring.cloud.inetutils.defaultホスト名のデフォルトのホスト名は、エラー解決するためにのみ使用されます
spring.cloud.inetutils.default-IPアドレス、デフォルトのIPアドレスは、エラー解決するためにのみ使用されます
spring.cloud.inetutilsを。分割し、複数のネットワークカードのアドレスを無視するように構成された無視・インターフェース、
IP IPアドレスまたはプレフィックスspring.cloud.inetutils.preferred、ネットワーク分割の複数の、規則的に一致し、交差関係は
spring.cloud.inetutils.timeout- IPホスト・コンピューティング・秒タイムアウト情報、第二既定
spring.cloud.inetutils.use専用サイトローカルからインターフェイスのみネットワークIP内
例示:
192.168で始まるIPのみを使用して、複数のアイテムは、ノートあります交差点関係のニーズが満たされています。
^ = 192-Networksは\ 0.168 \をspring.cloud.inetutils.preferred。[\ D] + \。[\ D] + $
。1
環境のドッキングウィンドウの群れのこの種では、ホスト名マッピングIPで/ etc / hostsファイルを使用して比較的使いやすいインチ
#ただ存在しませんでしたIPを設定し、のInetAddress.getLocalHost()ロジックを来ります。
ネットワーク=なし-spring.cloud.inetutils.preferred
。1
2
負NIC EN0及びEN1
正規表現構成#無視-インターフェイス
spring.cloud.inetutils.ignored- = EN0インターフェース、EN1
。1
2
のみネットワークアドレス
RFCフォローする#1918
#10/8プレフィックス
#172.16 / 12プレフィックス
#192.168 / 16プレフィックス
スプリングサイト- trueにのみ-.cloud.inetutils.useローカルインタフェース=
1。
2
3。
4。
5。
これらのタイプを使用することが一般的に十分。

図3は、ソースコード解析
この設定を有効にする理由主下で分析します。私たちは、自動的に設定を開始することは非常に最初から軽蔑するだろう。一部をオフにして、IPを表示するには、指定したディレクトリに直接ジャンプすることができます。

ここで使用されるバージョンは、スプリング・ブート1.5.13.RELEASE、春の雲Dalston.SR5、異なるバージョンで、いくつかの違いがあるでしょう。

3.1サーバー登録の手順
ユーレカサーバAPIの一般的な説明を参照します。https://blog.csdn.net/qq_30062125/article/details/83829357

入口から@EnableEurekaServerサーバコード、APIジャージーサブ,,前記リソース・ローダを使用して実装。特定の参照があってもよい:HTTPS://blog.csdn.net/qq_30062125/article/details/83758334

私たちの主な関心事ときなど、登録アプリケーションの例のホスト名の移転、:で、<hostname> 192.168.1.7 </ホスト名>

3.2クライアントは、登録手順の開始
春ブーツユーレカクライアントクライアントロジックを参照することができますhttps://blog.csdn.net/qq_30062125/article/details/83833006

ここで私たちの懸念はorg.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration#eurekaInstanceConfigBeanあり、これは、情報サービスインスタンスです。

@Bean
@ConditionalOnMissingBean(値= EurekaInstanceConfig.class、探索= SearchStrategy.CURRENT)
公衆EurekaInstanceConfigBean eurekaInstanceConfigBean(のinetutilsのinetutils){
RelaxedPropertyResolver relaxedPropertyResolver =新しいRelaxedPropertyResolver(ENV、 "eureka.instance。");
文字列のホスト名= relaxedPropertyResolver.getProperty( "ホスト名");
ブールpreferIpAddress = Boolean.parseBoolean(relaxedPropertyResolver.getProperty( "preferIpAddress"));
// IP解析主要在这一步
EurekaInstanceConfigBeanインスタンス=新しいEurekaInstanceConfigBean(のinetutils)。
instance.setNonSecurePort(this.nonSecurePort)。
instance.setInstanceId(getDefaultInstanceId(this.env))。
instance.setPreferIpAddress(preferIpAddress)。

IF(this.managementPort = this.nonSecurePort && this.managementPort = 0!){
IF(StringUtils.hasText(ホスト名)){
instance.setHostname(ホスト名)。
}
文字列statusPageUrlPath = relaxedPropertyResolver.getProperty( "statusPageUrlPath")。
ストリングhealthCheckUrlPath = relaxedPropertyResolver.getProperty( "healthCheckUrlPath")。
IF(StringUtils.hasText(statusPageUrlPath)){
instance.setStatusPageUrlPath(statusPageUrlPath)。
}
IF(StringUtils.hasText(healthCheckUrlPath)){
instance.setHealthCheckUrlPath(healthCheckUrlPath)。
}
文字列スキーム= instance.getSecurePortEnabled()?"HTTPS": "HTTP"。
instance.setStatusPageUrl(スキーム+ "://" +インスタンス。
+ this.managementPort + instance.getStatusPageUrlPath())。
instance.setHealthCheckUrl(スキーム+ "://" + instance.getHostname()+ ":"
+ this.managementPort + instance.getHealthCheckUrlPath());
}
インスタンスを返します。
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
上記カテゴリEurekaInstanceConfigBeanは@ConfigurationProperties(「eureka.instance」)を配置しているので、豆生成プロセスように、論理ConfigurationPropertiesBindingPostProcessorは、コンフィギュレーション・パラメータ・ファイルを注入します。

BeanがApplicationInfoManagerに格納され、InstanceInfoに加工され、ApplicationInfoManagerはCloudEurekaClientに注入されます。最後に、com.netflix.discovery.DiscoveryClient#DiscoveryClient割り当てロジック、その後の処理のためのロジック。\

org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration.EurekaClientConfiguration#eurekaApplicationInfoManager源码:

@Bean
@ConditionalOnMissingBean(値= ApplicationInfoManager.class、探索= SearchStrategy.CURRENT)
公衆ApplicationInfoManager eurekaApplicationInfoManager(
EurekaInstanceConfigの設定){
//先加工成InstanceInfo
InstanceInfo instanceInfo =新しいInstanceInfoFactory()を作成(設定)。
新しいApplicationInfoManager(設定、instanceInfo)を返します。
}
1
2
3
4
5
6
7
8
DiscoveryClient部分源码如下。

@Inject
DiscoveryClient(ApplicationInfoManager applicationInfoManager、EurekaClientConfig設定、AbstractDiscoveryClientOptionalArgs引数、
プロバイダ<BackupRegistry> backupRegistryProvider){
...

this.applicationInfoManager = applicationInfoManager。
//前面放入的InstanceInfo
InstanceInfo MyInfoの= applicationInfoManager.getInfo()。

コンフィグ= ClientConfig;
= ClientConfig staticClientConfig;
=()TransportConfig config.getTransportConfig;
instanceInfoに割り当て//パラメータ、使用のためのロジックを登録
instanceInfo = MyInfoの;
...
}
1
2
3。
4。
5。
6。
7。
8。
9。
10
11
12であります
13は、
14
15
16
登録ロジック

/ **
*適切なREST呼び出しを行うことにより、ユーレカサービスに登録。
* /
ブールレジスタ()のThrowable {スロー
logger.info(PREFIX + appPathIdentifier + ":登録サービスを...");
EurekaHttpResponse <ボイド>をhttpResponse。
試す{
// instanceInfo就是上面赋值的实例信息
をhttpResponse = eurekaTransport.registrationClient.register(instanceInfo)。
}キャッチ(例外e){
logger.warn( "{} -登録が} {失敗"、PREFIX + appPathIdentifier、e.getMessage()、E)。
Eを投げます。
}
IF(logger.isInfoEnabled()){
logger.info( "{} -登録ステータス:{}"、PREFIX + appPathIdentifier、httpResponse.getStatusCode())。
}
をhttpResponseを返します。
}
。1
2
3
4
5
6
7
8
9
10
11
12である
13である
14
15
16
17
18で
説明した構成を解析3.3 IPは
、それに登録された情報の上記適用例から分かるEurekaInstanceConfigBeanユーレカプロセスによるものです。新しいEurekaInstanceConfigBean(のinetutils)を中心に解決されたIP:

EurekaInstanceConfigBeanコンストラクタ

EurekaInstanceConfigBeanパブリック(のinetutils用のinetutils){
this.inetUtils =のinetutils;
分析IP含ま//ホスト情報を取得し、
; this.hostInfo this.inetUtils.findFirstNonLoopbackHostInfo =()
のHostInfo内の場所から取得される// IPアドレス。
= this.hostInfo.getIpAddress this.ipAddress();
this.hostname this.hostInfo.getHostname =();
}
。1
2
3。
4。
5。
6。
7。
8。
@Override
パブリック文字列のgethostname(ブールリフレッシュ){
(このリフレッシュ&& IF! hostInfo.override){
this.ipAddress this.hostInfo.getIpAddress =();
this.hostname this.hostInfo.getHostname =は();
}
構成preferIpAddress、IPアドレスを使用する場合、ホストを取得//。
?this.preferIpAddress this.ipAddressを返す:this.hostname;
}
1
2
3。
4。
5。
6。
7。
8。
9。
最後にorg.springframework.cloud.commons.util.InetUtils#findFirstNonLoopbackAddressによって達成

公共のInetAddress findFirstNonLoopbackAddress(){
InetAddressの結果= NULL;
試す{
int型、最低= Integer.MAX_VALUEで、
(列挙<のNetworkInterface>のNIC =のNetworkInterfaceため
.getNetworkInterfaces(); nics.hasMoreElements()){
のNetworkInterface IFC = nics.nextElement()。
IF(ifc.isUp()){
log.trace( "テストインターフェース:" + ifc.getDisplayName())。
IF(ifc.getIndex()<最低||結果== NULL){
最小= ifc.getIndex()。
}
(!結果= NULL)であれば他{
続けます。
}

// @formatter:オフ
//网卡忽略逻辑
(ignoreInterface(ifc.getDisplayName())!){もし
ため(列挙<InetAddressの>アドレスが使わ= IFC
.getInetAddresses(); addrs.hasMoreElements()){
InetAddressのアドレス=アドレスが使われます.nextElement()。
// IP忽略逻辑
場合(アドレスのInet4Addressのinstanceof
&& address.isLoopbackAddress()!
&& ignoreAddress(アドレス)!){
log.trace( "見つかり非ループバックインターフェイス:"
+ ifc.getDisplayName());
結果=アドレス。
}
}
}
// @formatter:上
}
}
}
{キャッチ(のIOException EX)
例、 "最初の非ループバックアドレスを取得できません")log.error。
}

(もし!結果= NULL){
戻り値の結果;
}

{試し
ルールが直接論理アクセス情報を使用した場合よりも、一致する// IP。
InetAddress.getLocalHostリターン();
}
キャッチ(UnknownHostExceptionがE){
log.warn( "ローカルホストを取得することができません");
}

ヌルを返します。
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
3.3.1無視カード
InetUtilsPropertiesと一致していません#のignoredInterfacesが設定された正規表現のNICは無視します

/ * **テスト/ブールignoreInterface(文字列インタフェース名){用の
ための(文字列REGEX:this.properties.getIgnoredInterfaces()){
IF(interfaceName.matches(REGEX)){
log.trace( "無視インターフェース:" +インタフェース名) ;
; trueに戻す
}
}
;偽に戻り
}
1
2
3。
4。
5。
6。
7。
8。
9。
無視3.3.2 IP
IPネットワーク場合なければならない、org.springframework.cloud.commons.util.InetUtilsProperties#1 useOnlySiteLocalInterfaces制御による。
あなたが最初に正規表現のorg.springframework.cloud.commons.util.InetUtilsProperties#のpreferredNetworks構成、または完全一致の数と一致する必要があり、一致IPルール、交差点では、それは無視され、満たされていません。

/ **テスト用* /ブールignoreAddress(InetAddressのアドレス){

//ネットワークがIPでなければならないかどうかを
IF(this.properties.isUseOnlySiteLocalInterfaces()&& address.isSiteLocalAddress()!){
:Log.trace( "無視アドレス" + address.getHostAddress());
; trueに戻る
}

//一致IP、ルールに一致しない、不一致
のために:(文字列の正規表現this.properties.getPreferredNetworks()){
IF(address.getHostAddress()マッチ(正規表現)&& address.getHostAddress()のstartsWith(正規表現)!!。) {
log.trace( "無視アドレス:" + address.getHostAddress());
真に戻る;
}
}
偽に戻り;
}
。1
2
3
4
5
6
7
8
9
10
11
12は、
13である
14
15
16
17
ネットワークのIPルールチェック

パブリックブールisSiteLocalAddress(){
// RFC 1918を参照
// 10/8プレフィックス
// 172.16 / 12プレフィックス
// 192.168 / 16プレフィックス
INTアドレス=ホルダー()のgetAddress()。
リターン(((アドレス>>> 24)&0xFFで)== 10)
|| ((((アドレス>>> 24)との0xFF)== 172)
&&(((アドレス>>> 16)&0xF0が)== 16))
|| ((((アドレス>>> 24)との0xFF)== 192)
&&(((アドレス>>> 16)との0xFF)== 168))。
}
1
2
3
4
5
6
7
8
9
10
11
12
3.3.3のInetAddress.getLocalHost逻辑
当て配置spring.cloud.inetutils我们。好適-ネットワーク=どれも、カードによると一致するIPでない場合、それはのInetAddress.getLocalHost(ロジック)に行きます。
次の論理的手順:

ローカルホスト名の検索
ホスト名がIPv4 127.0.0.1 localhostのあるダイレクトリターンアドレスの場合、IPv6は1である::
いない場合は、ローカルドメイン名解決を取る必要があります。DNSの優先順位は、ローカルのhostsファイルの設定のIPアドレスを取得します。ホストのホスト名として設定する場合は、IPアドレスの設定を読み込みます。
地元が見つからない場合は、ドメイン名解決を飲み続けます。
ここでは、どのように我々は基本的に明確な、IPスプリングクラウドユーレカクライアントマネージャを設定します。まあ、それはオーバーです。
----------------
免責事項:この記事は、元の記事の「これが怠け者である」CSDNブロガーで、CC 4.0 BY-SAの著作権契約、複製、オリジナルのソースを添付してくださいに従ってくださいリンクとこの文。
オリジナルリンクします。https://blog.csdn.net/qq_30062125/article/details/83856655

おすすめ

転載: www.cnblogs.com/xiaohanlin/p/11593667.html