一、快速上手
1.1 准备工作
API网关也是一个服务
一、创建网关服务
二、添加依赖
<!--⽹关--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--基于nacos实现服务发现依赖,网关支持动态路由,需要服务发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--网关服务也需要loadbalancer将服务名转换为对应的IP地址--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
三、编写启动类
@SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class,args); } }
四、添加配置
server: port: 10030 spring: application: name: gateway cloud: nacos: #将网关服务注册到nacos discovery: server-addr: 110.41.17.130:8848 gateway: routes: #网关路由设置 - id: order-service #路由规则id,随便起,不重复即可 uri: lb://order-service/ #目标服务地址 predicates: #路由条件 - Path=/order/**,/feign/**
其中,id可以随便起一个,uri中的lb表示负载均衡,predicates表示路由条件(在当前配置表示所有路径符合Path规则的请求,都会代理到uri参数指定的地址)
1.2 测试
(1)访问订单服务
(2)访问商品服务
可以看到,只有已配置的路由才可以通过gateway服务访问,未配置的路由无法访问
二、Route Predicate Factories
我们可能对于配置中的一些配置存有疑问,现在我们深入了解上述配置的predicates
2.1 Predicate
Predicate是Java8提供的一个函数式编程接口,它接收一个参数并返回一个布尔值,用于条件过滤、请求参数的校验。
使用示例:
/* * 判断字符串是否为空 * 空 -true * 非空 -false * */ public class StringPredicate implements Predicate<String> { @Override public boolean test(String s) { return s == null || s.isEmpty(); } }
接下来,调用方法进行测试:
public void test(){ Predicate<String> predicate = new StringPredicate(); System.out.println(predicate.test("")); }
Predicate的其它方法:
2.2 Route Predicate Factories
Route Predicate Factories(路由断言工厂),由Predicate提供路由规则的匹配机制。
在配置文件中所写得断言规则只是字符串,这些字符串被Route Predicate Factories处理后转变为路由得判断条件,如:下图的Path属性就是匹配url前缀是product/ 或 feign/ 的请求
Spring Cloud Gateway 默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请求的不同属性,并且多个Predicate通过and逻辑进行组合。
在前面的代码中已经测试了Path属性,现在再添加一个Predicate After:
predicates: #路由条件
- Path=/order/**,/feign/**
- After=2026-01-20T17:42:47.789-07:00[America/Denver]
可以看到After属性配置为2026年后才可访问,现在再次测试:
注释After配置,访问成功:
2.3 Gateway Filter Factories(网关过滤工厂)
Predicate决定了请求由哪个路由处理,如果需要再请求前后加上一些逻辑,就需要使用Filter。
Filter分为两种类型:
1> Pre 类型过滤器:请求处理前执行,可以做鉴权、限流等工作
2> Post 类型过滤器:请求处理后、返回客户端前执行
Spring Cloud Gateway中内置很多Filter,用于拦截和链式处理Web请求(权限校验、访问超时等处理),Spring Cloud Gateway 将Filter分为两类:
GatewayFilte(应用到单个路由或一个分组路由上)
GlobalFilter(应用到所有路由)
2.3.1 GatewayFilter
这里以其中一个Filer(AddRequestParam)为例
一、添加配置
routes: - id: order-service #路由规则id,随便起,不重复即可 uri: lb://order-service/ #目标服务地址 predicates: #路由条件 - Path=/order/**,/feign/** filters: - AddRequestParameter=userName, wangwu
与predicates同级,这个Filter给Path中指定请求添加一个参数userName
二、修改feign/o1代码(添加一个参数userName)
三、测试
成功添加参数userName
想了解其它过滤器可以访问Spring官网: GatewayFilter Factories :: Spring Cloud Gateway
2.3.2 GlobalFilter
Spring Cloud Gateway中内置的全局过滤器也有很多,如:
• Gateway Metrics Filter:网关指标,提供监控指标
• Forward Routing Filter:用于本地forword,请求不转发到下游服务器
• LoadBalancer Client Filter:针对下游服务,实现负载均衡
更多全局过滤器可参考官网:Global Filters :: Spring Cloud Gateway
这里我们只练习使用 Gateway Metrics Filter:
一、添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
二、添加配置
spring: cloud: gateway: metrics: enabled: true management: endpoints: web: exposure: include: "*" endpoint: health: show-details: always shutdown: enabled: true
三、测试
访问127.0.0.1:10030/actuator,显示所有监控的信息链接:
2.4 过滤器执行顺序
一个项目中既有GatewayFilter又有GlobalFilter时,执行的先后顺序是什么呢?
请求路由后,网关会将当前的GatewayFilter和GlobalFilter合并到一个过滤器链中,进行排序,依次执行过滤,每一个过滤器都必须指定⼀个int类型的order值,默认值为0,表示该过滤的优先级。order值越小,优先级越高,执行顺序越靠前。
• Filter通过实现Order接口或者添加@Order注解来指定order值。
• Spring Cloud Gateway提供的Filter由Spring指定。用户也可以自定义Filter,由用户指定。
• 当过滤器的order值⼀样时,会按照 defaultFilter > GatewayFilter > GlobalFilter的顺序执行。