日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringCloud组件 源码剖析:Eureka服务注册方式流程全面分析

發布時間:2025/5/22 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringCloud组件 源码剖析:Eureka服务注册方式流程全面分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在SpringCloud組件:Eureka服務注冊是采用主機名還是IP地址?文章中我們講到了服務注冊的幾種注冊方式,那么這幾種注冊方式的源碼是怎么實現的呢?我們帶著這一個疑問來閱讀本章內容能夠讓你更深入了解這塊的知識點!!!

本章目標

分析每一種服務注冊方式源碼執行流程。

構建項目

本章以分析源碼為主,所以不去新創建項目來講解相關內容,我們使用SpringCloud組件:Eureka服務注冊是采用主機名還是IP地址?源碼作為注冊服務,SpringCloud組件:搭建Eureka服務注冊中心源碼作為服務注冊中心,還是按照之前的運行流程:

  • 啟動服務注冊中心
  • 啟動本章服務項目
  • 查看服務列表,服務注冊方式
  • 配置信息獲取執行流程

    在開始講解本章注冊方式之前,我們需要了解整體的配置信息獲取的流程信息,這樣才可以分析指定的注冊方式執行流程。

    第一步:實例化EurekaInstanceConfigBean配置實體

    在項目啟動時由于依賴spring-cloud-starter-netflix-eureka-client內通過配置spring.factories文件來讓項目啟動時自動加載并實例化org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration配置類,EurekaClientAutoConfiguration內會自動實例化EurekaInstanceConfigBean并且自動綁定eureka.instance開頭的配置信息(具體為什么會自動映射可以去了解下@ConfigurationProperties注解作用),部分源碼如下所示:

    ...... public class EurekaClientAutoConfiguration {//省略部分源碼@Bean@ConditionalOnMissingBean(value = EurekaInstanceConfig.class, search = SearchStrategy.CURRENT)public EurekaInstanceConfigBean eurekaInstanceConfigBean(InetUtils inetUtils, ManagementMetadataProvider managementMetadataProvider) {//省略部分源碼// 傳遞EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(inetUtils);// 省略部分源碼}//省略部分源碼 } 復制代碼

    EurekaClientAutoConfiguration#eurekaInstanceConfigBean方法只有滿足@ConditionalOnMissingBean(value = EurekaInstanceConfig.class, search = SearchStrategy.CURRENT)表達式后才會去實例化,并且把實例化對象放入到IOC容器內容,BeanId為eurekaInstanceConfigBean,也就是方法的名稱。 在EurekaClientAutoConfiguration#eurekaInstanceConfigBean方法中有這么一行代碼我們可以進行下一步的分析

    // 通過有參構造函數實例化EurekaInstanceConfigBean配置實體 EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(inetUtils); 復制代碼

    通過調用EurekaInstanceConfigBean(InetUtils inetUtils)構造函數來進行實例化EurekaInstanceConfigBean對象,在這個構造函數內也有一些實例化的工作,源碼如下:

    public EurekaInstanceConfigBean(InetUtils inetUtils) {this.inetUtils = inetUtils;this.hostInfo = this.inetUtils.findFirstNonLoopbackHostInfo();this.ipAddress = this.hostInfo.getIpAddress();this.hostname = this.hostInfo.getHostname(); } 復制代碼
    第二步:InetUtils#findFirstNonLoopbackHostInfo獲取主機基本信息

    在構造函數EurekaInstanceConfigBean(InetUtils inetUtils)源碼實現內hostInfo主機信息通過了InetUtils#findFirstNonLoopbackHostInfo方法來進行實例化,我們來看看這個方法的具體實現邏輯,它會自動讀取系統網卡列表然再進行循環遍歷查詢正在UP狀態的網卡信息,如果沒有查詢到網卡信息,則使用默認的HostName、IpAddress配置信息,源碼如下所示:

    public HostInfo findFirstNonLoopbackHostInfo() {InetAddress address = findFirstNonLoopbackAddress();if (address != null) {return convertAddress(address);}HostInfo hostInfo = new HostInfo();hostInfo.setHostname(this.properties.getDefaultHostname());hostInfo.setIpAddress(this.properties.getDefaultIpAddress());return hostInfo; }public InetAddress findFirstNonLoopbackAddress() {InetAddress result = null;try {int lowest = Integer.MAX_VALUE;for (Enumeration<NetworkInterface> nics = NetworkInterface.getNetworkInterfaces(); nics.hasMoreElements();) {NetworkInterface ifc = nics.nextElement();if (ifc.isUp()) {log.trace("Testing interface: " + ifc.getDisplayName());if (ifc.getIndex() < lowest || result == null) {lowest = ifc.getIndex();}else if (result != null) {continue;}// @formatter:offif (!ignoreInterface(ifc.getDisplayName())) {for (Enumeration<InetAddress> addrs = ifc.getInetAddresses(); addrs.hasMoreElements();) {InetAddress address = addrs.nextElement();if (address instanceof Inet4Address&& !address.isLoopbackAddress()&& isPreferredAddress(address)) {log.trace("Found non-loopback interface: "+ ifc.getDisplayName());result = address;}}}// @formatter:on}}}catch (IOException ex) {log.error("Cannot get first non-loopback address", ex);}if (result != null) {return result;}try {return InetAddress.getLocalHost();}catch (UnknownHostException e) {log.warn("Unable to retrieve localhost");}return null; } 復制代碼

    默認的HostName、IpAddress屬性配置信息在InetUtilsProperties配置實體類內,如果不進行設置則直接使用默認值,如果你想更換默認值,那么你可以在application.yml配置文件內通過設置spring.cloud.inetutils.defaultHostname、spring.cloud.inetutils.defaultIpAddress進行修改默認值,源碼如下所示:

    public class InetUtilsProperties {public static final String PREFIX = "spring.cloud.inetutils";/*** The default hostname. Used in case of errors.*/private String defaultHostname = "localhost";/*** The default ipaddress. Used in case of errors.*/private String defaultIpAddress = "127.0.0.1"; } 復制代碼
    第三步:EurekaInstanceConfigBean#getHostName方法實現

    getHostName是一個Override的方法,繼承于com.netflix.appinfo.EurekaInstanceConfig接口,該方法有個boolean類型的參數refresh來判斷是否需要刷新重新獲取主機網絡基本信息,當傳遞refresh=false并且在application.yml配置文件內并沒有進行手動設置eureka.instance.hostname以及eureka.instance.ip-address參數則會根據eureka.instance.prefer-ip-address設置的值進行返回信息,源碼如下所示:

    @Override public String getHostName(boolean refresh) {if (refresh && !this.hostInfo.override) {this.ipAddress = this.hostInfo.getIpAddress();this.hostname = this.hostInfo.getHostname();}return this.preferIpAddress ? this.ipAddress : this.hostname; } 復制代碼

    默認注冊方式源碼分析

    由于在實例化EurekaInstanceConfigBean配置實體類時,構造函數進行了獲取第一個非回環主機信息,默認的hostName以及ipAddress參數則是會直接使用InetUtils#findFirstNonLoopbackHostInfo方法返回的相對應的值。

    IP優先注冊方式源碼分析

    EurekaInstanceConfigBean#getHostName方法直接調用本類重載方法getHostName(boolean refresh)并且傳遞參數為false,根據第三步源碼我們就可以看到:

    return this.preferIpAddress ? this.ipAddress : this.hostname; 復制代碼

    如果eureka.instance.prefer-ip-address參數設置了true就會返回eureka.instance.ip-address的值,這樣我們就可以從中明白為什么主動設置eureka.instance.ip-address參數后需要同時設置eureka.instance.prefer-ip-address參數才可以生效。

    指定IP、HostName源碼分析

    我們通過application.yml配置文件進行設置eureka.instance.hostname以及eureka.instance.ip-address后會直接替換原默認值,在EurekaInstanceConfigBean#getHostName中也是返回的this.hostname、this.ipAddress所以在這里設置后會直接生效作為返回的配置值。

    總結

    我們通過源碼進行分析服務注冊方式執行流程,這樣在以后進行配置eureka.instance.hostname、eureka.instance.prefer.ip-address、eureka.instance.ip-address三個配置信息時就可以根據優先級順序達到預期的效果,避免沒有必要的錯誤出現。

    源碼位置

    • SpringBoot配套源碼地址:訪問碼云查看源碼、訪問GitHub查看源碼
    • SpringCloud配套源碼地址(本章源碼在這):訪問碼云查看源碼

    有問題要問?

    如果你有技術相關的問題想要咨詢恒宇少年,請去博客首頁左側導航欄,點擊知識星球微信掃碼加入我的星球。

    與恒宇少年面對面

    如果你喜歡恒宇少年的相關文章,那么就去微信公眾號(恒宇少年)關注我吧!!! 當然你也可以去 SpringCloud碼云源碼 項目底部掃描微信公眾號二維碼關注我,感謝閱讀!!!

    學習目錄推薦

    • SpringCloud相關系列文章訪問:www.jianshu.com/p/64e4aaada…
    • SpringBoot相關系列文章請訪問:www.jianshu.com/p/9a08417e4…
    • QueryDSL相關系列文章請訪問:www.jianshu.com/p/99a5ec5c3…
    • SpringDataJPA相關系列文章請訪問:www.jianshu.com/p/615ed9c1f…

    開源信息

    這段時間一直在編寫開源的相關框架,致力于公司使用的框架升級以及開源計劃,將公司使用到的工具以及插件進行升級重構并且開源。

    • 代碼生成器(Code-Builder) code-builder代碼生成器根據你提供的模板文件(目前支持freemarker)自動生成實體類,可以很大很有效的提高開發效率。 Gitee地址:gitee.com/hengboy/cod… Github地址:github.com/hengyuboy/c…
    • 持久化框架(MyBatis-Enhance) mybatis-enhance是一個對mybatis框架的增強封裝,提供一系列的內部方法來完成單表數據的操作,多表數據提供DSL方式進行操作。 Gitee地址:gitee.com/hengboy/myb… Github地址:github.com/hengyuboy/m…
    • 自動分頁插件 MyBatis-Pageable是一款自動化分頁的插件,基于MyBatis內部的插件Interceptor攔截器編寫完成,攔截Executor.query的兩個重載方法計算出分頁的信息以及根據配置的數據庫Dialect自動執行不同的查詢語句完成總數量的統計。 Gitee地址:gitee.com/hengboy/myb…

    總結

    以上是生活随笔為你收集整理的SpringCloud组件 源码剖析:Eureka服务注册方式流程全面分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产精品探花一区二区在线观看 | 国产一区亚洲二区 | 成人av激情 | 国产一区二区a | av天天射 | 99久久久成人国产精品 | www.99re. | 一区二区三区高清在线 | 午夜一区二区三区四区 | 综合五月| 久久久男女 | 天堂成人在线观看 | 欧美日韩欧美日韩在线观看视频 | 成人黄色小说视频 | av在线短片 | 99re这里只有精品在线观看 | 高清av网站 | 亚洲av无码乱码在线观看性色 | 茄子视频色 | 成人久久久久久 | 日韩视频在线观看视频 | 精品久久久久一区 | 国产精品福利在线观看 | 国产区精品在线 | www色婷婷| 亚洲av综合色区无码一区 | 仙踪林av | 国产精品久久麻豆 | 草久视频在线观看 | 天天爱天天做天天爽 | 热久久久久久久 | 日韩精品免费电影 | 欧美精品久久99 | 亚洲不卡在线 | 在线观看视频中文字幕 | yy6080午夜| 亚洲经典视频在线观看 | 久久久久久久久97 | 亚洲视频观看 | 亚洲国产精品99久久久久久久久 | 魔女鞋交玉足榨精调教 | 亚洲国产日本 | 91网在线| 欧美日韩亚洲不卡 | 精品国产a线一区二区三区东京热 | а√天堂中文在线资源8 | 午夜视频在线观看网站 | 四虎在线视频 | 国产主播一区 | 亚洲成人av电影 | 国产一级二级三级在线 | 免费视频www在线观看网站 | 日韩丰满少妇无码内射 | 国产精品一区二区免费 | 久色伊人| 超碰女| 色在线免费视频 | 日本一级吃奶淫片免费 | 亚洲男女在线 | 成人av自拍 | 日韩美女一级片 | 五月依人网 | 日美韩一区二区三区 | 亚洲一区二区三区无码久久 | 成人做爰9片免费视频 | 日本青草视频 | 亚洲午夜久久久久久久久 | 多毛的亚洲人毛茸茸 | 亚洲欧美另类在线 | 操屁股视频 | www.黄色网址.com | 国产亚洲精品自拍 | 在哪里可以看毛片 | 欧洲精品一区二区三区 | 男男成人高潮片免费网站 | 天天干天天操天天插 | 伊人精品久久 | 日韩av三级在线 | 亚洲精品黄色 | 女人被狂躁c到高潮喷水电影 | 毛片在线免费播放 | 日韩欧美在线精品 | www国产在线观看 | 伊人久久大香线蕉av色婷婷色 | 国产a级淫片 | 久久精品不卡 | 欧美精品久久久久 | 中文人妻熟妇乱又伦精品 | 国产1区2区在线观看 | 午夜色影院 | 姐姐的朋友2在线 | 日韩欧美不卡 | 日韩在线三区 | 国产精品欧美激情 | 一区二区三区麻豆 | 91久久精品无码一区二区 | 香蕉影院在线 | 国产123区在线观看 91国产一区二区 | 无码人妻av一区二区三区波多野 |