1. 程式人生 > >Spring Cloud開發人員如何解決服務衝突和例項亂竄?(IP實現方案)

Spring Cloud開發人員如何解決服務衝突和例項亂竄?(IP實現方案)

一、背景

在我上一篇文章《Spring Cloud開發人員如何解決服務衝突和例項亂竄?》中提到使用服務的元資料來實現隔離和路由,有朋友問到能不能直接通過IP來實現?本文就和大家一起來討論一下這個問題

 

二、可行性分析

要實現通過IP來隔離和路由的話有一個非常關鍵的點需要解決,就是怎樣實現IP可辨識,意思就是如何區分那個IP是伺服器上的,那個IP是開發人員本機的

如上圖所示其實我們還是能找到規律可以辨識的,所以這個是可以行的!

  • 開發人員本機IP - 其實就是客戶端IP,也就是原始請求方的IP:172.16.20.2
  • 伺服器IP - 可以理解為伺服器上的服務所在機器的IP(有點繞):172.16.20.1

 

三、路由規則邏輯

主要實現以下目標:

  1. 普通使用者訪問伺服器上的頁面時,請求的所有路由只調用伺服器上的例項
  2. 開發A訪問時,請求的所有路由優先呼叫開發A本機啟動的例項,如果沒有則呼叫伺服器上的例項
  3. 開發B訪問時同上,請求的所有路由優先呼叫開發B本機啟動的例項,如果沒有則呼叫伺服器上的例項

在找到IP的辨識規律後,推匯出下面3個路由規則來實現上面的目標

  1. 優先匹配原始請求方的IP的服務例項
  2. 再者匹配上游服務所在機器IP的服務例項
  3. 上面2個邏輯都匹配不到的話使用輪詢的方式找一個例項

 
具體的自定義負載均衡的物件怎麼寫我這裡就不詳細描述了,可以參考我上一篇文章《Spring Cloud開發人員如何解決服務衝突和例項亂竄?》

 

四、獲取原始請求方的IP

獲取原IP的程式碼片段如下,只需要在閘道器上增加一個過濾器獲取IP,然後新增到header裡面一直傳遞下去就可以了

/**
 * 獲取Ip地址
 */
private String getIpAddr(HttpServletRequest request){
    String ip = request.getHeader("X-Forwarded-For");
    if (isEmptyIP(ip)) {
        ip = request.getHeader("Proxy-Client-IP");
        if (isEmptyIP(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
            if (isEmptyIP(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
                if (isEmptyIP(ip)) {
                        ip = request.getHeader("HTTP_X_FORWARDED_FOR");
                        if (isEmptyIP(ip)) {
                            ip = request.getRemoteAddr();
                            if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
                                // 根據網絡卡取本機配置的IP
                                try {
                                    ip = InetAddress.getLocalHost().getHostAddress();
                                } catch (UnknownHostException e) {
                                    log.error("InetAddress.getLocalHost()-error", e);
                                }
                            }
                        }
                }
            }
        }
    } else if (ip.length() > 15) {
        String[] ips = ip.split(",");
        for (int index = 0; index < ips.length; index++) {
            String strIp = ips[index];
            if (!isEmptyIP(ip)) {
                ip = strIp;
                break;
            }
        }
    }
    return ip;
}

private boolean isEmptyIP(String ip) {
    if (StrUtil.isEmpty(ip) || UNKNOWN_STR.equalsIgnoreCase(ip)) {
        return true;
    }
    return false;
}

把原IP新增到header的HTTP_X_FORWARDED_FOR裡面傳遞給下游服務

RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String sourceIp = getIpAddr(request);
ctx.getZuulRequestHeaders().put("HTTP_X_FORWARDED_FOR", sourceIp);

 

五、獲取伺服器所在機器的IP

直接使用JDK自帶的InetAddress就可以了

String localIp = InetAddress.getLocalHost().getHostAddress()

 

六、總結

通過IP的方案來實現開發環境服務例項隔離和策略路由後,可以實現到開發完全無感知,既不需要配置元資料,也不需要自己去傳version之類的引數了。
但是這個方案其實也是有侷限性的

  1. 開發伺服器必須是隻用一臺來部署所有的服務,因為如果上游服務和下游服務不在同一個IP上就失去了辨識能力了
  2. 因為網路環境比較複雜,不一定能獲取到客戶端的真實原IP
  3. 開發人員啟動客戶端/前端的機器與啟動後臺服務必須是同一臺電腦上才行;例如如果是前端開發人員A啟動的客戶端,去除錯後臺開發人員B啟動的服務就不行了,因為原IP與註冊上去的服務例項IP匹配不上

 
最後可能大家會問原IP怎樣全鏈路傳遞下去?鏈路傳遞可以參考一下我的另外一篇文章《日誌排查問題困難?分散式日誌鏈路跟蹤來幫你》

 

推薦閱讀

  • zuul整合Sentinel最新的閘道器流控元件
  • 阿里註冊中心Nacos生產部署方案
  • Spring Boot自定義配置項在IDE裡面實現自動提示
  • Spring Cloud Zuul的動態路由怎樣做?整合Nacos實現很簡單

 
掃碼關注有驚喜!

相關推薦

Spring Cloud開發人員如何解決服務衝突例項

一、背景 在我們開發微服務架構系統時,雖然說每個微服務都是孤立的可以單獨開發,但實際上並非如此,要除錯和測試你的服務不僅需要您的微服務啟動和執行,還需要它的上下文服務、依賴的基礎服務等都要執行;但如果你的系統服務數和依賴比較多呢,那就是一個比較棘手的問題!有沒有辦法能提高開發效率呢? 如上圖所示,我們

Spring Cloud開發人員如何解決服務衝突例項?(IP實現方案)

一、背景 在我上一篇文章《Spring Cloud開發人員如何解決服務衝突和例項亂竄?》中提到使用服務的元資料來實現隔離和路由,有朋友問到能不能直接通過IP來實現?本文就和大家一起來討論一下這個問題   二、可行性分析 要實現通過IP來隔離和路由的話有一個非常關鍵的點需要解決,就是怎樣實現IP可

開發人員如何解決 Spring Cloud 服務衝突例項

作者:zlt2000 原文:https://www.cnblogs.com/zlt2000/p/11459390.html?ut

Spring cloud開發的微服務部署到Linux上內存過高的問題

linux系統服務 內存參數 中間 size 但是 aps 內存占用 style 驗證 【問題描述】   在使用spring cloud過程中一個很嚴重的資源問題就是內存占用過高,而實際上開發測試並沒有很大的量,甚至卻出現了服務無法正常訪問的問題。 【原因分析】 主

【SFA官方翻譯】Spring WebFluxSpring Cloud進行響應式微服務開發

啟用 測試數據 技術 logger 轉發 bic snap uri led 原創 SpringForAll社區 2018-05-18 作者 Spring4all 社區 摘要: 如果你想用Spring的最新和最好的工具開始使用響應式微服務,那麽這篇文章就是

Spring Cloud(七)Hystrix DashboardTurbine服務監控

文章目錄 1 Hystrix Dashboard案例 1.1 增加依賴 1.2 編寫啟動類 1.3 測試 1.4 監控 2 Hystrix Dashboard Turbine案例 2.1 建立Hy

服務Spring Cloud實戰—Eureka Server的簡介高可用性—叢集

Eureka簡介 什麼是Eureka? Eureka是Netflix開源的服務發現元件,本身是一個基於REST的服務。它包含Server和Client兩部分。Spring Cloud將它整合在子專案Spring Cloud Netflix中,從而實現服務的註冊與發現 (注:Eurek

spring-cloud(二)服務的呼叫的方式RibbonFegin

一、特點   在微服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基於http restful的。Spring cloud有兩種服務呼叫方式:   1. ribbon+restTemplate   ribbon是一個客戶端可以負載均衡的呼叫方式。   2. fegin   a

Spring cloud開發記憶體佔用過高解決方法

https://blog.csdn.net/wanhuiguizong/article/details/79289986   版權宣告:本文為博主原創文章,轉載請宣告文章來源和原文連結。 https://blog.csdn.net/wanhuiguizong/article/details/79

KubernetesSpring Cloud哪個部署微服務更好?_Kubernetes中文社群

Spring Cloud 和Kubernetes都自稱自己是部署和執行微服務的最好環境,但是它們在本質上和解決不同問題上是有很大差異的。在本文中,我們將看到每個平臺如何幫助交付基於微服務的架構(MSA),它們擅長哪個領域,並且如何兩全其美的使用從而在微服務之旅上獲得成功。 背景 最近我讀了 A

Spring cloud實戰-Zuul如何動態負載服務發現擴容

Zuul、Fegin、Rebbion、Eureka一條龍 很多人都自然而然把zuul當成nginx那樣來在配置寫死節點配置來。實際上zuul和eureka的是可以完美配合,完全可以基於服務名的註冊和發現,來動態的實現服務的動態負載和動態註冊,從而達到不需要重啟

Spring Cloud 聲明式服務調用 Feign

start etag 結束 value val template ide default true 一、簡介 在上一篇中,我們介紹註冊中心Eureka,但是沒有服務註冊和服務調用,服務註冊和服務調用本來應該在上一章就應該給出例子的,但是我覺得還是和Feign一起講比較好,

Spring Cloud應用程序上下文服務

spring springboot springcloud 配置 bootstrap Spring Boot對於如何使用Spring構建應用程序有一個看法:例如它具有常規配置文件的常規位置,以及用於常見管理和監視任務的端點。Spring Cloud建立在此之上,並添加了一些可能系統中所有組

Spring Cloud - 應用程序上下文服務

外部 posit 優先 如果 eve 並且 tps 指定 enable Spring Boot對於如何使用Spring構建應用程序有一個看法:例如它具有常規配置文件的常規位置,以及用於常見管理和監視任務的端點。Spring Cloud建立在此之上,並添加了一些可能系統中所

Spring Cloud分布式微服務雲架構構建

spring boot spring security spring cloud spring 架構 大型企業分布式微服務雲架構服務組件實現模塊化、微服務化、原子化、灰度發布、持續集成commonservice eurekaNetflix雲端服務發現,一個基於 REST 的服務,用於定位服

Spring Cloud分布式微服務架構圖

spring spring boot spring cloud java 代碼結構 分布式、微服務、雲架構JAVA語言開發、跨平臺、高性能、高可用、安全、服務化、模塊化、組件化、驅動式開發模式從現在開始,我這邊會將近期研發的springcloud微服務雲架構的搭建過程和精髓記錄下來,幫助更

Spring Cloud分布式微服務雲架構簡介

spring spring boot spring cloud java 代碼結構 Spring Cloud是一系列框架的有序集合。利用Spring Boot的開發模式簡化了分布式系統基礎設施的開發,如服務發現、註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等(這裏只簡單的列了一部分

Spring Cloud分布式微服務架構—集成項目簡介

spring spring boot spring cloud java 代碼結構 Spring Cloud集成項目有很多,下面我們列舉一下和Spring Cloud相關的優秀項目,我們的企業架構中用到了很多的優秀項目,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cloud之

Spring Cloud 分布式微服務雲架構

狀態 計劃 tro 計劃任務 部署 轉移 分布 feign 總線 分布式、微服務、雲架構 JAVA語言開發、跨平臺、高性能、高可用、安全、服務化、模塊化、組件化、驅動式開發模式 commonservice eurekaNetflix 雲端服務發現,一個基

漫談spring cloud分布式服務架構

python接口 etc pytho 方案 電商平臺 開發 ide 團購 前後端 詳情請交流 QQ 709639943 01、漫談spring cloud 與 spring boot 基礎架構 02、漫談spring cloud分布式服務架構 03、Node.js