微服务框架当前大行其道,网关在微服务架构中是一个非常重要的部分,网关一般作为项目的统一请求入口提供给前端开发人员,前端开发人员不用知道每个微服务的请求地址。网关可以统一对所有请求做过滤、限流、负载均衡、监控等处理,而不必在每个微服务项目重复处理请求。网关配合注册中心也可以很好的实现微服务的动态扩容,只需要在网关将请求路由转发到注册中心的微服务上即可,由注册中心进行负载均衡处理。
Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到api,并为它们提供额外功能,例如:安全性、监控和弹性控制。
Spring Cloud Gateway基于Spring Boot 2.x, Spring WebFlux, 由Spring Webflux提供Netty的运行环境。它不能在传统Servlet容器中工作,也不能在构建为WAR时工作。
Spring Cloud Gateway底层通信框架基于Netty,不同于第一代网关Zuul,gateway是非阻塞的,并且是spring官方开发的,所以拥有强劲的性能。
下面介绍下Spring Cloud Gateway的实际使用。
spring-boot和spring-cloud版本
- spring-cloud Hoxton.SR8
- spring-boot 2.3.3.RELEASE
- spring-cloud-starter-gateway 2.2.5.RELEASE(不需要在pom指定,跟随spring cloud即可)
下面我会演示下实际的项目代码以及效果,我想尽量把需要的代码都贴出来,所以会写的比较细,如果已经掌握的部分可以跳着看即可。
我们现在新建了一个简单的父项目和网关子项目
项目结构
其中父项目只有一个pom文件,引入了一个公共工具依赖,定义了spring boot和spring cloud的版本,子项目中就不需要定义spring子项目的版本了。
父项目pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> 4.0.0 com.huangtl springcloud-parent 1.0-SNAPSHOT gateway pom 1.8 org.springframework.boot spring-boot-starter-parent 2.3.3.RELEASE org.springframework.cloud spring-cloud-dependencies Hoxton.SR8 pom import cn.hutool hutool-all 5.1.3 org.springframework.boot spring-boot-maven-plugin repackage spring-milestones Spring Milestones https://repo.spring.io/milestone false
gateway项目
1.引入spring-cloud-starter-gateway依赖
<?xml version="1.0" encoding="UTF-8"?> springcloud-parent com.huangtl 1.0-SNAPSHOT 4.0.0 gateway org.springframework.cloud spring-cloud-starter-gateway
注意,spring-cloud-gateway是不支持spring-boot-starter-web依赖的,一般我们会把网关单独建一个项目。
2.配置文件
在resources目录下新建application.yml,我们将在这里配置大部分的gateway配置项,在配置这些配置项之前,我们先了解几个gateway配置项的概念。
- Route 路由配置项,包含一个id(唯一标志)、uri(请求转发到该uri)、predicates(请求的匹配条件)、filters(过滤请求)
- Predicate 请求的匹配条件,可以配置请求路径、请求头或参数、请求时间等的匹配条件,若符合条件则匹配路由
- Filter 可以修改请求和响应数据,比如修改请求路径、修改请求头、删除请求参数、修改响应头、设置断路器等等
predicate的配置项有快捷和完整两种写法:
快捷写法格式:- 表达式名称 = 参数(多参数可逗号隔开)
spring: cloud: gateway: routes: - id: after_route uri: https://example.org predicates: - Cookie=mycookie,mycookievalue
完整写法用 - name 加上 args参数来配置,上面快捷写法对应的完整写法如下:
spring: cloud: gateway: routes: - id: after_route uri: https://example.org predicates: - name: Cookie args: name: mycookie regexp: mycookievalue
我们接下去的测试都会用快捷的写法。
3.新建一个springboot启动类
package com.huangtl.gateway;import org.springframework.boot