javascript
API网关—Spring Cloud Zuul
原文作者:思想者
原文地址:一起學習使用Spring Cloud Netflix之Zuul
?
前言
Zuul在Spring Cloud 體系中扮演著統一網關的角色,負責與外部交互。用戶可以通過不同的URL特征來訪問不同的后端服務,類似于Nginx代理的效果。Zuul與Eureka結合使用,可以根據服務名來訪問后端的服務,對于Eureka而言,Zuul也是一個Eureka Client。系統的信息流入流出都需要經過Zuul,在Zuul中,我們可以統一監控流量,統一安全認證,統一報文組裝等等。本文來源于我的博客網站:http://51think.net
1、Zuul架構
從圖中可以看到,之前博客中提到的srping-cloud-ribbon-client應用以及spring-cloud-eureka-myservice應用都有參與。這兩個應用和spring-cloud-zuul都屬于Eureka的client,因此都需要在Eureka中進行注冊,否則無法相互調用。
2、創建Zuul應用
1)IDEA創建module,選擇Zuul?
2)pom文件中添加web組件以及Eureka組件
<?xml version="1.0" encoding="UTF-8"?> <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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>spring-cloud-zuul</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-cloud-zuul</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.SR2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</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>${spring-cloud.version}</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></project>3)applicaton類加上注解@EnableZuulProxy和@EnableEurekaClient,開啟Zuul功能
@EnableZuulProxy @EnableEurekaClient @SpringBootApplication public class SpringCloudZuulApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudZuulApplication.class, args);}}4)修改application.yml文件
eureka:client:serviceUrl:defaultZone: http://localhost:8010/eureka/ server:port: 8030 spring:application:name: cloudZuul zuul:routes:ribbonClient:path: /ribbonClient/**serviceId: ribbonClient其中 path: /ribbonClient/**表示URL中如果帶有/ribbonClient/將被代理到serviceId為ribbonClient的服務中去。
3、啟動觀察
啟動spring-cloud-zuul之后,訪問Eureka面板,觀察cloudZuul是否在服務列表中。
在之前的ribbon博客中,我們的訪問地址是http://localhost:8020/sayHello?say=helloWorld,現在我們通過Zuul來訪問spring-cloud-ribbon-client應用,在瀏覽器中使用此地址進行訪問:http://localhost:8030/ribbonClient/sayHello?say=helloWorld,可以發現訪問效果和直接訪問http://localhost:8020/sayHello?say=helloWorld的效果是一致的。
4、使用服務過濾
服務過濾就是一個filter,它可以在指定事件中(路由前,路由中,路由后等)執行相關操作。Zuul中提供了一個filter接口,實現它即可。
@Component public class TokenFilter extends ZuulFilter {@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();Object accessToken = request.getParameter("token");if(accessToken == null) {ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(401);try {ctx.getResponse().getWriter().write("token is not exist!");}catch (Exception e){}return null;}return null;} }這段代碼表示,如果請求中沒有token信息,就會報錯“token is not exist!”。關注filterType字段,它代表過濾器的類型,具體如下:?
- pre:路由之前會調用?
- route:路由轉發的時候會調用?
- error:處理請求時發生錯誤時會調用?
- post:運行結束被調用
我們再次重啟一下spring-cloud-zuul,瀏覽器再次訪問http://localhost:8030/ribbonClient/sayHello?say=helloWorld,會發現如下錯誤提示:
加上token參數之后,即可正常訪問:
總結
以上是生活随笔為你收集整理的API网关—Spring Cloud Zuul的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创建型模式—单例模式
- 下一篇: Java数据结构—基本数据类型