Spring Cloud構建微服務架構 服務網關(基礎)【Dalston版】
通過之前幾篇Spring Cloud中幾個核心組件的介紹,我們已經可以構建一個簡略的(不夠完善)微服務架構了。比如下圖所示:
我們使用Spring Cloud Netflix中的Eureka實現了服務註冊中心以及服務註冊與發現;而服務間通過Ribbon或Feign實現服務的消費以及均衡負載;通過Spring Cloud Config實現了應用多環境的外部化配置以及版本管理。為了使得服務集群更為健壯,使用Hystrix的融斷機制來避免在微服務架構中個別服務出現異常時引起的故障蔓延。
在該架構中,我們的服務集群包含:內部服務Service A和Service B,他們都會註冊與訂閱服務至Eureka Server,而Open Service是一個對外的服務,通過均衡負載公開至服務調用方。本文我們把焦點聚集在對外服務這塊,這樣的實現是否合理,或者是否有更好的實現方式呢?
先來說說這樣架構需要做的一些事兒以及存在的不足:
- 首先,破壞了服務無狀態特點。為了保證對外服務的安全性,我們需要實現對服務訪問的權限控制,而開放服務的權限控制機制將會貫穿並汙染整個開放服務的業務邏輯,這會帶來的最直接問題是,破壞了服務集群中REST API無狀態的特點。從具體開發和測試的角度來說,在工作中除了要考慮實際的業務邏輯之外,還需要額外可續對接口訪問的控制處理。
- 其次,無法直接復用既有接口。當我們需要對一個即有的集群內訪問接口,實現外部服務訪問時,我們不得不通過在原有接口上增加校驗邏輯,或增加一個代理調用來實現權限控制,無法直接復用原有的接口。
面對類似上面的問題,我們要如何解決呢?下面進入本文的正題:服務網關!
為了解決上面這些問題,我們需要將權限控制這樣的東西從我們的服務單元中抽離出去,而最適合這些邏輯的地方就是處於對外訪問最前端的地方,我們需要一個更強大一些的均衡負載器,它就是本文將來介紹的:服務網關。
服務網關是微服務架構中一個不可或缺的部分。通過服務網關統一向外系統提供REST API的過程中,除了具備服務路由、均衡負載功能之外,它還具備了權限控制等功能。Spring Cloud Netflix中的Zuul就擔任了這樣的一個角色,為微服務架構提供了前門保護的作用,同時將權限控制這些較重的非業務邏輯內容遷移到服務路由層面,使得服務集群主體能夠具備更高的可復用性和可測試性。
下面我們通過實例例子來使用一下Zuul來作為服務的路有功能。
準備工作
在構建服務網關之前,我們先準備一下網關內部的微服務,可以直接使用前幾篇編寫的內容,比如:
- eureka-client
- eureka-consumer
由於我們用了基於eureka的服務,所以我們可以使用我的公益註冊中心:http://eureka.didispace.com/
這些服務可從我的倉庫中直接獲取:
- Github:https://github.com/dyc87112/SpringCloud-Learning
- 碼雲:https://gitee.com/didispace/SpringCloud-Learning
在啟動了eureka-client
和eureka-consumer
的實例之後,所有的準備工作就以就緒,下面我們來試試使用Spring Cloud Zuul來實現服務網關的功能。
構建服務網關
使用Spring Cloud Zuul來構建服務網關的基礎步驟非常簡單,只需要下面幾步:
- 創建一個基礎的Spring Boot項目,命名為:
api-gateway
。並在pom.xml
中引入依賴:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> |
- 創建應用主類,並使用
@EnableZuulProxy
註解開啟Zuul的功能。
public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } } |
- 創建配置文件
application.yaml
,並加入服務名、端口號、eureka註冊中心的地址:
spring: application: name: api-gateway server: port: 1101 eureka: client: serviceUrl: defaultZone: http://eureka.didispace.com/eureka/ |
到這裏,一個基於Spring Cloud Zuul服務網關就已經構建完畢。啟動該應用,一個默認的服務網關就構建完畢了。由於Spring Cloud Zuul在整合了Eureka之後,具備默認的服務路由功能,即:當我們這裏構建的api-gateway
應用啟動並註冊到eureka之後,服務網關會發現上面我們啟動的兩個服務eureka-client
和eureka-consumer
,這時候Zuul就會創建兩個路由規則。每個路由規則都包含兩部分,一部分是外部請求的匹配規則,另一部分是路由的服務ID。針對當前示例的情況,Zuul會創建下面的兩個路由規則:
- 轉發到
eureka-client
服務的請求規則為:/eureka-client/**
- 轉發到
eureka-consumer
服務的請求規則為:/eureka-consumer/**
最後,我們可以通過訪問1101
端口的服務網關來驗證上述路由的正確性:
- 比如訪問:http://localhost:1101/eureka-client/dc ,該請求將最終被路由到
eureka-client
的/dc
接口上。
本篇小結
本篇,我們介紹了構建服務網關的基礎。通過上面的構建內容,我們已經為所有內部服務提供了一個統一的對外入口,同時對於服務的路由都是自動創建了,減少了傳統方式大量的運維配置工作。
但是,本篇只是入門小文,更多關於Spring Cloud Zuul的配置和使用將在後續陸續介紹。
原文由程序猿DD-翟永超創作,原文地址:http://blog.didispace.com/spring-cloud-starter-dalston-6-1/
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://www.cnblogs.com/captainbed
Spring Cloud構建微服務架構 服務網關(基礎)【Dalston版】