引入依赖

        <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>
<version>2.1.4.RELEASE</version>
</dependency> <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>

如果网关有时候请求超时或者卡顿 ,可以在主启动类中加入

 public static void main(String[] args) {

        System.setProperty(ReactorNetty.NATIVE,"false");
System.setProperty(ReactorNetty.IO_WORKER_COUNT, "6");
System.setProperty(ReactorNetty.IO_SELECT_COUNT, "6");
SpringApplication.run(GatewayApplication.class, args);
}

统一鉴权过滤器

AuthFilter.java
import com.alibaba.fastjson.JSON;
import com.kotei.gatewayweb.apiResult.ApiResult;
import com.kotei.gatewayweb.config.properties.IgnoreWhiteProperties;
import com.kotei.gatewayweb.config.redis.RedisUtils;
import com.kotei.gatewayweb.utils.JWTUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.CollectionUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono; import java.util.List; /**
* 网关鉴权
*
* @author .
*/
@Component
public class AuthFilter implements GlobalFilter, Ordered {
private static final Logger log = LoggerFactory.getLogger(AuthFilter.class); @Autowired
private RedisUtils redisUtils; @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String url = exchange.getRequest().getURI().getPath();// 跳过不需要验证的路径 配置文件里自己添加 list集合格式即可 ,这里是伪代码 所以没有这个类
if (matches(url, ignoreWhite.getWhites())) {
log.info(">>>>>>>>跳过该请求验证:{}",url);
return chain.filter(exchange);
} //这是请求接口中header的token参数值
String token = exchange.getRequest().getHeaders().getFirst("token");
if (token == null || !redisUtils.exists(token)) {
return setUnauthorizedResponse(exchange, "token信息不存在");
}       //验证token是否正确 根据自己的来
boolean validateJWT = JWTUtils.validateJWT(token); if (!validateJWT) {
return setUnauthorizedResponse(exchange, "令牌验证失败");
} log.info(">>>>>>>>>>>认证执行完成 {}",url); return chain.filter(exchange);
} /**
* 查找指定字符串是否匹配指定字符串列表中的任意一个字符串
*
* @param str 指定字符串
* @param strs 需要检查的字符串数组
* @return 是否匹配
*/
public static boolean matches(String str, List<String> strs) {
if (StringUtils.isEmpty(str) || CollectionUtils.isEmpty(strs)) {
return false;
}
for (String pattern : strs) {
if (isMatch(pattern,str)) {
return true;
}
}
return false;
} /**
* 判断url是否与规则配置:
* ? 表示单个字符;
* * 表示一层路径内的任意字符串,不可跨层级;
* ** 表示任意层路径;
*
* @param pattern 匹配规则
* @param url 需要匹配的url
* @return
*/
public static boolean isMatch(String pattern, String url) {
AntPathMatcher matcher = new AntPathMatcher();
return matcher.match(pattern, url);
}

  //返回错误信息
private Mono<Void> setUnauthorizedResponse(ServerWebExchange exchange, String msg) {
ServerHttpResponse response = exchange.getResponse();
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
response.setStatusCode(HttpStatus.OK); log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath()); return response.writeWith(Mono.fromSupplier(() -> {
DataBufferFactory bufferFactory = response.bufferFactory();
return bufferFactory.wrap(JSON.toJSONBytes(new ApiResult<>().failure(msg)));
}));
} @Override
public int getOrder() {
return -200;
}
}

官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

配置示例(以下是整合nacos的写法,主要是routes部分)

spring:
cloud:
gateway:
discovery:
locator:
enabled: true #让gateway可以发现nacos中的其他微服务, 进行路由转发
routes:
- id: api
uri: lb://api-service
predicates:
- Path=/api/**

id:唯一标识,必须唯一

url:转发的服务 lb 是因为使用了 注册中心

predicates 断言 ,表示符合规则就进行转发

-path 表示 匹配该请求/api/**规则 就转发到 http://api-service/api/** 去

请求路径截取

spring:
cloud:
gateway:
routes:
- id: nameRoot
uri: https://nameservice
predicates:
- Path=/name/api/**
filters:
- StripPrefix=1

使用 StripPrefix 会把 /name/api/** 转发到 https://nameservice/api/**

这里的“1”表示截去的前面的 /name

如果是“2”就表示截去前面的 “/name/api”

SpringBoot简单整合Gateway网关的更多相关文章

  1. SpringBoot简单整合redis

    Jedis和Lettuce Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server. Jedis在实现上是直接连接的redis serve ...

  2. Quartz SpringBoot 简单整合一下

    一次简单的代码整合记录. 数据库准备 如果是MySQL可能出现一些小问题.比如联合主键长度超限制,已经记录解决办法了. CREATE TABLE QRTZ_JOB_DETAILS ( SCHED_NA ...

  3. Springboot简单整合Rabbit

    两个项目.分别是生产者和消费者项目 .首先引入依赖.两边pom都一样 第一次练习,启动生产者后,再启动消费者,一直报找不到 队列的声明. 后排查发现是  需要现在生产者这边浏览器访问一次生产消息的方法 ...

  4. SpringBoot简单整合分布式任务调度平台(XXL-JOB)

    官方文档:https://www.xuxueli.com/xxl-job/#%E3%80%8A%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%BB%E5%8A%A1%E8%B0%8 ...

  5. SpringBoot简单整合Actuator监控

    pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s ...

  6. Springboot与MyBatis简单整合

    之前搭传统的ssm框架,配置文件很多,看了几天文档才把那些xml的逻辑关系搞得七七八八,搭起来也是很麻烦,那时我完全按网上那个demo的版本要求(jdk和tomcat),所以最后是各种问题没成功跑起来 ...

  7. 【spring boot】SpringBoot初学(8)– 简单整合redis

    前言 到目前为止,把项目中需要用到的:properties读取.数据源配置.整合mybatis/JdbcTemplate.AOP.WebService.redis.filter.interceptor ...

  8. SpringCloud-Alibaba 最新的 依赖版本管理组合以及 整合gateway遇到的问题

    一般来说,cloud 与 alibaba 拥有版本组合说明文档wiki,不过这里可以做一个最新的组合的分享. <dependencyManagement> <dependencies ...

  9. springboot+maven整合spring security

    springboot+maven整合spring security已经做了两次了,然而还是不太熟悉,这里针对后台简单记录一下需要做哪些事情,具体的步骤怎么操作网上都有,不再赘述.1.pom.xml中添 ...

随机推荐

  1. PowerDotNet平台化软件架构设计与实现系列(05):ETCD分布式键值存储平台

    ETCD目前在PowerDotNet已经被用于注册中心和配置管理(常见的配置中心在PowerDotNet中仅仅是一个小小的模块而已)中,作为基础设施的重要组成部分,ETCD的重要性不言而喻. 本文简单 ...

  2. 【机器学习与R语言】7-回归树和模型树

    目录 1.理解回归树和模型树 2.回归树和模型树应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理解回归树和模型树 决策树用于数值预测: 回归树:基于到达 ...

  3. 基于PASA进行基因预测

    PASA, acronym for Program to Assemble Spliced Alignments, is a eukaryotic genome annotation tool tha ...

  4. Generic recipe for data analysis with general linear model

    Generic recipe for data analysis with general linear model Courtesy of David Schneider State populat ...

  5. mysql—mysql查询语句提示Unknown column ‘xxx’ in ‘where clause’

    运行结果中提示Unknown column 'xxx' in 'where clause'的问题.经过大神的指导,顿时明白其中缘由,如果sql中定义的类型是int型的可以不用加引号,但是如果是字符串类 ...

  6. goto 的用法

    #include <stdio.h> int main() { printf("go to cpy \n"); goto FLASH_CPY; printf(" ...

  7. nginx二级域名指向不同文件项目配置

    需要使用泛域名解析, 并且加上空的判断,以保证没有二级域名的也可以访问 核心配置 server_name ~^(?<subdomain>.+)\.caipudq\.cn$;if ( $su ...

  8. jsp的动态包含和静态包含

    jsp的动态包含和静态包含 例如:提取一个公共的页面(top.jsp)到/WEB-INF/jsp/common/目录下 动态包含: 被包含的页面也会独立编译,生成字节码文件,一般包含页面信息频繁变化的 ...

  9. 生产调优4 HDFS-集群扩容及缩容(含服务器间数据均衡)

    目录 HDFS-集群扩容及缩容 添加白名单 配置白名单的步骤 二次配置白名单 增加新服务器 需求 环境准备 服役新节点具体步骤 问题1 服务器间数据均衡 问题2 105是怎么关联到集群的 服务器间数据 ...

  10. absorb

    absorb 物理的absorb比较直观.被书本/知识absorb也好理解.涉及到money/time时有点抽象,但汉语也有"吸金"的说法,consume, use up.可以吸收 ...