Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
上篇:Feign远程调用组件
基本概念
网关的核心功能特性:
请求路由
权限控制
限流
架构图:
权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。
构建服务
- 新建module m-cloud-gateway-9002
- 导入依赖
<!--eureka client 客户端依赖引入-->
<!--spring boot ⽗启动器依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--GateWay ⽹关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--引⼊webflux-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!--⽇志依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<!--测试依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--lombok⼯具-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<!--引⼊Jaxb,开始-->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.2.10-b140310.1920</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!--引⼊Jaxb,结束-->
<!-- Actuator可以帮助你监控和管理Spring Boot应⽤-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<!--spring cloud依赖版本管理-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!--编译插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<!--打包插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class McloudGateWay9002 {
public static void main(String[] args) {
SpringApplication.run(McloudGateWay9002.class, args);
}
}
- 配置文件application.yml
server:
port: 9002
spring:
application:
name: m-cloud-eureka-server
#注册发现
eureka:
client:
service-url:
defaultZone: http://CloudEurekaServerA:8761/eureka,http://CloudEurekaServerB:8762/eureka
instance:
prefer-ip-address: true
instance-id: ${
spring.cloud.client.ip-address}:${
spring.application.name}:${
server.port}:@project.version@
- 添加gateWay配置
spring:
cloud:
gateway:
routes:
- id: service-autodeliver-router #路由 ID,保持唯一
uri: lb://m-service-autodeliver # 目标服务地址 自动投递微服务(部署多实例)动态路由:
predicates: # 断言:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果
- Path=/autodeliver/**
- id: service-resume-router
uri: lb://m-service-resume
predicates:
- Path=/resume/**
# filters:
# - StripPrefix=1
核心概念。
Spring Cloud GateWay天⽣就是异步非阻塞的,基于Reactor模型
路由(route): 网关最基础的部分,也是网关比较基础的工作单元。路由由⼀个ID、⼀个⽬标
URL(最终路由到的地址)、⼀系列的断言(匹配条件判断)和Filter过滤器(精细化控制)组
成。如果断言为true,则匹配该路由。
断言(predicates):参考了Java8中的断⾔java.util.function.Predicate,开发⼈员可以匹配Http
请求中的所有内容(包括请求头、请求参数等)(类似于nginx中的location匹配⼀样),如果断
言与请求相匹配则路由。
过滤器(filter):⼀个标准的Spring webFilter,使用过滤器,可以在请求之前或者之后执行业务
逻辑。
GateWay动态路由详
- pom.xml中添加注册中⼼客户端依赖(因为要获取注册中⼼服务列表,eureka客户端已经引⼊)
- 动态路由配置
动态路由设置时,uri以 lb: //开头(lb代表从注册中⼼获取服务),后⾯是需要转发到的服务名
称
GateWay过滤器
从过滤器类型的⻆度,Spring Cloud GateWay的过滤器分为GateWayFilter和GlobalFilter两种
过滤器类型 | 影响范围 |
---|---|
GateWayFilter | 应⽤到单个路由路由上 |
GlobalFilter | 应⽤到所有的路由上 |
如Gateway Filter可以去掉url中的占位后转发路由,⽐如 |
predicates:
- Path=/resume/**
filters:
- StripPrefix=1
GateWay高可用
可以启动多个GateWay实例来实现高可用,在GateWay的上游使⽤Nginx等负载均衡设备进行负载转发以达到高可用的目的
#配置多个GateWay实例
upstream gateway {
server 127.0.0.1:9002;
server 127.0.0.1:9003;
}
location / {
proxy_pass http://gateway;
}