日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【微服务架构】SpringCloud之路由网关(zuul)

發布時間:2023/11/28 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【微服务架构】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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。