91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Cloud開發人員怎么解決服務沖突和實例亂竄

發布時間:2021-06-15 10:10:21 來源:億速云 閱讀:228 作者:小新 欄目:大數據

小編給大家分享一下Spring Cloud開發人員怎么解決服務沖突和實例亂竄,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、背景

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

二、可行性分析

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

Spring Cloud開發人員怎么解決服務沖突和實例亂竄

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

  • 開發人員本機IP - 其實就是客戶端IP,也就是原始請求方的IP172.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添加到headerHTTP_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()

以上是“Spring Cloud開發人員怎么解決服務沖突和實例亂竄”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石嘴山市| 佛冈县| 定兴县| 秦皇岛市| 临清市| 安西县| 中超| 富民县| 田阳县| 永川市| 浏阳市| 龙井市| 万荣县| 平安县| 溆浦县| 宿州市| 二手房| 尖扎县| 丽水市| 石泉县| 二连浩特市| 武汉市| 息烽县| 吕梁市| 叙永县| 辽阳市| 鄄城县| 巴东县| 隆回县| 方城县| 镇安县| 瓮安县| 余庆县| 天等县| 许昌市| 清远市| 长汀县| 宁蒗| 钟祥市| 汾西县| 华阴市|