Spring-Cloud系列第7篇:spring-cloud-zuul
前面的文章我們介紹了,Eureka用於服務的註冊於發現,Feign支援服務的呼叫以及均衡負載,Hystrix處理服務的熔斷防止故障擴散,Spring Cloud Config服務叢集配置中心,似乎一個微服務框架已經完成了。
我們還是少考慮了一個問題,外部的應用如何來訪問內部各種各樣的微服務呢?在微服務架構中,後端服務往往不直接開放給呼叫端,而是通過一個API閘道器根據請求的url,路由到相應的服務。當新增API閘道器後,在第三方呼叫端和服務提供方之間就建立了一面牆,這面牆直接與呼叫方通訊進行許可權控制,後將請求均衡分發給後臺服務端。
為什麼需要API Gateway
1、簡化客戶端呼叫複雜度
在微服務架構模式下後端服務的例項數一般是動態的,對於客戶端而言很難發現動態改變的服務例項的訪問地址資訊。因此在基於微服務的專案中為了簡化前端的呼叫邏輯,通常會引入API Gateway作為輕量級閘道器,同時API Gateway中也會實現相關的認證邏輯從而簡化內部服務之間相互呼叫的複雜度。
2、資料裁剪以及聚合
通常而言不同的客戶端對於顯示時對於資料的需求是不一致的,比如手機端或者Web端又或者在低延遲的網路環境或者高延遲的網路環境。
因此為了優化客戶端的使用體驗,API Gateway可以對通用性的響應資料進行裁剪以適應不同客戶端的使用需求。同時還可以將多個API呼叫邏輯進行聚合,從而減少客戶端的請求數,優化客戶端使用者體驗
3、多渠道支援
當然我們還可以針對不同的渠道和客戶端提供不同的API Gateway,對於該模式的使用由另外一個大家熟知的方式叫Backend for front-end, 在Backend for front-end模式當中,我們可以針對不同的客戶端分別建立其BFF,進一步瞭解BFF可以參考這篇文章:Pattern: Backends For Frontends
4、遺留系統的微服務化改造
對於系統系統而言進行微服務改造通常是由於原有的系統存在或多或少的問題,比如技術債務,程式碼質量,可維護性,可擴充套件性等等。API Gateway的模式同樣適用於這一類遺留系統的改造,通過微服務化的改造逐步實現對原有系統中的問題的修復,從而提升對於原有業務響應力的提升。通過引入抽象層,逐步使用新的實現替換舊的實現。
Spring Cloud Zuul
在Spring Cloud體系中, Spring Cloud Zuul就是提供負載均衡、反向代理、許可權認證的一個API gateway。
Spring Cloud Zuul路由是微服務架構的不可或缺的一部分,提供動態路由,監控,彈性,安全等的邊緣服務。Zuul是Netflix出品的一個基於JVM路由和服務端的負載均衡器。
簡單使用
依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
配置檔案:
server:
port: 8088
spring:
application:
name: gateway-service-zuul
zuul:
routes:
name1:
path: /test/*
url: http://www.xjtushilei.com/
將所有 http://localhost:8088/test
開頭的服務,重定向到我的部落格。
執行:
@SpringBootApplication
@EnableEurekaClient //如果需要註冊倒eureka服務中心的話,啟用這個
@EnableZuulProxy
public class SpringCloudZuulApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudZuulApplication.class, args);
}
}
測試
訪問 http://localhost:8088/test/312
得到如下圖
可以看出重定向成功了,為什麼css等不見了,因為沒有給他們配置轉發路由。
服務呼叫
application.yml 配置檔案:
server:
port: 8088
spring:
application:
name: gateway-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
這裡有一個bug,因為我喜歡採用啟用profile的方式來進行開發,但是這次真的是遇到了好一個超級bug。
因為不能在 application-dev.yml 這樣的檔案裡定義服務中心的Zone。有點不人性化。因為開發和最終肯定不是在一個Zone裡的,所以這裡應該可以改進的。
隨便啟動一個之前的服務,有restapi即可
然後測試:
訪問 http://localhost:8088/eureka-client-1/hi
和 http://localhost:8084/hi
返回的結果是一樣的
閘道器的預設路由規則
spring cloud zuul已經幫我們做了預設閘道器配置。預設情況下,Zuul會代理所有註冊到Eureka Server的微服務,並且Zuul的路由規則如下:http://ZUUL_HOST:ZUUL_PORT/微服務在Eureka上的serviceId/**會被轉發到serviceId對應的微服務。
到此zuul的基本使用我們就介紹完了。關於zuul更高階使用,我們下篇再來介紹。
示例原始碼
支援
如果你喜歡~ 給個星
相關推薦
Spring-Cloud系列第7篇:spring-cloud-zuul
前面的文章我們介紹了,Eureka用於服務的註冊於發現,Feign支援服務的呼叫以及均衡負載,Hystrix處理服務的熔斷防止故障擴散,Spring Cloud Config服務叢集配置中心,似乎一個微服務框架已經完成了。 我們還是少考慮了一個問題,外部的
Spring-Cloud系列第6篇:spring-cloud-bus
介紹 在之前的Spring Cloud Config的介紹中,我們還留了一個懸念:如何實現對配置資訊的實時更新。 通過/refresh介面和Git倉庫的Web Hook來實現Git倉庫中的內容修改觸發應用程式的屬性更新這是一個好的方法,但是我沒講,因
Spring Cloud實戰 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT實現微服務統一認證授權
## **一. 前言** 本篇實戰案例基於 [youlai-mall](https://github.com/hxrui/youlai-mall) 專案。專案使用的是當前主流和最新版本的技術和解決方案,自己不會太多華麗的言辭去描述,只希望能勾起大家對程式設計的一點喜歡。所以有興趣的朋友可以進入 [gith
Spring Cloud實戰 | 第九篇:Spring Cloud整合Spring Security OAuth2認證伺服器統一認證自定義異常處理
[本文完整程式碼下載點選](https://github.com/hxrui/youlai-mall.git) # 一. 前言 相信瞭解過我或者看過我之前的系列文章應該多少知道點我寫這些文章包括建立 [有來商城youlai-mall](https://github.com/hxrui/youlai
Spring Cloud實戰 | 第十篇 :Spring Cloud + Seata 1.4.1 + Nacos1.4.0 整合實現微服務架構中逃不掉的話題分散式事務
Seata分散式事務線上體驗地址: [www.youlai.store](http://www.youlai.store) ![](https://i.loli.net/2021/01/14/ACcKBaGte5s7Wy9.png) 本篇完整原始碼地址:https://github.com/hxrui/y
Mysql高手系列 - 第7篇:玩轉select條件查詢,避免踩坑
這是Mysql系列第7篇。 環境:mysql5.7.25,cmd命令中進行演示。 電商中:我們想檢視某個使用者所有的訂單,或者想檢視某個使用者在某個時間段內所有的訂單,此時我們需要對訂單表資料進行篩選,按照使用者、時間進行過濾,得到我們期望的結果。 此時我們需要使用條件查詢來對指定表進行操作,我們需要了解sq
Java9系列第7篇:Java.util.Optional優化與增強
![](https://img2020.cnblogs.com/other/1815316/202010/1815316-20201020065916157-395982535.png) 我計劃在後續的一段時間內,寫一系列關於java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心
Spring Cloud系列教程 | 第十篇:Spring Cloud Config Server和Spring Cloud Bus以及Kafka和資料庫動態重新整理配置
推薦 Spring Cloud 視訊: Spring Cloud Config Server和Spring Cloud Bus以及Kafka和資料庫動態重新整理配置 Spring cloud config server如果不結合Spring cloud
Spring Cloud系列教程 | 第六篇:Spring Cloud Zuul作為API閘道器實現請求路由轉發教程
推薦 Spring Cloud 視訊: Spring Cloud Zuul作為API閘道器實現請求路由轉發教程 當我們的架構實現前後端分離以後,前端和後端之間互動就是通過API閘道器進行,API閘道器兩個職責: 1.設計上的適配層,或稱Facade模
Spring Cloud系列教程 | 第一篇:微服務架構演進
架構的演變過程: 單體架構——>垂直架構——>soa面向服務架構——>微服務架構 我們為什麼要使用Spring Cloud? 單體架構 在網站開發的前期,專案面臨的流量相對較少,單一應用可以實現我們所需要的功能,從而減少開發、部署和維護的難度。
Spring Cloud 第六篇:spring cloud 整合 配置檔案以及 mybatis
在上幾篇 專案的基礎上來修改服務程式碼。 首先修改,service-hi 專案(服務提供方),pom.xml檔案如下 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave
跟我學SpringCloud | 第六篇:Spring Cloud Config Github配置中心
SpringCloud系列教程 | 第六篇:Spring Cloud Config Github配置中心 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 隨著分散式專案越來越大,勤勞的程式猿們會開始面
跟我學SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh
SpringCloud系列教程 | 第七篇:Spring Cloud Config 配置中心高可用和refresh Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 1. 引言 上一篇我們聊了Sprin
跟我學SpringCloud | 第八篇:Spring Cloud Bus 訊息匯流排
SpringCloud系列教程 | 第八篇:Spring Cloud Bus 訊息匯流排 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 前面兩篇文章我們聊了Spring Cloud Config配置
跟我學SpringCloud | 第十三篇:Spring Cloud Gateway服務化和過濾器
SpringCloud系列教程 | 第十三篇:Spring Cloud Gateway服務化和過濾器 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 上一篇文章服務閘道器 Spring Cloud G
RabbitMQ第四篇:Spring集成RabbitMQ
led ase don 才會 catch rabl try edt .get 前面幾篇講解了如何使用rabbitMq,這一篇主要講解spring集成rabbitmq。 首先引入配置文件org.springframework.amqp,如下 &l
SpringBoot自學教程 | 第四篇:Spring Boot整合mybatis
整合 com 字段 apach param pack image ice rac 引入依賴 1:在pom文件引入mybatis-spring-boot-starter的依賴: 1 <dependency> 2 <groupId>
第九篇:Spring的applicationContext.xml配置總結
在前面的一篇日誌中,記錄了web.xml配置啟動的順序,web啟動到監聽器ContextLoaderListener時,開始載入spring的配置檔案applicationContext.xml(通常就叫這個名字),在查詢大量資料之後決心將該檔案詳細的配置說明和講解記錄下來,以供查閱,加深原理的理解。&nbs
spring cloud連載第三篇之Spring Cloud Netflix
1. Service Discovery: Eureka Server(服務發現:eureka伺服器) 1.1 依賴 1 <dependency> 2 <groupId>org.springframework.cloud</groupI
第九篇:Spring Boot整合RabbitMQ
RabbitMQ是一個開源的訊息代理和佇列伺服器,用來通過普通協議在完全不同的應用之間共享資料,或者簡單地將作業佇列以便讓分散式伺服器進行處理。訊息佇列使用訊息將應用程式連線起來,這些訊息通過像RabbitMQ這樣的訊息代理伺服器在應用程式之間路由。這篇文章將帶你瞭解怎麼整合Rabbit