您好,登錄后才能下訂單哦!
小編給大家分享一下SpringCloud怎么實現(xiàn)Zuul集群,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
1.互聯(lián)網(wǎng)公司中網(wǎng)關(guān)都是集群 搭建集群: Nginx+Zuul 一主一備,或者輪詢多個。
2.在微服務(wù)中,所有服務(wù)請求都會統(tǒng)一請求到Zuul網(wǎng)關(guān)上。
圖示:
過程:客戶端發(fā)送請求統(tǒng)一到Nginx上,在使用Nginx實現(xiàn)反向代理和負(fù)載均衡,采用輪詢算法轉(zhuǎn)發(fā)到網(wǎng)關(guān)上。
搭建Zull集群前,應(yīng)該對Eureka注冊中心,以及創(chuàng)建SpringBoot項目應(yīng)該有了解,這里就不一 一贅述了。
實際上創(chuàng)建會員服務(wù)、訂單服務(wù)這一步可以省略,因為我們僅僅是為了演示Nginx對Zuul網(wǎng)關(guān)的負(fù)載均衡效果。
會員服務(wù)配置:
過程:客戶端發(fā)送請求統(tǒng)一到Nginx上,在使用Nginx實現(xiàn)反向代理和負(fù)載均衡,采用輪詢算法轉(zhuǎn)發(fā)到網(wǎng)關(guān)上。1.創(chuàng)建Eurek注冊中心、會員服務(wù)、訂單服務(wù) (略)
搭建Zull集群前,應(yīng)該對Eureka注冊中心,以及創(chuàng)建SpringBoot項目應(yīng)該有了解,這里就不一 一贅述了。實際上創(chuàng)建會員服務(wù)、訂單服務(wù)這一步可以省略,因為我們僅僅是為了演示Nginx對Zuul網(wǎng)關(guān)的負(fù)載均衡效果。
會員服務(wù)配置:
#會員服務(wù) server: port: 8082 spring: application: name: member-service #服務(wù)名 #Eureka配置 eureka: client: service-url: defaultZone: http://127.0.0.1:8761/eureka/ #注冊中心的地址
訂單服務(wù):
#訂單服務(wù) server: port: 8081 spring: application: name: order-service #服務(wù)名 #Eureka配置 eureka: client: service-url: defaultZone: http://127.0.0.1:8761/eureka/ #注冊中心地址
application.yml文件中配置 (Zull的配置生產(chǎn)時一般是放到配置中心中)
#配置Zuul端口 server: port: 81 spring: application: name: zull-gateway-service #服務(wù)名 #Eureka配置 eureka: client: service-url: defaultZone: http://127.0.0.1:8761/eureka/ #注冊中心地址 # 配置網(wǎng)關(guān)反向代理,例如訪問/api-member/** 直接重定向到member-service服務(wù),實現(xiàn)路由轉(zhuǎn)發(fā),隱藏服務(wù)的真實ip(服務(wù)都實在內(nèi)網(wǎng)中) #zull根據(jù)服務(wù)名,去Eureka獲取服務(wù)真實地址,并通過本地轉(zhuǎn)發(fā),而且默認(rèn)開啟Ribbon實現(xiàn)負(fù)載均衡 #默認(rèn)讀取Eureka注冊列表 默認(rèn)30秒間隔 zuul: routes: api-a: #會員服務(wù)網(wǎng)關(guān)配置 path: /api-member/** #訪問只要是/api-member/ 開頭的直接轉(zhuǎn)發(fā)到member-service服務(wù) #服務(wù)名 serviceId: member-service api-b: #訂單服務(wù)網(wǎng)關(guān)配置 path: /api-order/** serviceId: order-service
創(chuàng)建TokenFilet類繼承ZuulFilter,在run方法中輸入網(wǎng)關(guān)的端口,調(diào)用服務(wù)時方便查看Nginx轉(zhuǎn)發(fā)到哪個網(wǎng)關(guān)
package com.example.zuul.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import io.micrometer.core.instrument.util.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @Component public class TokenFilter extends ZuulFilter { //統(tǒng)計當(dāng)前Zuul調(diào)用次數(shù) int count = 0; //獲取Zuul服務(wù)端口號 @Value("${server.port}") private String prot; /** * 指定該Filter的類型 * ERROR_TYPE = "error"; * POST_TYPE = "post"; * PRE_TYPE = "pre"; * ROUTE_TYPE = "route"; */ @Override public String filterType() { System.out.println("filterType()..."); return "pre"; } /** * 指定該Filter執(zhí)行的順序(Filter從小到大執(zhí)行) * DEBUG_FILTER_ORDER = 1; * FORM_BODY_WRAPPER_FILTER_ORDER = -1; * PRE_DECORATION_FILTER_ORDER = 5; * RIBBON_ROUTING_FILTER_ORDER = 10; * SEND_ERROR_FILTER_ORDER = 0; * SEND_FORWARD_FILTER_ORDER = 500; * SEND_RESPONSE_FILTER_ORDER = 1000; * SIMPLE_HOST_ROUTING_FILTER_ORDER = 100; * SERVLET_30_WRAPPER_FILTER_ORDER = -2; * SERVLET_DETECTION_FILTER_ORDER = -3; */ @Override public int filterOrder() { System.out.println("filterOrder()..."); return 0; } /** * 指定需要執(zhí)行該Filter的規(guī)則 * 返回true則執(zhí)行run() * 返回false則不執(zhí)行run() */ @Override public boolean shouldFilter() { System.out.println("shouldFilter()..."); return true; } /** * 該Filter具體的執(zhí)行活動 */ @Override public Object run() throws ZuulException { // 獲取上下文 //RequestContext currentContext = RequestContext.getCurrentContext(); //HttpServletRequest request = currentContext.getRequest(); //獲取userToken // String userToken = request.getParameter("userToken"); //System.out.println("userToken: "+userToken); //if (StringUtils.isEmpty(userToken)) { //不會繼續(xù)執(zhí)行調(diào)用服務(wù)接口,網(wǎng)關(guān)直接響應(yīng)給客戶端 //currentContext.setSendZuulResponse(false); //currentContext.setResponseStatusCode(401); // currentContext.setResponseBody("userToken is Null"); // return null; // }else if(!userToken.equals("10010")){ // currentContext.setSendZuulResponse(false); //currentContext.setResponseStatusCode(401); //currentContext.setResponseBody("userToken is Error"); //return null; //} // 否則正常執(zhí)行業(yè)務(wù)邏輯,調(diào)用服務(wù)..... System.out.println("訪問Zuul網(wǎng)關(guān)端口為:"+prot +"(total:"+ ( count++) +")"); return null; } }
啟動兩個Zuul服務(wù),端口號分別為81和82
這里演示使用Windows版本,Linux安裝也很簡單,后面操作都一樣。
windows版下載地址:http://nginx.org/en/download.html
下載好后解壓,進入conf目錄找到nginx.conf文件打開,配置如下:
#配置上游服務(wù)器 集群,默認(rèn)輪詢機制 upstream backServer{ server 127.0.0.1:81; server 127.0.0.1:82; # 補充: backup表示從服務(wù)器或者叫備用服務(wù)器 只有當(dāng)主服務(wù)器(81、82端口)都不能訪問時才會訪問此(83端口)備用服務(wù)器 當(dāng)主服務(wù)器恢復(fù)正常后 則訪問主服務(wù)器 #server 127.0.0.1:83 backup; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { ##root html; #指定上游負(fù)載均衡服務(wù)器 proxy_pass http://backServer/; index index.html index.htm; } }
雙擊nginx.exe啟動Nginx服務(wù)器
瀏覽器訪問http://localhost/api-member
我們可以看到兩個網(wǎng)關(guān)分別輸出了日志,實現(xiàn)了負(fù)載均衡
我們看到訪問的次數(shù)不一樣,這其實和使用Google瀏覽器有關(guān),可以換其他瀏覽器試試。
1、都可以實現(xiàn)反向代理。
2、都可以實現(xiàn)負(fù)載均衡,Nginx是服務(wù)端負(fù)載均衡,Zuul是本地負(fù)載均衡。
因為微服務(wù)網(wǎng)關(guān)是針對整個微服務(wù)實現(xiàn)統(tǒng)一的請求攔截,網(wǎng)關(guān)基本上都是采用自己熟悉的語言開發(fā)的,目的方便易學(xué)。
網(wǎng)關(guān)的作用:
1、網(wǎng)關(guān)對所有服務(wù)會話進行攔截
2、網(wǎng)關(guān)安全控制、統(tǒng)一異常處理、xxs、sql注入
3、權(quán)限控制、黑名單和白名單、性能監(jiān)控、日志打印等
設(shè)置備用服務(wù)器(主從架構(gòu)),只有當(dāng)所有主服務(wù)器不可用時才會負(fù)載到備服務(wù)器,當(dāng)主服務(wù)器恢復(fù)正常時則負(fù)載到主服務(wù)器。
upstream backServer{ server 127.0.0.1:81; server 127.0.0.1:82; # 補充: backup表示從服務(wù)器或者叫備用服務(wù)器 只有當(dāng)主服務(wù)器(81、82端口)都不能訪問時才會訪問此(83端口)備用服務(wù)器 當(dāng)主服務(wù)器恢復(fù)正常后 則訪問主服務(wù)器 server 127.0.0.1:83 backup; }
設(shè)置Nginx轉(zhuǎn)發(fā)請求超時時間
upstream backServer{ server 127.0.0.1:81; server 127.0.0.1:82; server 127.0.0.1:83 backup; } location / { proxy_pass http://backServer/; proxy_redirect default; proxy_connect_timeout 1; # 超時1s則轉(zhuǎn)發(fā)到其他服務(wù),宕機情況下也適用 proxy_read_timeout 1; proxy_send_timeout 1;
看完了這篇文章,相信你對“SpringCloud怎么實現(xiàn)Zuul集群”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。