springcloud 之 路由网关 zuul
話不多說(shuō),先上圖(圖是丑陋了點(diǎn),大家別介意哈),這幅圖是我根據(jù)公司現(xiàn)有的業(yè)務(wù)設(shè)計(jì)出來(lái)的一個(gè)簡(jiǎn)單的基于springcloud微服務(wù)架構(gòu)圖。
????在springcloud微服務(wù)體系中,我們一般不對(duì)外直接暴露服務(wù)層的接口,而是中間通過(guò)一層代理進(jìn)行中轉(zhuǎn),這層代理的好處一個(gè)是對(duì)外可以隱藏我們內(nèi)部具體服務(wù)的接口,另一個(gè)就是我們非常重要的服務(wù)的負(fù)載均衡,在上圖中客戶端的所有請(qǐng)求先經(jīng)過(guò)nginx(Nginx集群)經(jīng)由nginx代理轉(zhuǎn)發(fā)后進(jìn)入springcloud的zuul(zuul集群)路由網(wǎng)關(guān)服務(wù),由zuul再去對(duì)應(yīng)具體的服務(wù);我們的所有服務(wù)均統(tǒng)一注冊(cè)到高可用的服務(wù)注冊(cè)發(fā)現(xiàn)(eureka server)集群中。
首先介紹一下zuul的功能:
zuul的主要功能是路由轉(zhuǎn)發(fā)和過(guò)濾器。路由功能是微服務(wù)的一部分,比如/frnt轉(zhuǎn)發(fā)到到frnt服務(wù),/portal轉(zhuǎn)發(fā)到portal服務(wù)。zuul默認(rèn)和Ribbon結(jié)合實(shí)現(xiàn)了負(fù)載均衡的功能。
好啦,正式開(kāi)工!
1.首先創(chuàng)建一個(gè)項(xiàng)目xx-zuul(名字任意取),引入相關(guān)依賴(spring-cloud-starter-netflix-zuul):
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>2.打開(kāi)application-dev.properties并加入以下內(nèi)容:
#端口 server.port=8763 #實(shí)例名 spring.application.name=xx-zuul #注冊(cè)中心 eureka.server.host=localhost eureka.server.port=8761 eureka.client.service-url.defaultZone=http://${eureka.server.host}:${eureka.server.port}/eureka/ #路由規(guī)則配置 #攔截路徑 zuul.routes.demo-springboot.path=/demo/** #eureka中注冊(cè)的實(shí)例名 zuul.routes.demo-springboot.serviceId=demo-springboot #實(shí)際訪問(wèn)時(shí)去除前綴(即:經(jīng)過(guò)zuul轉(zhuǎn)發(fā)后會(huì)去除掉demo前綴) zuul.routes.demo-springboot.stripPrefix=true #連接超時(shí)時(shí)間 zuul.host.connect-timeout-millis=15000 zuul.host.socket-timeout-millis=10000 #log level logging.level.root=debug #開(kāi)啟eureka client健康檢查 eureka.client.healthcheck=true # 續(xù)約到期時(shí)間(默認(rèn)90秒) eureka.instance.lease-expiration-duration-in-seconds=30 # 續(xù)約更新時(shí)間間隔(默認(rèn)30秒) eureka.instance.lease-renewal-interval-in-seconds=103.開(kāi)啟zuul代理注解@EnableZuulProxy
@EnableZuulProxy @EnableEurekaClient @SpringBootApplication public class Xsignal2ZuulApplication {public static void main(String[] args) {SpringApplication.run(Xsignal2ZuulApplication.class, args); } }4.最后啟動(dòng)xx-zuul服務(wù),demo-springboot服務(wù),在eureka控制面板查看:
打開(kāi)瀏覽器準(zhǔn)備訪問(wèn)zuul代理:
看到如圖結(jié)果表示我們的zuul代理已經(jīng)生效,成功訪問(wèn)到了demo-springboog項(xiàng)目,慶賀一下吧!
另外,文章開(kāi)頭說(shuō)道zuul支持過(guò)濾功能,即我們可以通過(guò)自定義filter繼承自ZuulFilter即可:
@Component public class MyFilter extends ZuulFilter {/*filterType:返回一個(gè)字符串代表過(guò)濾器的類型,在zuul中定義了四種不同生命周期的過(guò)濾器類型,具體如下: pre:路由之前 routing:路由之時(shí) post: 路由之后 error:發(fā)送錯(cuò)誤調(diào)用 filterOrder:過(guò)濾的順序 shouldFilter:這里可以寫邏輯判斷,是否要過(guò)濾,本文true,永遠(yuǎn)過(guò)濾。 run:過(guò)濾器的具體邏輯。可用很復(fù)雜,包括查sql,nosql去判斷該請(qǐng)求到底有沒(méi)有權(quán)限訪問(wèn)。 */ private static Logger log = LoggerFactory.getLogger(MyFilter.class); @Override public String filterType() {return FilterConstants.PRE_TYPE; }@Override public int filterOrder() {return 0; }@Override public boolean shouldFilter() {return true; }@Override public Object run() {RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); Object accessToken = request.getParameter("token"); if(accessToken == null) {log.warn("token is empty"); ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); try {ctx.getResponse().getWriter().write("token is empty"); }catch (Exception e){}return null; } return null; } }在filter中我們可以自定義需要過(guò)濾的請(qǐng)求,攔截非法請(qǐng)求,權(quán)限認(rèn)證,頻控,限流等操作! 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的springcloud 之 路由网关 zuul的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: openssh的基本使用方法是什么
- 下一篇: springboot 之 webscok