基于spring cloud gateway封装的微服务网关,通过nacos配置中心来管理应用路由
- 架构
- 路由加载过程
- 动态配置
- 基于nacos配置中心,各应用独立配置路由,实时刷新
- 插件机制
- 组件支持通过配置热拔插,无需重启网关
- 弹性扩展
- 网关节点支持横向动态扩容
spring cloud gateway 框架自带功能请参考官网
校验请求参数和请求体SQL注入关键字
- 检查请求参数和applicaiton/json类型body数据中的sql注入风险
- 配置代码
# Sql注入检测(如果是加密数据,配置在加密组件后面) - name: SqlInspect args: # 是否包括查询参数(true) includeQueryParams: true # 是否包括请求题(true) includeBody: true
todo...
对前端加密的请求参数和请求体数据在网关解密
- 请求参数和application/json类型body数据解密
- 加密算法: AES,加密算法/加密模式/填充类型:AES/ECB/Pkcs7,加密密码:app secret,密钥偏移量:abcdef0123456789
- 配置代码
# 请求解密 - name: RequestDecrypt args: # 是否包括查询参数(true) includeQueryParams: true # 是否包括请求题(true) includeBody: true
防止中间人截获请求重放攻击
- 请求唯一性检测,通过添加HTTP HEADER x-ca-reqid: uuid
- 请求过期检测,通过添加HTTP HEADER:x-ca-reqtime: currentTimeMillis
- 配置代码
# 请求防重 - name: ReplayAttack args: # 请求过期时间(秒) expiredTime: 900
-
根据客户端提供appid,secret(认证中心注册)访问oauth2 api获取令牌
-
根据令牌和用户客户端提供的用户账号访问oauth2 api获取含token及权限信息的jwt签名
-
网关缓存token及权限信息
-
返回token信息给客户端
# 登陆路由 routes: predicates: - Header=appid,secret - Header=username,password filters: - name: AppLogin
-
根据请求token获取网关缓存的用户信息
-
放入http header给后端服务
default-filters: # 会话认证 - SessionAuth
通过改造nacos注册中心管理
-
请求耗时:计算请求起止的系统时间
-
访问信息:获取来源ip,时间,目标api地址,返回码,异常信息等
default-filters: # 访问日志 - AccessLog
-
网关自定义
异常码 描述 1000 网关内部异常 1001 认证失败 1002 非法请求地址 1004 非法安全请求头 1005 解码数据出错 1006 重放攻击出错 1007 请求已被熔断 1008 会话失效 1009 URI查询参数不合法 1010 请求数据包含SQL注入风险 -
HTTP 异常码 参考网络
每个路由舱壁模式隔离,请求异常熔断,自动回复
-
配置代码
# 熔断 - name: Hystrix args: name: appService1AddCmd
分布式令牌桶模式限流
-
配置代码
# 限流 - name: RequestRateLimiter args: # 限流策略 key-resolver: '#{@remoteAddrKeyResolver}' # 令牌桶每秒填充率 redis-rate-limiter.replenishRate: 10 # 令牌桶容量 redis-rate-limiter.burstCapacity: 100
配置路由名单,白名单跳过认证,黑名单阻止访问
-
配置代码
# 黑白名单过滤 - name: RBL args: blacklistUrl: - /echo222/** whitelistUrl: - /echo333/**
nacos注册中心配置
-
修改启动脚本
vi nacos\bin\startup.sh export JAVA_HOME="/opt/jdk"
-
启动
nacos\bin\startup.sh -m standalone &
-
配置
- 登陆 http://127.0.0.1:8848/nacos/#/login nacos/nacos
- 创建命名空间如 sit
- 创建网关基础配置 gateway_server.yaml
server: port: 8080 spring: application: name: gateway_server redis: host: 127.0.0.1 port: 6379 database: 0 lettuce: pool: max-active: 200 #连接池最大连接数(使用负值表示没有限制) max-idle: 20 # 连接池中的最大空闲连接 min-idle: 5 #连接池中的最小空闲连接 max-wait: 1000 # 连接池最大阻塞等待时间(使用负值表示没有限制) # 熔断设置 hystrix: command: default: fallback: # 关闭服务降级 enabled: false execution: isolation: thread: # 执行超时时间(1000) timeoutInMilliseconds: 3000 metrics: rollingStats: # 判断健康度的滚动时间窗长度(10000) timeInMilliseconds: 10000 circuitBreaker: # 滚动时间窗内最小请求数,达到才会进入断路判断(20) requestVolumeThreshold: 20 # 滚动时间窗内错误百分比,达到断路器打开(50) errorThresholdPercentage: 50 # 休眠时间窗,休眠后断路器半开,尝试熔断后第一次请求 sleepWindowInMilliseconds: 5000 threadPool: # 命令线程池执行最大并发量(10) coreSize: 10 # 是否开启监控端点 management: endpoints: web: exposure: include: "*" security: enabled: false
- 创建应用基础配置 app_base.yaml
# 应用公共配置 app: routes: # 路由文件列表 filenames: - app_service1.yaml sqlInject: regex: (?:')|(?:--)|(/\*(?:.|[\n\r])*?\*/)|(\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\b) spring: cloud: gateway: default-filters: # 请求重放 - name: ReplayAttack args: # 请求过期时间(秒) expiredTime: 900 # 黑白名单过滤 - name: RBL args: blacklistUrl: - /echo222/** whitelistUrl: - /echo333/** # 认证 - AppAuth # 请求解密 - name: RequestDecrypt args: # 是否包括查询参数(true) includeQueryParams: true # 是否包括请求题(true) includeBody: true # Sql注入检测(依赖RequestDecrypt) - name: SqlInspect args: # 是否包括查询参数(true) includeQueryParams: true # 是否包括请求题(true) includeBody: true # 添加会话 - SessionHeader
2. 创建应用服务路由配置 app_service1.yaml
spring: cloud: gateway: routes: - id: appService1Echo uri: http://127.0.0.1:8081/echo predicates: - Cookie=SESSION,.* - Path=/service1/echo/** filters: - StripPrefix=1 # 限流 - name: RequestRateLimiter args: # 限流策略 key-resolver: '#{@remoteAddrKeyResolver}' # 令牌桶每秒填充率 redis-rate-limiter.replenishRate: 1 # 令牌桶容量 redis-rate-limiter.burstCapacity: 2 # 熔断 - name: Hystrix args: name: appService1EchoCmd - id: appService1Add uri: http://127.0.0.1:8081/add predicates: - Cookie=SESSION,.* - Path=/service1/add filters: - StripPrefix=1 # 限流 - name: RequestRateLimiter args: # 限流策略 key-resolver: '#{@remoteAddrKeyResolver}' # 令牌桶每秒填充率 redis-rate-limiter.replenishRate: 10 # 令牌桶容量 redis-rate-limiter.burstCapacity: 100 # 熔断 - name: Hystrix args: name: appService1AddCmd