您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Spring Cloud中API網(wǎng)關(guān)服務(wù)Zuul的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Spring Cloud中API網(wǎng)關(guān)服務(wù)Zuul的示例分析”這篇文章吧。
構(gòu)建網(wǎng)關(guān)
網(wǎng)關(guān)的構(gòu)建我們通過(guò)下面三個(gè)步驟來(lái)實(shí)現(xiàn)。
1.創(chuàng)建Spring Boot工程并添加依賴(lài)
首先我們創(chuàng)建一個(gè)普通的Spring Boot工程名為api-gateway,然后添加相關(guān)依賴(lài),這里我們主要添加兩個(gè)依賴(lài)spring-cloud-starter-zuul和spring-cloud-starter-eureka,spring-cloud-starter-zuul依賴(lài)中則包含了ribbon、hystrix、actuator等,如下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Dalston.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
2.添加注解
然后在入口類(lèi)上添加@EnableZuulProxy注解表示開(kāi)啟Zuul的API網(wǎng)關(guān)服務(wù)功能,如下:
@SpringBootApplication @EnableZuulProxy public class ApiGatewayApplication { public static void main(String[] args) { SpringApplication.run(ApiGatewayApplication.class, args); } }
3.配置路由規(guī)則
application.properties文件中的配置可以分為兩部分,一部分是Zuul應(yīng)用的基礎(chǔ)信息,還有一部分則是路由規(guī)則,如下:
# 基礎(chǔ)信息配置 spring.application.name=api-gateway server.port=2006 # 路由規(guī)則配置 zuul.routes.api-a.path=/api-a/** zuul.routes.api-a.serviceId=feign-consumer # API網(wǎng)關(guān)也將作為一個(gè)服務(wù)注冊(cè)到eureka-server上 eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
我們?cè)谶@里配置了路由規(guī)則所有符合/api-a/**的請(qǐng)求都將被轉(zhuǎn)發(fā)到feign-consumer服務(wù)上,至于feign-consumer服務(wù)的地址到底是什么則由eureka-server去分析,我們這里只需要寫(xiě)上服務(wù)名即可。以上面的配置為例,如果我請(qǐng)求 http://localhost:2006/api-a/hello1 接口則相當(dāng)于請(qǐng)求 http://localhost:2005/hello1 (我這里feign-consumer的地址為 http://localhost:2005 ),我們?cè)诼酚梢?guī)則中配置的api-a是路由的名字,可以任意定義,但是一組path和serviceId映射關(guān)系的路由名要相同。
OK,做好這些之后,我們依次啟動(dòng)我們的eureka-server、provider和feign-consumer,然后訪問(wèn)如下地址 http://localhost:2006/api-a/hello1 ,訪問(wèn)結(jié)果如下:
看到這個(gè)效果說(shuō)明我們的API網(wǎng)關(guān)服務(wù)已經(jīng)構(gòu)建成功了,我們發(fā)送的符合路由規(guī)則的請(qǐng)求自動(dòng)被轉(zhuǎn)發(fā)到相應(yīng)的服務(wù)上去處理了。
請(qǐng)求過(guò)濾
構(gòu)建好了網(wǎng)關(guān),接下來(lái)我們就來(lái)看看如何利用網(wǎng)關(guān)來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的權(quán)限驗(yàn)證。這里就涉及到了Spring Cloud Zuul中的另外一個(gè)核心功能:請(qǐng)求過(guò)濾。請(qǐng)求過(guò)濾有點(diǎn)類(lèi)似于Java中Filter過(guò)濾器,先將所有的請(qǐng)求攔截下來(lái),然后根據(jù)現(xiàn)場(chǎng)情況做出不同的處理,這里我們就來(lái)看看Zuul中的過(guò)濾器要如何使用。很簡(jiǎn)單,兩個(gè)步驟:
1.定義過(guò)濾器
首先我們定義一個(gè)過(guò)濾器繼承自ZuulFilter,如下:
public class PermisFilter extends ZuulFilter { @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String login = request.getParameter("login"); if (login == null) { ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); ctx.addZuulResponseHeader("content-type","text/html;charset=utf-8"); ctx.setResponseBody("非法訪問(wèn)"); } return null; } }
關(guān)于這個(gè)類(lèi)我說(shuō)如下幾點(diǎn):
1.filterType方法的返回值為過(guò)濾器的類(lèi)型,過(guò)濾器的類(lèi)型決定了過(guò)濾器在哪個(gè)生命周期執(zhí)行,pre表示在路由之前執(zhí)行過(guò)濾器,其他可選值還有post、error、route和static,當(dāng)然也可以自定義。
2.filterOrder方法表示過(guò)濾器的執(zhí)行順序,當(dāng)過(guò)濾器很多時(shí),這個(gè)方法會(huì)有意義。
3.shouldFilter方法用來(lái)判斷過(guò)濾器是否執(zhí)行,true表示執(zhí)行,false表示不執(zhí)行,在實(shí)際開(kāi)發(fā)中,我們可以根據(jù)當(dāng)前請(qǐng)求地址來(lái)決定要不要對(duì)該地址進(jìn)行過(guò)濾,這里我直接返回true。
4.run方法則表示過(guò)濾的具體邏輯,假設(shè)請(qǐng)求地址中攜帶了login參數(shù)的話,則認(rèn)為是合法請(qǐng)求,否則就是非法請(qǐng)求,如果是非法請(qǐng)求的話,首先設(shè)置ctx.setSendZuulResponse(false);表示不對(duì)該請(qǐng)求進(jìn)行路由,然后設(shè)置響應(yīng)碼和響應(yīng)值。這個(gè)run方法的返回值在當(dāng)前版本(Dalston.SR3)中暫時(shí)沒(méi)有任何意義,可以返回任意值。
2.配置過(guò)濾器Bean
然后在入口類(lèi)中配置相關(guān)的Bean即可,如下:
@Bean PermisFilter permisFilter() { return new PermisFilter(); }
此時(shí),如果我們?cè)L問(wèn) http://localhost:2006/api-a/hello1 ,結(jié)果如下:
如果給請(qǐng)求地址加上login參數(shù),則結(jié)果如下:
以上是“Spring Cloud中API網(wǎng)關(guān)服務(wù)Zuul的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。