Spring?Cloud詳細(xì)講解zuul集成Eureka流程
zuul集成Eureka
通過(guò)剛才的示例,我們已經(jīng)可以簡(jiǎn)單地使用 Zuul 進(jìn)行路由的轉(zhuǎn)發(fā)了,在實(shí)際使用中我們通常是用 Zuul 來(lái)代理請(qǐng)求轉(zhuǎn)發(fā)到內(nèi)部的服務(wù)上去,統(tǒng)一為外部提供服務(wù)。內(nèi)部服務(wù)的數(shù)量會(huì)很多,而且可以隨時(shí)擴(kuò)展,我們不可能每增加一個(gè)服務(wù)就改一次路由的配置,所以也得通過(guò)結(jié)合 Eureka 來(lái)實(shí)現(xiàn)動(dòng)態(tài)的路由轉(zhuǎn)發(fā)功能。首先需要添加 Eureka 的依賴,代碼如下所示。
<dependency> <groupId>org.springframework.cloud</groupId > <artifactId>spring-cloud- starter-netflix-eureka-client</artifactId> <version>2.2.9.RELEASE</version> </dependency>
說(shuō)明:這里的eureka-client版本要使用2.2.9.RELEASE,否則會(huì)報(bào)錯(cuò)!
啟動(dòng)類不需要修改,因?yàn)?@EnableZuulProxy 已經(jīng)自帶了 @EnableDiscoveryClient。只需要在配置文件中增加Eureka 的地址即可:
eureka:
client:
service-url:
defaultZone: http://admin:1357@localhost:8761/eureka
重啟服務(wù),我們可以通過(guò)默認(rèn)的轉(zhuǎn)發(fā)規(guī)則來(lái)訪問(wèn) Eureka中的服務(wù)。訪問(wèn)規(guī)則是“網(wǎng)關(guān)服務(wù)地址+訪問(wèn)的服務(wù)名稱+接口 URI”。
如上面的訪問(wèn)改為: http://localhost:7000/ws-user-server/user/23
Zuul路由配置
當(dāng) Zuul 集成 Eureka 之后,其實(shí)就可以為 Eureka 中所有的服務(wù)進(jìn)行路由操作了,默認(rèn)的轉(zhuǎn)發(fā)規(guī)則就是“網(wǎng)關(guān) 服務(wù)地址+訪問(wèn)的服務(wù)名稱+接口 URI”。在給服務(wù)指定名稱的時(shí)候,應(yīng)盡量短一點(diǎn),這樣的話我們就可以用默認(rèn)的路由規(guī)則進(jìn)行請(qǐng)求,不需要為每個(gè)服務(wù)都定一個(gè)路由規(guī)則,這樣就算新增了服務(wù),API 網(wǎng)關(guān)也不用修改和重啟了。
1. 指定具體服務(wù)路由
我們可以為每一個(gè)服務(wù)都配置一個(gè)路由轉(zhuǎn)發(fā)規(guī)則:
zuul:
routes: #路由轉(zhuǎn)發(fā)
ws-user-server:
path: /api-user/**
上述代碼將ws-user-server 服務(wù)的路由地址配置成了api-user,也就是當(dāng)需要訪問(wèn) ws-user-server中的接口時(shí),我們可以通過(guò) api-user/user/20 來(lái)進(jìn)行。這其實(shí)就是將服務(wù)名稱變成了我們自定義的名稱。注意: /api-user/** 后面一定要配置兩個(gè)星號(hào),兩個(gè)星號(hào)表示可以轉(zhuǎn)發(fā)任意層級(jí)的 URL,比如“/apiuser/user/1”。如果只配置一個(gè)星號(hào),那么就只能轉(zhuǎn)發(fā)一級(jí),比如“/api-user/user”。默認(rèn)的路由規(guī)則還適用?。。。?/p>
2. 路由前綴
有的時(shí)候我們會(huì)想在 API 前面配置一個(gè)統(tǒng)一的前綴,就可
以通過(guò) Zuul 中的配置來(lái)實(shí)現(xiàn):
zuul:
prefix: /v1
上述訪問(wèn)地址變?yōu)椋?http://localhost:7000/v1/api-user/user/20
Zuul過(guò)濾器
過(guò)濾器類型
Zuul 中的過(guò)濾器跟我們之前使用的 javax.servlet.Filter不一樣,javax.servlet.Filter 只有一種類型,可以通過(guò)配置 urlPatterns 來(lái)攔截對(duì)應(yīng)的請(qǐng)求。
而 Zuul 中的過(guò)濾器總共有 4 種類型,且每種類型都有對(duì)應(yīng)的使用場(chǎng)景。
1)pre
可以在請(qǐng)求被路由之前調(diào)用。適用于身份認(rèn)證的場(chǎng)景,認(rèn)證通過(guò)后再繼續(xù)執(zhí)行下面的流程。
2)route
在路由請(qǐng)求時(shí)被調(diào)用。適用于灰度發(fā)布場(chǎng)景,在將要路由的時(shí)候可以做一些自定義的邏輯。
3)post
在 route 和 error 過(guò)濾器之后被調(diào)用。這種過(guò)濾器將請(qǐng)求路由到達(dá)具體的服務(wù)之后執(zhí)行。適用于需要添加響應(yīng)頭,記錄響應(yīng)日志等應(yīng)用場(chǎng)景。
4)error
處理請(qǐng)求時(shí)發(fā)生錯(cuò)誤時(shí)被調(diào)用。在執(zhí)行過(guò)程中發(fā)送錯(cuò)誤時(shí)會(huì)進(jìn)入 error 過(guò)濾器,可以用來(lái)統(tǒng)一記錄錯(cuò)誤信息。
請(qǐng)求生命周期

過(guò)濾器執(zhí)行的順序,請(qǐng)求發(fā)過(guò)來(lái)首先到 pre 過(guò)濾器,再到 routing 過(guò)濾器,最后到 post 過(guò)濾器,任何一個(gè)過(guò)濾器有異常都會(huì)進(jìn)入 error 過(guò)濾器。通過(guò) com.netflix.zuul.http.ZuulServlet 也可以看出完整執(zhí)行順序,ZuulServlet 類似 Spring-MVC 的DispatcherServlet,所有的 Request 都要經(jīng)過(guò)ZuulServlet 的處理。
ZuulServlet 的service實(shí)現(xiàn):
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { try {
this.init((HttpServletRequest)servletReque st(HttpServletResponse)servletResponse); RequestContext context = RequestContext.getCurrentContext(); context.setZuulEngineRan(); try {this.preRoute(); } catch (ZuulException var13) { this.error(var13); this.postRoute(); return; }try {this.route(); } catch (ZuulException var12) { this.error(var12); this.postRoute(); return; }try {this.postRoute();} catch (ZuulException var11) { this.error(var11); } } catch (Throwable var14) { this.error(new ZuulException(var14, 500, "UNHANDLED_EXCEPTION_" + var14.getClass().getName())); } finally { RequestContext.getCurrentContext().unset() ; } }
使用過(guò)濾器
創(chuàng)建一個(gè)token驗(yàn)證的過(guò)濾器,繼承抽象類ZuulFilter,
如下:
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
public class TokenFilter extends ZuulFilter {
/*** 過(guò)濾器類型,可選值有 pre、route、post、 error。* @return */ @Override
public String filterType() {
return "pre"; }
/*** 過(guò)濾器的執(zhí)行順序,數(shù)值越小,優(yōu)先級(jí)越高。 * @return */ @Override
public int filterOrder() {
return 0; }
/*** 是否執(zhí)行該過(guò)濾器,true 為執(zhí)行,false 為不 執(zhí)行,這個(gè)也可以利用配置中心來(lái)實(shí)現(xiàn),達(dá)到動(dòng)態(tài)的開(kāi)啟和 關(guān)閉過(guò)濾器。 * @return */ @Override
public boolean shouldFilter() {
return true; }/*** 執(zhí)行自己的業(yè)務(wù)邏輯,判斷是否 * @return * @throws ZuulException */ @Override
public Object run() throws ZuulException {
RequestContext requestContext=RequestContext.getCurrentCo ntext();String token= requestContext.getRequest().getHeader("tok en");
//如果token沒(méi)傳或 失效 if(null==token){ requestContext.setSendZuulResponse(false); //告訴 Zuul 不需要將當(dāng)前請(qǐng)求轉(zhuǎn)發(fā)到后端的服務(wù)了 requestContext.setResponseBody(" {code:0,msg:'返回給客戶端的數(shù)據(jù)'}"); requestContext.getResponse().setContentTyp e("application/json; charset=utf-8"); }return null; } }
使過(guò)濾器生效:
@Configuration
public class FilterConfig {
@Bean
public TokenFilter tokenFilter(){
return new TokenFilter();
}
}
到此這篇關(guān)于Spring Cloud詳細(xì)講解zuul集成Eureka流程的文章就介紹到這了,更多相關(guān)Spring Cloud Eureka內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java基于servlet使用組件smartUpload實(shí)現(xiàn)文件上傳
這篇文章主要介紹了java基于servlet使用組件smartUpload實(shí)現(xiàn)文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
java多線程中的volatile和synchronized用法分析
這篇文章主要介紹了java多線程中的volatile和synchronized用法分析,以實(shí)例的形式分析了在多線程中volatile和synchronized的用法區(qū)別與使用原理,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12
Springboot項(xiàng)目通過(guò)redis實(shí)現(xiàn)接口的冪等性
這篇文章主要為大家介紹了Springboot項(xiàng)目通過(guò)redis實(shí)現(xiàn)接口的冪等性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
spring boot項(xiàng)目如何采用war在tomcat容器中運(yùn)行
這篇文章主要介紹了spring boot項(xiàng)目如何采用war在tomcat容器中運(yùn)行呢,主要講述將SpringBoot打成war包并放入tomcat中運(yùn)行的方法分享,需要的朋友可以參考下2022-11-11
SpringBoot?實(shí)現(xiàn)微信推送模板的示例代碼
這篇文章主要介紹了SpringBoot?實(shí)現(xiàn)微信推送模板,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
使用jmeter實(shí)現(xiàn)對(duì)jar包的調(diào)用方式
這篇文章主要介紹了使用jmeter實(shí)現(xiàn)對(duì)jar包的調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)的實(shí)例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
java實(shí)現(xiàn)網(wǎng)頁(yè)解析示例
這篇文章主要介紹了java實(shí)現(xiàn)網(wǎng)頁(yè)解析示例,需要的朋友可以參考下2014-04-04
SpringBoot集成logback打印彩色日志的代碼實(shí)現(xiàn)
Logback是由log4j創(chuàng)始人設(shè)計(jì)的另一個(gè)開(kāi)源日志組件,默認(rèn)情況下,Spring?Boot會(huì)用Logback來(lái)記錄日志,并用INFO級(jí)別輸出到控制臺(tái),本文給大家介紹了SpringBoot集成logback打印彩色日志,需要的朋友可以參考下2024-03-03

