【微服务架构】SpringCloud之路由网关(zuul)
什么是zuul
zuul 是netflix開源的一個API Gateway 服務器, 本質上是一個web servlet應用。
Zuul 在云平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架。Zuul 相當于是設備和 Netflix 流應用的 Web 網站后端所有請求的前門。
在微服務架構中,需要幾個關鍵的組件,服務注冊與發現、服務消費、負載均衡、斷路器、智能路由、配置管理等,由這幾個組件可以組建一個簡單的微服務架構,如下圖:
注意:A服務和B服務是可以相互調用的。并且配置服務也是注冊到服務注冊中心的。
客戶端的請求首先經過負載均衡(zuul、Ngnix),再到達服務網關(zuul集群),然后再到具體的服務,服務統一注冊到高可用的服務注冊中心集群,服務的所有的配置文件由配置服務管理(下一篇文章講述),配置服務的配置文件放在git倉庫,方便開發人員隨時改配置。
過濾器類型與請求生命周期
Zuul大部分功能都是通過過濾器來實現的。Zuul中定義了四種標準過濾器類型,這些過濾器類型對應于請求的典型生命周期。
(1) PRE:這種過濾器在請求被路由之前調用。我們可利用這種過濾器實現身份驗證、在集群中選擇請求的微服務、記錄調試信息等。
(2) ROUTING:這種過濾器將請求路由到微服務。這種過濾器用于構建發送給微服務的請求,并使用Apache HttpClient或Netfilx Ribbon請求微服務。
(3) POST:這種過濾器在路由到微服務以后執行。這種過濾器可用來為響應添加標準的HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。
(4) ERROR:在其他階段發生錯誤時執行該過濾器。
除了默認的過濾器類型,Zuul還允許我們創建自定義的過濾器類型。例如,我們可以定制一種STATIC類型的過濾器,直接在Zuul中生成響應,而不將請求轉發到后端的微服務。
Zuul請求的生命周期如下圖:
先要啟動EureKaserver工程(注冊中心)和SpringCloud-Service工程(服務生產者)
可以參考:https://blog.csdn.net/u012081441/article/details/80708060
編寫Zuul過濾器
理解過濾器類型和請求生命周期后,我們來編寫一個Zuul過濾器。編寫Zuul的過濾器非常簡單,我們只需繼承抽象類ZuulFilter,然后實現幾個抽象方法就可以了。
pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.fit</groupId><artifactId>SpringCloud-Zuul</artifactId><version>0.0.1-SNAPSHOT</version><!-- SpringBoot父類依賴引用 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version><relativePath /></parent><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.RC1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories>
</project>
application.yml文件
eureka:client:serviceUrl:defaultZone: http://localhost:8888/eureka/
server:port: 8769
spring:application:name: SpringCloud-Zuul
zuul:routes:api-a:path: /SpringCloud-Service/**service-id: SpringCloud-Service
TokenFilter.java文件
@Component
public class TokenFilter extends ZuulFilter {private static Logger log = LoggerFactory.getLogger(TokenFilter.class);@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 0;}public boolean shouldFilter() {return true;}public Object run() {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));Object accessToken = request.getParameter("token");if (accessToken != null) {return 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;}
}
由代碼可知,自定義的Zuul Filter需實現以下幾個方法:
filterType:返回過濾器的類型。有pre、route、post、error等幾種取值,分別對應上文的幾種過濾器。
filterOrder:返回一個int值來指定過濾器的執行順序,不同的過濾器允許返回相同的數字。
shouldFilter:返回一個boolean值來判斷該過濾器是否要執行,true表示執行,false表示不執行。
run:過濾器的具體邏輯。本例中,我們讓它打印了請求的HTTP方法以及請求的地址。
ZuulApp.java文件
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ZuulApp {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSpringApplication.run(ZuulApp.class, args);}
}
源碼下載
總結
以上是生活随笔為你收集整理的【微服务架构】SpringCloud之路由网关(zuul)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【微服务架构】SpringCloud之F
- 下一篇: 【微服务架构】SpringCloud之断