小編給大家分享一下Spring Cloud開發(fā)人員怎么解決服務(wù)沖突和實例亂竄,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
為立山等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及立山網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、立山網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
在這一篇文章《Spring Cloud開發(fā)人員解決服務(wù)沖突和實例亂竄的示例分析》中提到使用服務(wù)的元數(shù)據(jù)
來實現(xiàn)隔離和路由,有朋友問到能不能直接通過IP
來實現(xiàn)?本文就和大家一起來討論一下這個問題
要實現(xiàn)通過IP
來隔離和路由的話有一個非常關(guān)鍵的點需要解決,就是怎樣實現(xiàn)IP可辨識,意思就是如何區(qū)分那個IP
是服務(wù)器上的,那個IP
是開發(fā)人員本機(jī)的
如上圖所示其實我們還是能找到規(guī)律可以辨識的,所以這個是可以行的!
開發(fā)人員本機(jī)IP- 其實就是客戶端IP
,也就是原始請求方的IP:172.16.20.2
服務(wù)器IP- 可以理解為服務(wù)器上的服務(wù)所在機(jī)器的IP(有點繞):172.16.20.1
主要實現(xiàn)以下目標(biāo):
普通用戶訪問服務(wù)器上的頁面時,請求的所有路由只調(diào)用服務(wù)器上的實例
開發(fā)A訪問時,請求的所有路由優(yōu)先調(diào)用開發(fā)A本機(jī)啟動的實例
,如果沒有則調(diào)用服務(wù)器上的實例
開發(fā)B訪問時同上,請求的所有路由優(yōu)先調(diào)用開發(fā)B本機(jī)啟動的實例
,如果沒有則調(diào)用服務(wù)器上的實例
在找到IP
的辨識規(guī)律后,推導(dǎo)出下面3個路由規(guī)則來實現(xiàn)上面的目標(biāo)
優(yōu)先匹配原始請求方的IP
的服務(wù)實例
再者匹配上游服務(wù)所在機(jī)器IP
的服務(wù)實例
上面2個邏輯都匹配不到的話使用輪詢的方式找一個實例
具體的自定義負(fù)載均衡的對象怎么寫我這里就不詳細(xì)描述了,可以參考我上一篇文章《Spring Cloud開發(fā)人員解決服務(wù)沖突和實例亂竄的示例分析》
獲取原IP
的代碼片段如下,只需要在網(wǎng)關(guān)上增加一個過濾器獲取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)) { // 根據(jù)網(wǎng)卡取本機(jī)配置的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
里面?zhèn)鬟f給下游服務(wù)
RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String sourceIp = getIpAddr(request); ctx.getZuulRequestHeaders().put("HTTP_X_FORWARDED_FOR", sourceIp);
直接使用JDK自帶的InetAddress
就可以了
String localIp = InetAddress.getLocalHost().getHostAddress()
以上是“Spring Cloud開發(fā)人員怎么解決服務(wù)沖突和實例亂竄”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
當(dāng)前題目:SpringCloud開發(fā)人員怎么解決服務(wù)沖突和實例亂竄
文章鏈接:http://www.rwnh.cn/article26/jdjhcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)站制作、網(wǎng)站排名、網(wǎng)站內(nèi)鏈、云服務(wù)器、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)