2018-05-27 SpringCloud注冊正確的IP - Eureka使用經(jīng)驗

在上一篇文章中提到 SpringCloud Brixton和Camden.SR7 的Inets的一點小bug
2018-05-27 開發(fā)環(huán)境下加快項目啟動速度-點評CAT使用經(jīng)驗

問題

問題并不是很嚴(yán)重,注冊中心當(dāng)然知道客戶端的IP地址 了,但是注冊的時候绪囱,一般是以IP顯示的切诀。

eureka:
  instance:
      instance-id: ${spring.cloud.client.ipAddress}:${server.port}
      lease-expiration-duration-in-seconds: 30
      lease-renewal-interval-in-seconds: 10
      appname: ${spring.application.name}
      prefer-ip-address: true

就是這個spring.cloud.client.ipAddress 變量,在SpringCloud Brixton 中房蝉,SpringCloud可能會把不是無線網(wǎng)卡瓤球,也不是本機以太網(wǎng)的網(wǎng)卡地址注冊上去。就是上一篇文章中說到的VMware的兩張網(wǎng)卡會干擾SpringCloud的判斷咱圆。這個版本的顯示的和注冊的地址可能都不是正確的地址。這容易導(dǎo)致功氨,局域網(wǎng)內(nèi)其他人調(diào)用的時候序苏,不小心調(diào)用到你的機器上了,但是這個IP不通捷凄。容易出現(xiàn)說不清楚的網(wǎng)絡(luò)超時問題忱详。注冊中心頁面顯示的IP地址也容易引起誤導(dǎo)。

解決方案

禁用虛擬機網(wǎng)卡


更有意思的方案

喜歡研究技術(shù)的同學(xué)跺涤,可以看看:

虛擬機網(wǎng)卡繼續(xù)開著匈睁,升級到SpringCloud Camden.SR7 以上

加上配置:

spring:
  cloud:
    inetutils:
      ignoredInterfaces: ['VMware.*']
      preferredNetworks: ['172.16']
      use-only-site-local-interfaces: true

這還不夠:

用下面的方式打印主機地址,觀察是否正確

@Component
@Slf4j
public class SelfCheckProgram implements CommandLineRunner {

    @Value("${spring.cloud.client.ipAddress}")
    private String ip;
    @Value("${spring.cloud.client.hostname}")
    private String hostName;

    @Override
    public void run(String... strings) throws Exception {
        log.warn("spring.cloud.client.ipAddress = {}" ,ip);
        log.warn("spring.cloud.client.hostname = {}", hostName);
    }
}

其實會發(fā)現(xiàn)打印的是正確的桶错。但是實際上還是不太對航唆。
再寫一個隨著系統(tǒng)啟動,觀察IP地址是否正確院刁。
這里觀察inetUtils的配置是否正確:

@Component
@Slf4j
public class InspectEurekaClientIp implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("inetUtilsProperties")) {
            InetUtilsProperties inetUtilsProperties = (InetUtilsProperties) bean;
            log.warn("ignored interfaces {}", inetUtilsProperties.getIgnoredInterfaces());
            log.warn("prefered network {}", inetUtilsProperties.getPreferredNetworks());
            return inetUtilsProperties;
        }

        if (beanName.equals("eurekaInstanceConfigBean")) {
            EurekaInstanceConfigBean eurekaInstanceConfigBean = (EurekaInstanceConfigBean) bean;
            log.warn("eurekaInstanceConfig Ip: {}", eurekaInstanceConfigBean.getIpAddress());
            log.warn("eurekaInstanceConfig IstanceId: {}", eurekaInstanceConfigBean.getInstanceId());
            return bean;
        }

        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

inetsUtilsProperties會打印多次:
其實第一次的配置還是不正確糯钙,沒有注入忽略的網(wǎng)卡配置,但是后面打印得卻是正確的。任岸。==

閱讀源碼其實可以發(fā)現(xiàn):

public class HostInfoEnvironmentPostProcessor
        implements EnvironmentPostProcessor, Ordered {

    // Before ConfigFileApplicationListener
    private int order = ConfigFileApplicationListener.DEFAULT_ORDER - 1;

    @Override
    public int getOrder() {
        return this.order;
    }

.......省略部分方法

    private HostInfo getFirstNonLoopbackHostInfo(ConfigurableEnvironment environment) {
        InetUtilsProperties target = new InetUtilsProperties();
        RelaxedDataBinder binder = new RelaxedDataBinder(target,
                InetUtilsProperties.PREFIX);
        binder.bind(new PropertySourcesPropertyValues(environment.getPropertySources()));
        try (InetUtils utils = new InetUtils(target)) {
            return utils.findFirstNonLoopbackHostInfo();
        }
    }
}

SpringCloud新增了binder.bind再榄,邏輯,然而不幸的是享潜,這個PropertySourcesPropertyValues 拿不到配置文件的配置困鸥。只能通過系統(tǒng)環(huán)境變量。猜測可能是啟動得比較早米碰,還沒來得及讀取application.yml生成PropertySource窝革。

最終解決方案

把上面的類升級成EnvironmnetPostProcessor

META-INF下面新增spring.factories
寫入

org.springframework.boot.env.EnvironmentPostProcessor=\
com.github.slankka.config.InspectEurekaClientIp

InspectEurekaClientIp 多實現(xiàn)一個接口:

@Component
@Slf4j
public class InspectEurekaClientIp implements BeanPostProcessor, EnvironmentPostProcessor, Ordered {

    @Override
    public int getOrder() {
//這里是依據(jù)HostInfoEnvironmentPostProcessor 的優(yōu)先級,這里讓本類優(yōu)先處理吕座。
        return ConfigFileApplicationListener.DEFAULT_ORDER - 2;
    }

    /**
     * 鑒于 HostInfoEnvironmentPostProcessor 處理inetUtilsProperties 時虐译,
     * 只從系統(tǒng)環(huán)境變量中取得空的  ignoredInterfaces.
     * 這里強制寫入,防止被傳入了錯誤的VMware的網(wǎng)卡的IP地址
     */
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        Map<String, Object>  ignoredInterfaces = Maps.newHashMap();
        ignoredInterfaces.put("spring.cloud.inetutils.ignoredInterfaces", Lists.newArrayList("VMware.*"));
        SystemEnvironmentPropertySource systemEnvironmentPropertySource = new SystemEnvironmentPropertySource("systemEnvironment", ignoredInterfaces);
        environment.getPropertySources().addLast(systemEnvironmentPropertySource);
    }
}

//其余內(nèi)容和上面的相同吴趴,此處省略

其實還有更簡單的方案

相比上面的方案而言漆诽,每一個人都需要自己配置,那就是在環(huán)境變量里面添加锣枝,想想就覺得很丑厢拭,這么長,容易忘加撇叁。但確保至少是Spring-cloud Camden.SR7版本或以上供鸠。

總結(jié)

Spring框架之所以這么受歡迎,就是因為他的容器管理陨闹,IOC楞捂,等等技術(shù),使得應(yīng)用可以方便的做任何自定義修改趋厉,而且Spring是盡量避免硬編碼的啟動某個東西寨闹,追求注解自動化。
十分優(yōu)秀君账。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末繁堡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乡数,更是在濱河造成了極大的恐慌椭蹄,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件净赴,死亡現(xiàn)場離奇詭異塑娇,居然都是意外死亡,警方通過查閱死者的電腦和手機劫侧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烧栋,你說我怎么就攤上這事写妥。” “怎么了审姓?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵珍特,是天一觀的道長。 經(jīng)常有香客問我魔吐,道長扎筒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任酬姆,我火速辦了婚禮嗜桌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辞色。我一直安慰自己骨宠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布相满。 她就那樣靜靜地躺著层亿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪立美。 梳的紋絲不亂的頭發(fā)上匿又,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音建蹄,去河邊找鬼碌更。 笑死,一個胖子當(dāng)著我的面吹牛躲撰,可吹牛的內(nèi)容都是我干的针贬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼拢蛋,長吁一口氣:“原來是場噩夢啊……” “哼桦他!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谆棱,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤快压,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后垃瞧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔫劣,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年个从,在試婚紗的時候發(fā)現(xiàn)自己被綠了脉幢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歪沃。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嫌松,靈堂內(nèi)的尸體忽然破棺而出沪曙,到底是詐尸還是另有隱情,我是刑警寧澤萎羔,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布液走,位于F島的核電站,受9級特大地震影響贾陷,放射性物質(zhì)發(fā)生泄漏缘眶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一髓废、第九天 我趴在偏房一處隱蔽的房頂上張望巷懈。 院中可真熱鬧,春花似錦瓦哎、人聲如沸砸喻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽割岛。三九已至,卻和暖如春犯助,著一層夾襖步出監(jiān)牢的瞬間癣漆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工剂买, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惠爽,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓瞬哼,卻偏偏與公主長得像婚肆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坐慰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容