淺談Spring Cloud中的API網(wǎng)關(guān)服務(wù)Zuul
到目前為止,我們Spring Cloud中的內(nèi)容已經(jīng)介紹了很多了,Ribbon、Hystrix、Feign這些知識點大家都耳熟能詳了,我們在前文也提到過微服務(wù)就是把一個大的項目拆分成很多小的獨立模塊,然后通過服務(wù)治理讓這些獨立的模塊配合工作等。那么大家來想這樣兩個問題:1.如果我的微服務(wù)中有很多個獨立服務(wù)都要對外提供服務(wù),那么對于開發(fā)人員或者運維人員來說,他要如何去管理這些接口?特別是當(dāng)項目非常大非常龐雜的情況下要如何管理?2.權(quán)限管理也是一個老生常談的問題,在微服務(wù)中,一個獨立的系統(tǒng)被拆分成很多個獨立的模塊,為了確保安全,我難道需要在每一個模塊上都添加上相同的鑒權(quán)代碼來確保系統(tǒng)不被非法訪問?如果是這樣的話,那么工作量就太大了,而且維護也非常不方便。
為了解決上面提到的問題,我們引入了API網(wǎng)關(guān)的概念,API網(wǎng)關(guān)是一個更為智能的應(yīng)用服務(wù)器,它有點類似于我們微服務(wù)架構(gòu)系統(tǒng)的門面,所有的外部訪問都要先經(jīng)過API網(wǎng)關(guān),然后API網(wǎng)關(guān)來實現(xiàn)請求路由、負載均衡、權(quán)限驗證等功能。Spring Cloud中提供的Spring Cloud Zuul實現(xiàn)了API網(wǎng)關(guān)的功能,本文我們就先來看看Spring Cloud Zuul的一個基本使用。
構(gòu)建網(wǎng)關(guān)
網(wǎng)關(guān)的構(gòu)建我們通過下面三個步驟來實現(xiàn)。
1.創(chuàng)建Spring Boot工程并添加依賴
首先我們創(chuàng)建一個普通的Spring Boot工程名為api-gateway,然后添加相關(guān)依賴,這里我們主要添加兩個依賴spring-cloud-starter-zuul和spring-cloud-starter-eureka,spring-cloud-starter-zuul依賴中則包含了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.添加注解
然后在入口類上添加@EnableZuulProxy注解表示開啟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)也將作為一個服務(wù)注冊到eureka-server上 eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
我們在這里配置了路由規(guī)則所有符合/api-a/**的請求都將被轉(zhuǎn)發(fā)到feign-consumer服務(wù)上,至于feign-consumer服務(wù)的地址到底是什么則由eureka-server去分析,我們這里只需要寫上服務(wù)名即可。以上面的配置為例,如果我請求 http://localhost:2006/api-a/hello1 接口則相當(dāng)于請求 http://localhost:2005/hello1 (我這里feign-consumer的地址為 http://localhost:2005 ),我們在路由規(guī)則中配置的api-a是路由的名字,可以任意定義,但是一組path和serviceId映射關(guān)系的路由名要相同。
OK,做好這些之后,我們依次啟動我們的eureka-server、provider和feign-consumer,然后訪問如下地址 http://localhost:2006/api-a/hello1 ,訪問結(jié)果如下:
看到這個效果說明我們的API網(wǎng)關(guān)服務(wù)已經(jīng)構(gòu)建成功了,我們發(fā)送的符合路由規(guī)則的請求自動被轉(zhuǎn)發(fā)到相應(yīng)的服務(wù)上去處理了。
請求過濾
構(gòu)建好了網(wǎng)關(guān),接下來我們就來看看如何利用網(wǎng)關(guān)來實現(xiàn)一個簡單的權(quán)限驗證。這里就涉及到了Spring Cloud Zuul中的另外一個核心功能:請求過濾。請求過濾有點類似于Java中Filter過濾器,先將所有的請求攔截下來,然后根據(jù)現(xiàn)場情況做出不同的處理,這里我們就來看看Zuul中的過濾器要如何使用。很簡單,兩個步驟:
1.定義過濾器
首先我們定義一個過濾器繼承自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("非法訪問");
}
return null;
}
}
關(guān)于這個類我說如下幾點:
1.filterType方法的返回值為過濾器的類型,過濾器的類型決定了過濾器在哪個生命周期執(zhí)行,pre表示在路由之前執(zhí)行過濾器,其他可選值還有post、error、route和static,當(dāng)然也可以自定義。
2.filterOrder方法表示過濾器的執(zhí)行順序,當(dāng)過濾器很多時,這個方法會有意義。
3.shouldFilter方法用來判斷過濾器是否執(zhí)行,true表示執(zhí)行,false表示不執(zhí)行,在實際開發(fā)中,我們可以根據(jù)當(dāng)前請求地址來決定要不要對該地址進行過濾,這里我直接返回true。
4.run方法則表示過濾的具體邏輯,假設(shè)請求地址中攜帶了login參數(shù)的話,則認為是合法請求,否則就是非法請求,如果是非法請求的話,首先設(shè)置ctx.setSendZuulResponse(false);表示不對該請求進行路由,然后設(shè)置響應(yīng)碼和響應(yīng)值。這個run方法的返回值在當(dāng)前版本(Dalston.SR3)中暫時沒有任何意義,可以返回任意值。
2.配置過濾器Bean
然后在入口類中配置相關(guān)的Bean即可,如下:
@Bean
PermisFilter permisFilter() {
return new PermisFilter();
}
此時,如果我們訪問 http://localhost:2006/api-a/hello1 ,結(jié)果如下:
如果給請求地址加上login參數(shù),則結(jié)果如下:
總結(jié)
到這里小伙伴們應(yīng)該已經(jīng)見識到Spring Cloud Zuul的強大之處了吧,API網(wǎng)關(guān)作為系統(tǒng)的的統(tǒng)一入口,將微服務(wù)中的內(nèi)部細節(jié)都屏蔽掉了,而且能夠自動的維護服務(wù)實例,實現(xiàn)負載均衡的路由轉(zhuǎn)發(fā),同時,它提供的過濾器為所有的微服務(wù)提供統(tǒng)一的權(quán)限校驗機制,使得服務(wù)自身只需要關(guān)注業(yè)務(wù)邏輯即可。
Zuul的入門知識我們就先介紹到這里,小伙伴們有問題歡迎留言討論。以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring Cloud Zuul路由網(wǎng)關(guān)服務(wù)過濾實現(xiàn)代碼
- Spring Cloud 網(wǎng)關(guān)服務(wù) zuul 動態(tài)路由的實現(xiàn)方法
- Spring Cloud 服務(wù)網(wǎng)關(guān)Zuul的實現(xiàn)
- SpringCloud實戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)
- spring cloud 使用Zuul 實現(xiàn)API網(wǎng)關(guān)服務(wù)問題
- 詳解Spring Cloud Zuul 服務(wù)網(wǎng)關(guān)
- SpringCloud Zuul服務(wù)功能與使用方法解析
相關(guān)文章
JavaWeb開發(fā)基于ssm的校園服務(wù)系統(tǒng)(實例詳解)
這篇文章主要介紹了JavaWeb開發(fā)基于ssm的校園服務(wù)系統(tǒng),本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
spring mvc中的@PathVariable獲得請求url中的動態(tài)參數(shù)
本文主要介紹了spring mvc中的@PathVariable獲得請求url中的動態(tài)參數(shù)的代碼。具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02
解決mybatis分頁插件PageHelper導(dǎo)致自定義攔截器失效
這篇文章主要為大家介紹了解決mybatis分頁插件PageHelper導(dǎo)致自定義攔截器失效方案示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08

