SpringCloud Zuul實(shí)現(xiàn)動(dòng)態(tài)路由
前言
Zuul 是在Spring Cloud Netflix平臺(tái)上提供動(dòng)態(tài)路由,監(jiān)控,彈性,安全等邊緣服務(wù)的框架,是Netflix基于jvm的路由器和服務(wù)器端負(fù)載均衡器,相當(dāng)于是設(shè)備和 Netflix 流應(yīng)用的 Web 網(wǎng)站后端所有請(qǐng)求的前門。本文基于上篇(SpringCloud系列——Ribbon 負(fù)載均衡)實(shí)現(xiàn)Zuul動(dòng)態(tài)路由
GitHub地址:https://github.com/Netflix/zuul
代碼編寫
首先我們?cè)趕pringCloud下面新建一個(gè)springboot項(xiàng)目:zuul-server,pom繼承parent,并且在Eureka上面注冊(cè)(還不會(huì)服務(wù)注冊(cè)與發(fā)現(xiàn)的,請(qǐng)戳:SpringCloud系列——Eureka 服務(wù)注冊(cè)與發(fā)現(xiàn))
maven引入Zuul
<!-- Zuul --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
配置文件
server.port=10010 spring.application.name=zuul-server eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ #健康檢查(需要spring-boot-starter-actuator依賴) eureka.client.healthcheck.enabled=true # 續(xù)約更新時(shí)間間隔(默認(rèn)30秒) eureka.instance.lease-renewal-interval-in-seconds=10 # 續(xù)約到期時(shí)間(默認(rèn)90秒) eureka.instance.lease-expiration-duration-in-seconds=10 #zuul代理配置 zuul.routes.服務(wù)名.path,服務(wù)名要與注冊(cè)的一致 #應(yīng)用名映射 zuul.routes.myspringboot.path=/myspringboot/** zuul.routes.myspringboot.service-id=myspringboot #URL映射 #zuul.routes.myspringboot.path=/myspringboot/** #zuul.routes.myspringboot-url.url=http://localhost:10087/
自定義Zuul過濾器
更多的檢查規(guī)則后續(xù)慢慢健全
/** * Zuul過濾器,實(shí)現(xiàn)了路由檢查 */ public class AccessFilter extends ZuulFilter { /** * 通過int值來定義過濾器的執(zhí)行順序 */ @Override public int filterOrder() { // PreDecoration之前運(yùn)行 return PRE_DECORATION_FILTER_ORDER - 1; } /** * 過濾器的類型,在zuul中定義了四種不同生命周期的過濾器類型: * public static final String ERROR_TYPE = "error"; * public static final String POST_TYPE = "post"; * public static final String PRE_TYPE = "pre"; * public static final String ROUTE_TYPE = "route"; */ @Override public String filterType() { return PRE_TYPE; } /** * 過濾器的具體邏輯 */ @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); System.out.println(String.format("%s AccessFilter request to %s", request.getMethod(),request.getRequestURL().toString())); String accessToken = request.getParameter("accessToken"); //有權(quán)限令牌 if (!StringUtils.isEmpty(accessToken)) { ctx.setSendZuulResponse(true); ctx.setResponseStatusCode(200); //可以設(shè)置一些值 ctx.set("isSuccess", true); return null; } else { ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); ctx.setResponseBody("{\"result\":\"accessToken is not correct!\"}"); //可以設(shè)置一些值 ctx.set("isSuccess", false); return null; } } /** * 返回一個(gè)boolean類型來判斷該過濾器是否要執(zhí)行 */ @Override public boolean shouldFilter() { return true; } }
啟動(dòng)類
添加@EnableZuulProxy注解并使用自定義過濾器
@EnableZuulProxy @SpringBootApplication public class ZuulServerApplication { public static void main(String[] args) { SpringApplication.run(ZuulServerApplication.class, args); } @Bean public AccessFilter accessFilter() { return new AccessFilter(); } }
效果演示
啟動(dòng)所有項(xiàng)目,我們?cè)贓ureka上注冊(cè)了四個(gè)服務(wù),相比上篇(SpringCloud系列——Ribbon 負(fù)載均衡)多了一個(gè)Zuul
瀏覽器訪問 http://localhost:10010/myspringboot/feign/ribbon、http://localhost:10010/myspringboot/feign/ribbon?accessToken=123456
http://localhost:10010/ 這個(gè)端口對(duì)外暴露,相對(duì)于總?cè)肟?,后面接不同的路徑由,Zuul路由到對(duì)應(yīng)的服務(wù)上
1、沒有accessToken是,無法通過檢查
2、攜帶accessToken時(shí),可正常路由,并且Feign調(diào)用、Ribbon負(fù)載均衡
后記
我們?yōu)槭裁匆褂肸uul呢?
1、請(qǐng)求校驗(yàn)、路由轉(zhuǎn)發(fā),接口校驗(yàn)與業(yè)務(wù)邏輯分離
2、隱藏諸多服務(wù)路徑,只暴露統(tǒng)一入口,安全
更多Zuul配置,請(qǐng)看官方文檔
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java GraphQL數(shù)據(jù)加載器批處理的實(shí)現(xiàn)詳解
GraphQL 數(shù)據(jù)加載器是優(yōu)化 GraphQL API 的關(guān)鍵組件,旨在解決臭名昭著的 N+1 查詢問題,在本中,我們將深入研究其批處理功能,感興趣的小伙伴可以了解下2023-12-12SpringMVC Controller 返回值的可選類型詳解
本篇文章主要介紹了SpringMVC Controller 返回值的可選類型詳解 ,spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void,有興趣的可以了解一下2017-05-05Mybatis如何按順序查詢出對(duì)應(yīng)的數(shù)據(jù)字段
這篇文章主要介紹了Mybatis如何按順序查詢出對(duì)應(yīng)的數(shù)據(jù)字段,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Mybatis-Plus條件構(gòu)造器select方法返回指定字段方式
這篇文章主要介紹了Mybatis-Plus條件構(gòu)造器select方法返回指定字段方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06解決@ServerEndpoint不能注入@Autowired的問題
這篇文章主要介紹了解決@ServerEndpoint不能注入@Autowired的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05