??在微服務(wù)架構(gòu)里,服務(wù)的粒度被進(jìn)一步細(xì)分邦泄,各個(gè)業(yè)務(wù)服務(wù)可以被獨(dú)立的設(shè)計(jì)删窒、開發(fā)、測(cè)試顺囊、部署和管理肌索。這時(shí),各個(gè)獨(dú)立部署單元可以用不同的開發(fā)測(cè)試團(tuán)隊(duì)維護(hù)特碳,可以使用不同的編程語(yǔ)言和技術(shù)平臺(tái)進(jìn)行設(shè)計(jì)诚亚,這就要求必須使用一種語(yǔ)言和平 臺(tái)無(wú)關(guān)的服務(wù)協(xié)議作為各個(gè)單元間的通訊方式晕换。
API 網(wǎng)關(guān)的定義
網(wǎng)關(guān)的角色是作為一個(gè) API 架構(gòu),用來(lái)保護(hù)亡电、增強(qiáng)和控制對(duì)于 API 服務(wù)的訪問(wèn)届巩。
API 網(wǎng)關(guān)是一個(gè)處于應(yīng)用程序或服務(wù)(提供 REST API 接口服務(wù))之前的系統(tǒng)硅瞧,用來(lái)管理授權(quán)份乒、訪問(wèn)控制和流量限制等,這樣 REST API 接口服務(wù)就被 API 網(wǎng)關(guān)保護(hù)起來(lái)腕唧,對(duì)所有的調(diào)用者透明或辖。因此,隱藏在 API 網(wǎng)關(guān)后面的業(yè)務(wù)系統(tǒng)就可以專注于創(chuàng)建和管理服務(wù)枣接,而不用去處理這些策略性的基礎(chǔ)設(shè)施颂暇。
Gateway是什么
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技術(shù)開發(fā)的網(wǎng)關(guān)但惶,Spring Cloud Gateway旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單而有效的統(tǒng)一的API路由管理方式耳鸯。Spring Cloud Gateway作為Spring Cloud生態(tài)系中的網(wǎng)關(guān),目標(biāo)是替代ZUUL膀曾,其不僅提供統(tǒng)一的路由方式县爬,并且基于Filter鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全添谊,監(jiān)控/埋點(diǎn)财喳,和限流等。
為什么用Gateway
Spring Cloud Gateway 可以看做是一個(gè) Zuul 1.x 的升級(jí)版和代替品斩狱,比 Zuul 2 更早的使用 Netty 實(shí)現(xiàn)異步 IO耳高,從而實(shí)現(xiàn)了一個(gè)簡(jiǎn)單、比 Zuul 1.x 更高效的所踊、與 Spring Cloud 緊密配合的 API 網(wǎng)關(guān)泌枪。
Spring Cloud Gateway 里明確的區(qū)分了 Router 和 Filter,并且一個(gè)很大的特點(diǎn)是內(nèi)置了非常多的開箱即用功能秕岛,并且都可以通過(guò) SpringBoot 配置或者手工編碼鏈?zhǔn)秸{(diào)用來(lái)使用碌燕。
比如內(nèi)置了 10 種 Router,使得我們可以直接配置一下就可以隨心所欲的根據(jù) Header瓣蛀、或者 Path陆蟆、或者 Host、或者 Query 來(lái)做路由惋增。
比如區(qū)分了一般的 Filter 和全局 Filter叠殷,內(nèi)置了 20 種 Filter 和 9 種全局 Filter,也都可以直接用诈皿。當(dāng)然自定義 Filter 也非常方便林束。
1像棘、在GitEgg-Cloud工程的子工程gitegg-gateway中引入Nacos和Spring Cloud Gateway的依賴
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
2、新建GitEggGatewayApplication.java
package com.gitegg.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class GitEggGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GitEggGatewayApplication.class,args);
}
}
3壶冒、新建bootstrap.yml配置文件
server:
port: 80
spring:
application:
name: gitegg-service-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
group: DEFAULT_GROUP
enabled: true
gateway:
discovery:
locator:
enabled: true
routes:
- id: gitegg-service-system
uri: lb://gitegg-service-system
predicates:
- Path=/gitegg-system/**
filters:
- StripPrefix=1
4缕题、在gitegg-cloud-system的SystemController.java添加測(cè)試方法:
@ApiOperation(value = "Gateway路由轉(zhuǎn)發(fā)測(cè)試")
@GetMapping(value = "gateway/forward")
public Result gatewayForward() {
return Result.success("gitegg-service-system測(cè)試數(shù)據(jù)");
}
5、啟動(dòng)gitegg-cloud-system和gitegg-gateway服務(wù)胖腾,在瀏覽器中訪問(wèn)gitegg-gateway的服務(wù)端口+ /gitegg-system/ + /system/gateway/forward烟零,可以看到頁(yè)面返回的數(shù)據(jù)是訪問(wèn)的gitegg-cloud-system方法
本章源碼在https://gitee.com/wmz1930/gitegg-cloud 和 https://gitee.com/wmz1930/gitegg-platform 的chapter-18分支。