Spring Cloud 7:Gateway

Zuul 網關

Zuul 是 Netfilx 開源的一個 API Gateway 服務器,本質是一個 Web Servlet 應用。其在微服務架構體系中提供動態路由、監控、彈性、安全等邊緣服務。

使用 Zuul 作為網關,其主要原因有以下幾點:

1、Zuul、Ribbon 以及 Consul 客戶端結合使用,能夠輕松實現智能路由、負載均衡功能;
2、在網關層統一對外提供 API 接口,保護了實際提供接口的微服務實現細節,同時也方便測試人員對微服務接口進行測試;
3、在網關層能夠統一添加身份認證、鑒權等功能,防止對微服務 API 接口的非法調用;
4、在網關層可以方便地對訪問請求進行記錄,實現監控相關功能;
5、在網關層實現流量監控,在流量比較大時,方便對服務實施降級。

Zuul 工作原理

Zuul 的核心是一系列的 Filters,其作用可以類比 Servlet 框架的 Filter,或者 AOP。Zuul 中定義了四種標準過濾器類型,分別是 pre、post、routing 以及 error 過濾器。

1、pre 過濾器:在請求路由到具體微服務之前執行,其主要用于身份驗證、鑒權等功能;
2、routing 過濾器:其主要功能是將請求路由到具體的微服務實例;
3、post 過濾器:在對具體微服務調用之后執行,其主要用于收集統計信息、指標以及對請求響應數據進行處理等;
4、error 過濾器:在以上三種過濾器執行出錯時執行。

yang-gateway

pom.xml
    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.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>Greenwich.M3</spring-cloud.version></properties><dependencies><!--Actuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--Consul--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency><!--Zuul--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</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>
View Code
bootstrap.yml
server:port: 1003
spring:application:name: yang-gatewaycloud:consul:host: 127.0.0.1port: 8500discovery:register: truehealthCheckPath: /server/consul/healthhealthCheckInterval: 10sinstance-id: ${spring.application.name}
zuul:routes:yang-service:path: /**serviceId: yang-diver
Application.java
@SpringBootApplication
@EnableZuulProxy
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}
訪問路徑:http://localhost:1003/user/list

此時Gateway訪問到了yang-diver服務的內容了。

路由配置

傳統的路由配置

在不依賴于服務發現機制的情況下,通過在配置文件中具體指定每個路由表達式與服務實例的映射關系來實現API網關對外部請求的路由。

單實例配置

通過一組zuul.routes.<route>.path與zuul.routes.<route>.url參數對的方式配置。

server:port: 1003
spring:application:name: yang-gateway
zuul:routes:yang-service:path: /yang-diver/**url: http://localhost:1002/

凡是路徑為:http://localhost:1003/yang-diver/**?的請求,都會轉發請求到http://localhost:1002/**?地址

多實例配置

通過一組zuul.routes.<route>.path與zuul.routes.<route>.serviceId參數對的方式配置

zuul:routes:yang-service:path: /yang-diver/**serviceId: yang-diverribbon:eureka:enabled: false # 沒有配置服務治理(Eureka)就需要關閉,否則會找不到服務yang-service:ribbon:# 為serviceId去指定具體的服務實例地址listOfServers: http://localhost:1001/,http://localhost:1002/ 

此時,凡是路徑為:http://localhost:1003/yang-diver/**?的請求,都會轉發請求到http://localhost:1001/**?和http://localhost:1002/**?地址

服務路由配置

整合服務治理后,只需要提供一組zuul.routes.<route>.path與zuul.routes.<route>.serviceId參數對的配置即可。

server:port: 1003
spring:application:name: yang-gatewaycloud:consul:host: 127.0.0.1port: 8500discovery:register: truehealthCheckPath: /server/consul/healthhealthCheckInterval: 10sinstance-id: ${spring.application.name}
zuul:routes:yang-service:path: /**serviceId: yang-diver

還可以通過zuul.routes.<serviceId>=<path>,直接進行路由轉。,其中<serviceId>用來指定路由的具體服務名,<path>用來配置匹配的請求表達式。

zuul:routes:yang-diver:path: /**
#      serviceId: yang-diver

實際上,服務注冊中心已經維護了serverId與實例地址的映射關系。當Gateway注冊到服務注冊中心后,就能從注冊中心獲取所有服務以及它們的實例清單。

服務網關之過濾器

Spring Cloud Zuul的過濾器的作用。

以權限控制為例。每個系統并不會將所有的微服務接口都開放出去。為了實現對客戶端請求的安全校驗和權限控制,有以下幾點方案:
1、為每個微服務應用都實現一套用于校驗簽名和鑒別權限的過濾器或攔截器。【權限的實現方式大同小異,開發繁瑣、維護困難,不推薦】
2、實現鑒權服務,直接在微服務應用中通過調用鑒權服務來實現校驗。【分離不徹底】
3、通過前置的網關服務來完成這些非業務性質的校驗,即通過在網關中完成校驗和過濾。【推薦】

AccessFilter
```
/*** 系統訪問 Filter** @Author YangXuyue* @Date 2018/11/28 23:34*/
@Component("accessFilter")
public class AccessFilter extends ZuulFilter {private static final Logger LOGGER = LoggerFactory.getLogger(AccessFilter.class);/*** 過濾器的類型,它決定過濾器在請求的哪個生命周期中執行。* 這里定義為pre,代表會在請求被路由之前執行** @return* @Author YangXuyue* @Date 2018/11/28 23:39*/@Overridepublic String filterType() {return "pre";}/*** 過濾器的執行順序。當請求在一個階段中存在多個過濾器時,需要根據該方法返回的值來依次執行** @return* @Author YangXuyue* @Date 2018/11/28 23:39*/@Overridepublic int filterOrder() {return 0;}/*** 判斷該過濾器是否需要被執行** @return* @Author YangXuyue* @Date 2018/11/28 23:39*/@Overridepublic boolean shouldFilter() {return true;}/*** 過濾器的具體邏輯* 實現在請求被路由之前檢查HttpServletRequest中是否有accessToken參數* 若有就進行路由,若沒有就拒絕訪問,返回401 Unauthorized錯誤。** @return* @throws ZuulException* @Author YangXuyue* @Date 2018/11/28 23:37*/@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();LOGGER.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());Object accessToken = request.getParameter("accessToken");if (accessToken == null) {LOGGER.warn("access token is empty");ctx.setSendZuulResponse(false);// 未授權ctx.setResponseStatusCode(401);return null;}LOGGER.info("access token ok");return null;}
}

此時訪問:http://localhost:1003/user/list出現401未授權的問題

?

如果訪問:http://localhost:1003/user/list?accessToken=true請求就能成功被轉發。

?

轉載于:https://www.cnblogs.com/yang21/p/10030043.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395905.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395905.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395905.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nodejs開發工程師前景_Google NodeJS運行時團隊的工程師Matt Loring訪談

nodejs開發工程師前景by Sameer Khoja通過Sameer Khoja Google NodeJS運行時團隊的工程師Matt Loring訪談 (An Interview with Matt Loring, an engineer on Google’s NodeJS Runtime team) I had the pleasure of interviewing Matt Loring (Cornell class of 2015) who wor…

計算機EI期刊2020,2020年Ei Compendex收錄的中國期刊目錄( JANUARY 1, 2020 )

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓2020年Ei Compendex收錄的中國期刊目錄更新了&#xff0c;合計222本。本文根據最新 JANUARY 1, 2020 更新《2020年Ei Compendex收錄出版物期刊目錄》整理&#xff0c;需要提醒&#xff0c;目錄EI是不定時更新的&#xff0c;但根據小…

mysql聯合索引順序調整_MySQL 關于聯合索引的字段順序規則討論

聯合索引的順序&#xff0c;難道不是哪個查詢條件最多用就放在前面的嗎&#xff1f;比如商品有三個分類A&#xff0c;B&#xff0c;C&#xff0c;類似「界門綱目科屬種」那樣&#xff0c;越左類別越大。還有一個是商品來源D&#xff0c;不一定會用于查詢條件中。舉個例子&#…

python基礎-第三篇-函數編程

基本數據類型之set set是無序不允許重復的集合set創建&#xff1a;s set&#xff08;&#xff09; 創建空集合 s {11,22,33}轉換s set&#xff08;可迭代數據&#xff09;li [11,22,33,44] s set(li) print(s) #結果為{33, 11, 44, 22} 集合元素的添加與清空se {11,22,…

10個 Linux/Unix下 Bash 和 KSH shell 的作業控制實例

Linux 和 Unix 屬于多任務的操作系統&#xff0c;也就是說一個系統在同一時間段內能運行多重任務(進程)。在這個新的博客系列&#xff0c;我將會列出相關的 Linux 和 Unix 作業&#xff08;job&#xff09;控制的命令&#xff0c;你可以通過這些命令在 Bash 或 Korn 還有 POSIX…

微信小程序 - 骨架屏

骨架屏 - “與其等待網絡加載&#xff0c;不如提前給點暗示” 注&#xff1a;不適用復雜交互效果 演示 示例解釋以及使用全在index.wxml中&#xff0c;觀看需了解組件使用. 示例下載&#xff1a;微信小程序-骨架屏演示 轉載于:https://www.cnblogs.com/cisum/p/10032448.html

圖解機器學習 github_使用Github和Cloudflare建立網站的圖解指南

圖解機器學習 githubby Karan Thakkar由Karan Thakkar 使用GitHub和Cloudflare建立網站的插圖指南 (An illustrated guide to setting up your website using GitHub and Cloudflare) You should read this if…如果...&#xff0c;您應該閱讀此內容 You want to setup custo…

ajax拼接顯示不同樣式,Ajax重點整理

Ajax工作流程Ajax:在不刷新頁面的情況下向服務器請求數據1.創建XMLHttpRequest對象(俗稱小黃人)var xhr new XMLHttpRequest();XMLHttpRequest &#xff1a; http請求對象&#xff0c;負責實現ajax技術2.設置請求xhr.open(get, url);url:服務器地址3.發送請求xhr.send();4.注冊…

java與mysql的交互_java與數據庫交互常用到的一些方法

下面我整理了一下java中常用的幾個與數據庫交互的常用方法&#xff0c;僅供參考&#xff1a;1.執行SQL(dao層的實現類中)(1)SQL查詢&#xff1a;//import org.hibernate.Query;//import org.hibernate.Session;/*** 通過名稱查找id*parampsname*returnid*/OverridepublicString…

xbmc電腦版本和手機版本學習教程

XBMC改名為Kodi了&#xff0c;IOS系統&#xff0c;Cydia源地址也同樣發生了變化&#xff0c;新的源是&#xff1a;http://mirrors.kodi.tv/apt/ios/先了解一下幾點知識&#xff1a; 教程中的各項操作&#xff0c;默認起始點都是“主界面”或“各分類菜單&#xff08;視頻、音樂…

線程管理(七)守護線程的創建和運行

聲明&#xff1a;本文是《 Java 7 Concurrency Cookbook 》的第一章&#xff0c; 作者&#xff1a; Javier Fernndez Gonzlez 譯者&#xff1a;鄭玉婷 校對&#xff1a;方騰飛 守護線程的創建和運行 Java有一種特別的線程叫做守護線程。這種線程的優先級非常低&#xff0c;通常…

vue2中的keep-alive使用總結及注意事項

問題總結;最近在寫vue移動端的項目的時候,當我切換菜單,再切換換回去的時候,發現頁面出現閃動的效果,其原因是因為切換回去之后,頁面重新渲染了;為了解決這一問題:查閱資料,只需要在 入口文件 App.vue 的router-view外層包裹一個keep-active標簽,表示該組件被保存在內存中,不需…

grove 套件_如何通過使用Andy Grove的High Leverage Activities加快發展?

grove 套件by Guido Schmitz由Guido Schmitz 如何通過使用Andy Grove的High Leverage Activities加快發展&#xff1f; (How to speed up your development by using Andy Grove’s High Leverage Activities ?) Youre constantly building on new features, fixing new bugs…

ajax php 觀察者模式,JavaScript觀察者模式定義和dom事件實例詳解

觀察者模式(發布-訂閱模式)&#xff1a;其定義對象間一種一對多的依賴關系&#xff0c;當一個對象的狀態發生改變時&#xff0c;所有依賴于它的對象都將得到通知。在JavaScript中&#xff0c;一般使用事件模型來替代傳統的觀察者模式。好處&#xff1a;(1)可廣泛應用于異步編程…

python中代碼段的標志是什么車_請問這段Python代碼是什么意思?

ord(p) - ord(a)這個意思是以 a 為序號0&#xff0c;計算字符p的序號。在ASCII字符集中&#xff0c;小寫字母a-z是連續排列的&#xff0c;因此如果a是0的話&#xff0c;那么b就是1&#xff0c;c就是2……以此類推。ord(p) - ord(a) 3前面一段我們解釋過了&#xff0c;那么這一…

servlet和jsp頁面過濾器Filter的作用及配置

剛剛有個朋友問我&#xff0c;Servlet的過濾器有什么作用&#xff1f; 現在發個帖子說明一下&#xff0c; 過濾器是一個對象&#xff0c;可以傳輸請求或修改響應。它可以在請求到達Servlet/JSP之前對其進行預處理&#xff0c;而且能夠在響應離開Servlet /JSP之后對其…

tar命令速查

tar -c: 建立壓縮檔案-x&#xff1a;解壓-t&#xff1a;查看內容-r&#xff1a;向壓縮歸檔文件末尾追加文件-u&#xff1a;更新原壓縮包中的文件 這五個是獨立的命令&#xff0c;壓縮解壓都要用到其中一個&#xff0c;可以和別的命令連用但只能用其中一個。下面的參數是根據需要…

附005.Docker Compose文件詳解

一 Docker Compose文件簡介 compose文件使用yml格式&#xff0c;主要分為了四個區域&#xff1a;version&#xff1a;用于指定當前docker-compose.yml語法遵循哪個版本services&#xff1a;服務&#xff0c;在它下面可以定義應用需要的一些服務&#xff0c;每個服務都有自己的名…

如何使用TensorFlow構建簡單的圖像識別系統(第2部分)

by Wolfgang Beyer沃爾夫岡拜爾(Wolfgang Beyer) 如何使用TensorFlow構建簡單的圖像識別系統(第2部分) (How to Build a Simple Image Recognition System with TensorFlow (Part 2)) This is the second part of my introduction to building an image recognition system wi…

網站 服務器 用sqlite,sqlite服務器數據庫

sqlite服務器數據庫 內容精選換一換簡要介紹SQLite是一款輕量級的關系型數據庫&#xff0c;它的運算速度非常快&#xff0c;占用資源很少&#xff0c;不僅支持標準的SQL語法&#xff0c;還遵循了數據庫的ACID事務。編寫語言&#xff1a;C一句話概述&#xff1a;輕量級的關系型數…