SpringCloudGateway
大约 22 分钟
SpringCloudGateway 简介
微服务网关
- 微服务的设计都会分为提供端与消费端为了避免消费端直接与目标节点的主机地址进行交互,所以在项目中引入了注册中心,这样可以根据微服务的名称实现服务实例数据的获取,从而实现最终的资源调用。但是随着项目业务功能的不断完善,必然导致微服务节点的急剧暴增,这样一来传统的依据微服务名称访问的形式就必然带来维护上的困难,所以此时就需要按照功能对微服务结群进行划分
SpringCloudGateway
- SpringCloudGateway 是 SpringCloud 提供并维护的原生微服务网关项目,该项目是基于 Netty、Reactor 以及 WebFlux 构建,提供了一种简单有效的 API 路由管理方式。所有客户端请求在进行微服务资源访问时必须通过网关进行路由,这样就为整个微服务的使 用提供了统一的入口。SpringCloudGateway 网关中最为重要的核心技术在于微服务的路由管理这样就可以根据用户请求的路由地址找到指定的微服务资源,而在进行微服务调用时,又可以通过路由执行断言(或称路由谓词工厂)进行调用的判断,并通过过滤实现请求与响应的处所以基于 SpringCloudGateway 中的过滤模式还可以轻松的实现参数校验、认证检理流量监控以及访问限流等操作。测、
SpringCloudGateway 编程起步
网关与微服务资源
- SpringCloudGateway 主要是通过注册中心代理所有相关的微服务资源,由于所有的服务资源都需要通过 Nacos 注册中心获取,所以需要将网关注册到 Nacos 服务列表之中,随后就可以通过网关地址来进行微服务访问
在整个微服务的运行架构中,网关是一个独立的应用项目,同时 SpringCloudGateway 基于 WebFlux 开发,直接采用响应式方式进行微服务资源调用
1、
// https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-gateway
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-gateway', version: '3.0.3'
2、
project(":gateway-9501") { // 网关模块
dependencies {
implementation('com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery') {
exclude group: 'com.alibaba.nacos', module: 'nacos-client' // 移除旧版本的Nacos依赖
}
implementation(libraries.'nacos-client') // 引入与当前的Nacos匹配的依赖库
implementation('org.springframework.cloud:spring-cloud-starter-gateway') // 网关依赖
}
}
3、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: true # 通过服务发现查找其他的微服务
4、
package com.yootk.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class StartGatewayApplication9501 { // 网关应用启动类
public static void main(String[] args) {
SpringApplication.run(StartGatewayApplication9501.class, args);
}
}
5、
127.0.0.1 gateway-9501
6、
gateway-9501:9501/dept.provider/provider/dept/list
7、
gateway-9501:9501/dept.provider/provider/dept/get/1
8、
gateway-9501:9501/dept.provider/provider/dept/split?cp=1&ls=2&col=dname&kw
9、
gateway-9501:9501/dept.provider/provider/dept/add
消费端整合 SpringCloudGateway
1、
package com.yootk.service;
import com.yootk.common.dto.DeptDTO;
import com.yootk.service.config.FeignConfig;
import com.yootk.service.fallback.DeptServiceFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
@FeignClient(value = "microcloud.gateway", // 使用网关的名称进行访问
configuration = FeignConfig.class,// 定义要访问的微服务实例名称
fallbackFactory = DeptServiceFallbackFactory.class) // 部门降级配置
public interface IDeptService { // 业务接口
/**
* 根据部门的编号获取部门的完整信息
* @param id 要查询的部门编号
* @return 编号存在则以DTO对象的形式返回部门数据,如果不存在返回null
*/
@GetMapping("/dept.provider/provider/dept/get/{deptno}") // 远程REST接口
public DeptDTO get(@PathVariable("deptno") long id);
/**
* 增加部门对象
* @param dto 保存要增加部门的详细数据
* @return 增加成功返回true,否则返回false
*/
@PostMapping("/dept.provider/provider/dept/add")
public boolean add(DeptDTO dto);
/**
* 列出所有的部门数据信息
* @return 全部数据的集合, 如果没有任何的部门数据则集合为空(size() == 0)
*/
@GetMapping("/dept.provider/provider/dept/list")
public List<DeptDTO> list();
/**
* 进行部门的分页数据加载操作
* @param currentPage 当前所在页
* @param lineSize 每页加载的数据行数
* @param column 模糊查询的数据列
* @param keyword 模糊查询关键字
* @return 部门集合数据以及统计数据,返回的数据项包括:
* 1、key = allDepts、value = List集合(部门的全部数据对象)
* 2、key = allRecorders、value = 总记录数;
* 3、key = allPages、value = 页数。
*/
@GetMapping("/dept.provider/provider/dept/split")
public Map<String, Object> split(
@RequestParam("cp") int currentPage,
@RequestParam("ls") int lineSize,
@RequestParam("col") String column,
@RequestParam("kw") String keyword);
}
静态路由配置
1、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: http://provider-dept-8002:8002 # 配置路由地址
predicates: # 路由谓词工厂
- Path=/** # 匹配该地址下的全部子路径
2、
gateway-9501:9501/provider/dept/list
3、
gateway-9501:9501/provider/dept/get/1
4、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: http://provider-dept-8002:8002/provider/dept/get/{id} # 配置路由地址
predicates: # 路由谓词工厂
- Path=/provider/dept/get/{id} # 匹配该地址下的全部子路径
5、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配该地址下的全部子路径
6、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/provider/dept/get/{id},/provider/dept/split
7、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider/provider/dept/get/{id} # 名称地址调用
predicates: # 路由谓词工厂
- Path=/provider/dept/get/{id}
RoutePredicateFactory 简介
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [After]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Before]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Between]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Cookie]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Header]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Host]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Method]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Path]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Query]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [RemoteAddr]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Weight]
o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [CloudFoundryRouteService]
内置 RoutePredicateFactory 子类
1、
package com.yootk.test;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class CreateGatewayDatetime { // 创建一个日期时间数据
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
ZoneId zoneId = ZoneId.systemDefault(); // 获取默认的区域ID
LocalDateTime localDateTime = LocalDateTime.parse("2050-02-17 21:15:32", formatter);
ZonedDateTime now = ZonedDateTime.of(localDateTime, zoneId);
System.out.println(now);
}
}
2、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
- After=2050-02-17T21:15:32+08:00[Asia/Shanghai] # 指定日期时间之后访问
3、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
- Cookie=muyan-yootk-key, muyan\-\w+
4、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
- Header=X-Muyan-Request-Id, \d+ # 具有指定的头信息允许访问
5、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept-provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
- Host=gateway-**,**.yootk.com # 特定主机访问
- Method=GET # 只允许GET模式访问
6、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
- Query=msg, yootk-\w+ # 参数名称以及匹配的数据内容
7、
gateway-9501:9501/provider/dept/list?msg=yootk-lixinghua
扩展 RoutePredicateFactory 子类
1、
package com.yootk.gateway.predicate.config;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class TimeSubsectionConfig {
private Set<String> section = new LinkedHashSet<>(); // 按照顺序保存不重复的数据
public void setSection(List<String> section) {
this.section.addAll(section);
}
public Set<String> getSection() {
return section;
}
}
2、
package com.yootk.gateway.predicate.factory;
import com.yootk.gateway.predicate.config.TimeSubsectionConfig;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
@Component
public class DefaultTimeSubsectionRoutePredicateFactory
extends AbstractRoutePredicateFactory<TimeSubsectionConfig> {
// 既然需要根据当前的时间进行判断,所以这个时候就需要有一个时间的转换处理类
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
public DefaultTimeSubsectionRoutePredicateFactory() {
super(TimeSubsectionConfig.class); // 传递配置项
}
@Override
public Predicate<ServerWebExchange> apply(TimeSubsectionConfig config) {
return serverWebExchange -> {
String now = LocalTime.now().format(FORMATTER); // 获取当前的时和分
return config.getSection().contains(now); // 存在判断
};
}
@Override
public List<String> shortcutFieldOrder() { // 配置项
// 按照“,”定义多个不同的配置项,而后此时会自动进行数据的拆分
return Collections.singletonList("section"); // 配置项的名称定义
}
@Override
public ShortcutType shortcutType() { // 明确的定义分割项
return ShortcutType.GATHER_LIST;
}
}
3、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
- DefaultTimeSubsection=08:00,16:00,20:00,24:00
网关过滤简介
1、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
filters: # 配置过滤器
- AddRequestHeader=Request-Token-Muyan, www.yootk.com # 追加头信息
内置网关过滤工厂类
1、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
filters: # 配置过滤器
- AddRequestHeader=Request-Token-Muyan, www.yootk.com # 追加头信息
- AddRequestParameter=message, edu.yootk.com # 添加参数
2、
@GetMapping("message")
public Object message(String message) { // 接收参数
log.info("接收到请求参数,message = {}", message);
printRequestHeaders("message");
return message;
}
3、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
filters: # 配置过滤器
- MapRequestHeader=Request-Token-Muyan, Muyan-Yootk-Key # 头信息转换
4、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
filters: # 配置过滤器
- RemoveRequestHeader=Request-Token-Muyan # 删除指定的头信息
- RedirectTo=302, https://www.yootk.com # 必须设置3xx的代码,同时进行重定向
自定义过滤工厂
1、
package com.yootk.gateway.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
@Slf4j
@Component
public class LogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {// 日志过滤工厂类
@Override
public GatewayFilter apply(NameValueConfig config) { // 过滤处理
return (exchange, chain) -> { // 编写具体的过滤实现
ServerHttpRequest request = exchange.getRequest().mutate().build();
ServerWebExchange webExchange = exchange.mutate().request(request).build();
log.info("配置参数:{},{}", config.getName(), config.getValue()); // application.yml
log.info("请求路径:{}、请求模式:{}", request.getPath(), request.getMethod());
return chain.filter(webExchange); // 向下执行
};
}
}
2、
server:
port: 9501 # 网关服务的端口
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
filters: # 配置过滤器
- RemoveRequestHeader=Request-Token-Muyan # 删除指定的头信息
- Log=muyan, yootk # 过滤器=NameValueConfig(name属性, value属性)
全局过滤器简介
1、
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '2.5.5'
2、
project(":gateway-9501") { // 网关模块
dependencies {
implementation('com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery') {
exclude group: 'com.alibaba.nacos', module: 'nacos-client' // 移除旧版本的Nacos依赖
}
implementation(libraries.'nacos-client') // 引入与当前的Nacos匹配的依赖库
implementation('org.springframework.cloud:spring-cloud-starter-gateway') // 网关依赖
implementation('org.springframework.boot:spring-boot-starter-actuator') // Actuator依赖库
}
}
3、
management:
server:
port: 9090 # Actuator端口
endpoints:
web:
exposure:
include: "*" # 开启全部的监控终端
base-path: /actuator # 访问子路径
4、
gateway-9501:9090/actuator/gateway/globalfilters
5、
{
"org.springframework.cloud.gateway.filter.WebsocketRoutingFilter@569c2fce": 2147483646,
"org.springframework.cloud.gateway.filter.ForwardPathFilter@18408d0c": 0,
"org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter@560805d0": 10000,
"org.springframework.cloud.gateway.filter.RemoveCachedBodyFilter@25cd6be9": -2147483648,
"org.springframework.cloud.gateway.filter.NettyRoutingFilter@5d737ed0": 2147483647,
"org.springframework.cloud.gateway.filter.ForwardRoutingFilter@104b643f": 2147483647,
"org.springframework.cloud.gateway.filter.GatewayMetricsFilter@402c9648": 0,
"org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter@2f8e7f7c": -2147482648,
"org.springframework.cloud.gateway.filter.NettyWriteResponseFilter@741f852": -1,
"org.springframework.cloud.gateway.filter.LoadBalancerClientFilter@76d0bcdc": 10100
}
自定义全局过滤器
1、
package com.yootk.gateway.filter.global;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import reactor.core.publisher.Mono;
@Configuration // 向容器之中进行注册
@Slf4j // 启用日志注解
public class CombinedGlobalFilter { // 自定义过滤器
@Bean // 进行Bean注册
@Order(-20) // 数值越小,执行越靠前
public GlobalFilter getFirstFilter() { // 创建一个过滤器
return (exchange, chain) -> {
log.info("【FirstFilter - PRE阶段】请求ID:{}、请求路径:{}",
exchange.getRequest().getId(), exchange.getRequest().getPath());
return chain.filter(exchange).then(Mono.fromRunnable(()->{
log.info("【FirstFilter - POST阶段】请求ID:{}、请求路径:{}",
exchange.getRequest().getId(), exchange.getRequest().getPath());
}));
};// 创建过滤器的实例
}
@Bean // 进行Bean注册
@Order(-10) // 数值越小,执行越靠前
public GlobalFilter getSecondFilter() { // 创建二个过滤器
return (exchange, chain) -> {
log.info("【SecondFilter - PRE阶段】请求ID:{}、请求路径:{}",
exchange.getRequest().getId(), exchange.getRequest().getPath());
return chain.filter(exchange).then(Mono.fromRunnable(()->{
log.info("【SecondFilter - POST阶段】请求ID:{}、请求路径:{}",
exchange.getRequest().getId(), exchange.getRequest().getPath());
}));
};// 创建过滤器的实例
}
}
2、
gateway-9501:9090/actuator/gateway/globalfilters
ForwardRoutingFilter
1、
package com.yootk.gateway.action;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ServerWebExchange;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/gateway/action/*") // 定义访问父路径
public class GatewayAction { // 网关Action
@RequestMapping("globalforward") // 定义子路径
public Map<String, String> forward(ServerWebExchange exchange) {
Map<String, String> result = new HashMap<>(); // 保存所有的处理结果
result.put("message", "forward"); // 信息保存
result.put("requestId", exchange.getRequest().getId());
result.put("requestPath", exchange.getRequest().getPath().toString());
return result;
}
}
2、
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: forward_example # 配置路由ID
uri: forward://globalforward # 配置本地转发
predicates:
- Path=/globalforward # 配置访问路径
filters:
- PrefixPath=/gateway/action # 路径前缀
- id: dept # 路由标记
uri: lb://dept.provider # 负载均衡调用
predicates: # 路由谓词工厂
- Path=/** # 匹配全部的路径
filters: # 配置过滤器
- RemoveRequestHeader=Request-Token-Muyan # 删除指定的头信息
- Log=muyan, yootk # 过滤器=NameValueConfig(name属性, value属性)
3、
gateway-9501:9501/globalfoward
Netty 全局路由
1、
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
discovery: # 服务发现
locator: # 资源定位
enabled: false # 取消默认路由配置,默认值就是false
routes: # 定义静态路由
- id: yootk_example # 配置路由ID
uri: https://www.yootk.com/resources # 设置访问路径的匹配
predicates:
- Path=/muyan-yootk # 配置访问路径
2、
gateway-9501:9501/muyan-yootk
ReactiveLoadBalancerClientFilter
1、
gateway-9501:9090/actuator/gateway/globalfilters
2、
// https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-loadbalancer', version: '3.0.4'
3、
project(":gateway-9501") { // 网关模块
dependencies {
implementation('com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery') {
exclude group: 'com.alibaba.nacos', module: 'nacos-client' // 移除旧版本的Nacos依赖
}
implementation(libraries.'nacos-client') // 引入与当前的Nacos匹配的依赖库
implementation('org.springframework.cloud:spring-cloud-starter-gateway') // 网关依赖
implementation('org.springframework.boot:spring-boot-starter-actuator') // Actuator依赖库
implementation('org.springframework.cloud:spring-cloud-starter-loadbalancer')
}
}
4、
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
loadbalancer:
ribbon:
enabled: false # 关闭默认配置
5、
// https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine
implementation group: 'com.github.ben-manes.caffeine', name: 'caffeine', version: '3.0.4'
6、
ext.versions = [ // 定义全部的依赖库版本号
springboot : '2.2.5.RELEASE', // SpringBoot版本号
springcloud : 'Hoxton.SR3', // SpringCloud版本号
alibabacloud : '2.2.1.RELEASE', // SpringCloudAlibaba版本号
lombok : '1.18.20', // Lombok版本号
junit : '5.6.3', // 配置JUnit测试工具的版本编号
junitPlatformLauncher: '1.6.3', // JUnit测试工具运行平台版本编号
mybatisPlus : '3.4.3', // MyBatisPlus的版本号
mysql : '8.0.25', // MySQL数据库驱动版本
druid : '1.2.6', // Druid版本号
swagger : '3.0.0', // Swagger版本号
nacos : '2.0.2', // Nacos版本号
httpclient : '4.5.13', // HttpClient版本号
feignHttpclient : '11.6', // FeignHttpClient版本号
sentinel : '1.8.2', // Sentinel版本号
caffeine : '3.0.4', // Caffeine缓存组件版本号
]
ext.libraries = [ // 依赖库引入配置
'spring-boot-gradle-plugin' :
"org.springframework.boot:spring-boot-gradle-plugin:${versions.springboot}",
'spring-cloud-dependencies' :
"org.springframework.cloud:spring-cloud-dependencies:${versions.springcloud}",
'spring-cloud-alibaba-dependencies':
"com.alibaba.cloud:spring-cloud-alibaba-dependencies:${versions.alibabacloud}",
// 以下的配置为与项目用例测试有关的依赖
'junit-jupiter-api' :
"org.junit.jupiter:junit-jupiter-api:${versions.junit}",
'junit-vintage-engine' :
"org.junit.vintage:junit-vintage-engine:${versions.junit}",
'junit-jupiter-engine' :
"org.junit.jupiter:junit-jupiter-engine:${versions.junit}",
'junit-platform-launcher' :
"org.junit.platform:junit-platform-launcher:${versions.junitPlatformLauncher}",
'junit-platform-engine' :
"org.junit.platform:junit-platform-engine:${versions.junitPlatformLauncher}",
'junit-jupiter-params' :
"org.junit.jupiter:junit-jupiter-params:${versions.junit}",
'junit-bom' : "org.junit:junit-bom:${versions.junit}",
'junit-platform-commons' :
"org.junit.platform:junit-platform-commons:${versions.junitPlatformLauncher}",
// 以下的配置为Lombok组件有关的依赖
'lombok' : "org.projectlombok:lombok:${versions.lombok}",
// 以下的配置为数据库开发有关的依赖
'mybatis-plus-boot-starter' : "com.baomidou:mybatis-plus-boot-starter:${versions.mybatisPlus}",
'mysql-connector-java' : "mysql:mysql-connector-java:${versions.mysql}",
'druid' : "com.alibaba:druid:${versions.druid}",
// 以下的配置为Swagger有关的依赖库
'springfox-boot-starter' : "io.springfox:springfox-boot-starter:${versions.swagger}",
// 以下的配置为Nacos有关的依赖库
'nacos-client' : "com.alibaba.nacos:nacos-client:${versions.nacos}",
// 以下的配置为Feign与HttpClient有关的依赖库
'httpclient' : "org.apache.httpcomponents:httpclient:${versions.httpclient}",
'feign-httpclient' : "io.github.openfeign:feign-httpclient:${versions.feignHttpclient}",
// 以下的配置为Sentinel有关的组件依赖
'sentinel-datasource-nacos' : "com.alibaba.csp:sentinel-datasource-nacos:${versions.sentinel}",
// 以下的配置为LoadBalancer所需要的Caffeine组件有关依赖
'caffeine' : "com.github.ben-manes.caffeine:caffeine:${versions.caffeine}"
]
7、
project(":gateway-9501") { // 网关模块
dependencies {
implementation('com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery') {
exclude group: 'com.alibaba.nacos', module: 'nacos-client' // 移除旧版本的Nacos依赖
}
implementation(libraries.'nacos-client') // 引入与当前的Nacos匹配的依赖库
implementation('org.springframework.cloud:spring-cloud-starter-gateway') // 网关依赖
implementation('org.springframework.boot:spring-boot-starter-actuator') // Actuator依赖库
implementation('org.springframework.cloud:spring-cloud-starter-loadbalancer')
implementation(libraries.'caffeine')
}
}
GatewayMetricsFilter
1、
// https://mvnrepository.com/artifact/io.micrometer/micrometer-registry-prometheus
implementation group: 'io.micrometer', name: 'micrometer-registry-prometheus', version: '1.7.0'
// https://mvnrepository.com/artifact/io.micrometer/micrometer-core
implementation group: 'io.micrometer', name: 'micrometer-core', version: '1.7.0'
2、
ext.versions = [ // 定义全部的依赖库版本号
springboot : '2.2.5.RELEASE', // SpringBoot版本号
springcloud : 'Hoxton.SR3', // SpringCloud版本号
alibabacloud : '2.2.1.RELEASE', // SpringCloudAlibaba版本号
lombok : '1.18.20', // Lombok版本号
junit : '5.6.3', // 配置JUnit测试工具的版本编号
junitPlatformLauncher: '1.6.3', // JUnit测试工具运行平台版本编号
mybatisPlus : '3.4.3', // MyBatisPlus的版本号
mysql : '8.0.25', // MySQL数据库驱动版本
druid : '1.2.6', // Druid版本号
swagger : '3.0.0', // Swagger版本号
nacos : '2.0.2', // Nacos版本号
httpclient : '4.5.13', // HttpClient版本号
feignHttpclient : '11.6', // FeignHttpClient版本号
sentinel : '1.8.2', // Sentinel版本号
caffeine : '3.0.4', // Caffeine缓存组件版本号
micrometer : '1.7.0', // Prometheus相关监控依赖,与服务部署的版本号相同
]
ext.libraries = [ // 依赖库引入配置
'spring-boot-gradle-plugin' :
"org.springframework.boot:spring-boot-gradle-plugin:${versions.springboot}",
'spring-cloud-dependencies' :
"org.springframework.cloud:spring-cloud-dependencies:${versions.springcloud}",
'spring-cloud-alibaba-dependencies':
"com.alibaba.cloud:spring-cloud-alibaba-dependencies:${versions.alibabacloud}",
// 以下的配置为与项目用例测试有关的依赖
'junit-jupiter-api' :
"org.junit.jupiter:junit-jupiter-api:${versions.junit}",
'junit-vintage-engine' :
"org.junit.vintage:junit-vintage-engine:${versions.junit}",
'junit-jupiter-engine' :
"org.junit.jupiter:junit-jupiter-engine:${versions.junit}",
'junit-platform-launcher' :
"org.junit.platform:junit-platform-launcher:${versions.junitPlatformLauncher}",
'junit-platform-engine' :
"org.junit.platform:junit-platform-engine:${versions.junitPlatformLauncher}",
'junit-jupiter-params' :
"org.junit.jupiter:junit-jupiter-params:${versions.junit}",
'junit-bom' : "org.junit:junit-bom:${versions.junit}",
'junit-platform-commons' :
"org.junit.platform:junit-platform-commons:${versions.junitPlatformLauncher}",
// 以下的配置为Lombok组件有关的依赖
'lombok' : "org.projectlombok:lombok:${versions.lombok}",
// 以下的配置为数据库开发有关的依赖
'mybatis-plus-boot-starter' : "com.baomidou:mybatis-plus-boot-starter:${versions.mybatisPlus}",
'mysql-connector-java' : "mysql:mysql-connector-java:${versions.mysql}",
'druid' : "com.alibaba:druid:${versions.druid}",
// 以下的配置为Swagger有关的依赖库
'springfox-boot-starter' : "io.springfox:springfox-boot-starter:${versions.swagger}",
// 以下的配置为Nacos有关的依赖库
'nacos-client' : "com.alibaba.nacos:nacos-client:${versions.nacos}",
// 以下的配置为Feign与HttpClient有关的依赖库
'httpclient' : "org.apache.httpcomponents:httpclient:${versions.httpclient}",
'feign-httpclient' : "io.github.openfeign:feign-httpclient:${versions.feignHttpclient}",
// 以下的配置为Sentinel有关的组件依赖
'sentinel-datasource-nacos' : "com.alibaba.csp:sentinel-datasource-nacos:${versions.sentinel}",
// 以下的配置为LoadBalancer所需要的Caffeine组件有关依赖
'caffeine' : "com.github.ben-manes.caffeine:caffeine:${versions.caffeine}",
// 以下的配置为Prometheus服务整合
'micrometer-registry-prometheus': "io.micrometer:micrometer-registry-prometheus:${versions.micrometer}",
'micrometer-core': "io.micrometer:micrometer-core:${versions.micrometer}",
]
3、
project(":gateway-9501") { // 网关模块
dependencies {
implementation('com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery') {
exclude group: 'com.alibaba.nacos', module: 'nacos-client' // 移除旧版本的Nacos依赖
}
implementation(libraries.'nacos-client') // 引入与当前的Nacos匹配的依赖库
implementation('org.springframework.cloud:spring-cloud-starter-gateway') // 网关依赖
implementation('org.springframework.boot:spring-boot-starter-actuator') // Actuator依赖库
implementation('org.springframework.cloud:spring-cloud-starter-loadbalancer')
implementation(libraries.'caffeine')
implementation(libraries.'micrometer-registry-prometheus')
implementation(libraries.'micrometer-core')
}
}
4、
spring:
application:
name: microcloud.gateway # 网关名称
cloud: # Cloud配置
loadbalancer:
ribbon:
enabled: false # 关闭默认配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: MuyanGateway # 配置集群名称
username: muyan # 用户名
password: yootk # 密码
gateway: # 网关配置
metrics:
enabled: true # 启用服务监控
5、
gateway-9501:9090/actuator/metrics/gateway.requests
6、
vim /usr/local/prometheus/prometheus.yml
7、
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
scrape_configs:
- job_name: 'microcloud'
scrape_interval: 10s
scrape_timeout: 5s
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['gateway-server:9090']
8、
/usr/local/prometheus/promtool check config /usr/local/prometheus/prometheus.yml
9、
systemctl start prometheus
10、
netstat -nptl
11、
http://prometheus-server:9999/
12、
systemctl start grafana
13、
http://grafana-server:3000
demo