网关Gateway断⾔+过滤器整合注册中心Nacos项目实战

news/2025/5/21 7:18:11

网关Gateway断⾔+过滤器整合注册中心Nacos项目实战

  • 一、前言
  • 二、网关介绍
  • 三、基本网关转发
    • 1、创建Gateway项目
    • 2、配置
  • 四、整合注册中心Nacos
    • 1、添加Nacos依赖
    • 2、启动类开启支持
    • 3、修改配置文件
    • 4、网关访问的代码
  • 五、Gateway内置断言实现接口定时下线与强制参数
  • 六、自定义全局过滤器实现鉴权
  • 七、SpringCloud+gateway+nacos整合踩过的坑


一、前言

提示:本文讲到的代码部分来自上文
上文链接地址


提示:以下是本篇文章正文内容,下面案例可供参考

二、网关介绍

API Gateway,是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求、鉴权、监控、缓存、限流等功能

  • 主流的网关
    • zuul:是Netflix开源的微服务网关,和Eureka,Ribbon,Hystrix等组件配合使用,依赖组件比较多,性能教差
    • kong: 由Mashape公司开源的,基于Nginx的API gateway
  • nginx+lua:是一个高性能的HTTP和反向代理服务器,lua是脚本语言,让Nginx执行Lua脚本,并且高并发、非阻塞的处理各种请求
  • springcloud gateway: Spring公司专门开发的网关,替代zuul

三、基本网关转发

1、创建Gateway项目

添加依赖

        <!--gateway依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

2、配置

server:port: 8888
spring:application:name: api-gatewaycloud:gateway:routes: #数组形式- id: spring-other2  #路由唯一标识,这里自定义,一般是服务名uri: http://127.0.0.1:9000  #想要转发到的地址order: 1 #优先级,数字越小优先级越高predicates: #断言 配置哪个路径才转发,前端转发的前缀路径- Path=/spring-other2/**filters: #过滤器,请求在传递过程中通过过滤器修改- StripPrefix=1  #去掉第一层前缀(例如下面的spring-other2)#访问路径 http://localhost:8888/spring-other2/other2/getusername4?name=sb
#转发路径 http://localhost:9000/other2/getusername4?name=sb
#需要过滤器去掉前面第一层

效果图
在这里插入图片描述

四、整合注册中心Nacos

1、添加Nacos依赖

        <!--添加nacos客户端--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

2、启动类开启支持

@EnableDiscoveryClient

3、修改配置文件

server:port: 8888
spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848 #nacos地址gateway:routes: #数组形式- id: spring-other2  #路由唯一标识,这里自定义,一般是服务名# uri: http://127.0.0.1:9000  #想要转发到的地址uri: lb://spring-other2  #想要转发到的地址,从nacos转发进行,后面跟服务名(lb负载均衡的意思)order: 1 #优先级,数字越小优先级越高predicates: #断言 配置哪个路径才转发,前端转发的前缀路径- Path=/spring-other2/**filters: #过滤器,请求在传递过程中通过过滤器修改- StripPrefix=1  #去掉第一层前缀(例如下面的spring-other2)discovery:locator:enabled: true #开启网关拉取nacos服务#访问路径 http://localhost:8888/spring-other2/other2/getusername4?name=sb
#转发路径 http://localhost:9000/other2/getusername4?name=sb
#需要过滤器去掉前面第一层

Gateway内置的路由断言

predicates:- Host=- Path=- Method=- Header=- Query=- Cookie=

4、网关访问的代码

@RestController
@RequestMapping("other2")
public class OtherController2 {/*** 测试gateway负载* @return*/@RequestMapping("getusername8")String getusername8( HttpServletRequest request) {return "other2的getUserName7反回的数据-由"+request.getServerName()+":"+request.getServerPort()+"发起";}
}

在这里插入图片描述

在这里插入图片描述
效果图是一种默认轮询
在这里插入图片描述

在这里插入图片描述

五、Gateway内置断言实现接口定时下线与强制参数

  • 需求:接口需要在指定时间进行下线,过后不可以在被访问
    • 使用Before ,只要当前时间小于设定时间,路由才会匹配请求
    • 东8区的2020-09-11T01:01:01.000+08:00后,请求不可访问
predicates:- Before=2020-09-09T01:01:01.000+08:00

强制参数,如果没有source参数则拒绝访问

predicates:- Query=source

六、自定义全局过滤器实现鉴权

网关不要加太多业务逻辑,否则会影响性能

//实现GlobalFilter, Ordered接口
@Component
public class UserGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//业务逻辑//从请求中获取tokenString token = exchange.getRequest().getHeaders().getFirst("token");System.out.println(token);//如果token为空的业务逻辑if(StringUtils.isBlank(token)){exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}//如果成功继续往下执行return chain.filter(exchange);}//数字越小,优先级越高@Overridepublic int getOrder() {return 0;}
}

七、SpringCloud+gateway+nacos整合踩过的坑

path不能和服务名一样,例如服务名为spring-other2则path可以叫api-spring-other2不能为spring-other2,否则routes配置无效

predicates:- Path=
文章来源:https://blog.csdn.net/weixin_46146718/article/details/119948928
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-18355.html

相关文章

Algorithm,Acm,RMQ

/*RMQ离线算法所谓RMQ即(Range Minimum/Maximum Query)区间最小/最大值查找&#xff0c;它可以用来解决多次查找区间内的最大值或最小值。算法需要O(nlogn)的初始化时间以及每次O(1)的查询时间&#xff0c;实在是非常的快啊。例如给定如下23个数&#xff0c;以数组val[23]形式给…

SPARK-SQL 通过JDBC读写Mysql数据库

相关的资源文件地址 链接&#xff1a;https://pan.baidu.com/s/1QGQIrVwg56g9eF16ERSLwQ 提取码&#xff1a;7v8n 写数据库表的参数 truncate:仅适用于write数据。当SaveMode.Overwrite启用时&#xff0c;此选项会truncate在MySQL中的表&#xff0c;而不是删除&#xff0c;再…

Hadoop的体系结构

HDFS和MapReduce是Hadoop的两大核心。而整个Hadoop的体系结构主要是通过HDFS来实现对分布式存储的底层支持的&#xff0c;并且它会通过MapReduce来实现对分布式并行任务处理的程序支持。 1、HDFS的体系结构 HDFS采用了主从&#xff08;Master/Slave&#xff09;结构模型&#x…

Redis分布式锁实现

Redis分布式锁实现一、Redis分布式锁的出现二、普通分布式锁&#xff08;不推荐&#xff09;1、pom依赖2、普通版本的分布式锁3、redis分布式锁保证三、升级版分布式锁1、工具类2、场景一程序运行时间大于锁时间提前结束3、场景二程序运行时间小于锁自动释放时间&#xff0c;触…

Unity NGUI 创建简单的按钮

Unity版本&#xff1a;4.5.1  NGUI版本&#xff1a;3.6.5 注意NGUI版本&#xff0c;网上的大部分教程都是2.x版本的&#xff0c;在步骤上面略有不同&#xff0c;此文适合初学者。 示例&#xff1a; 通过NGUI创建一个背景和按钮。 1.首先创建一个新场景&#xff0c;并保存&…

SPARK-SQL 通过load(),write()读写各种数据源

相关的资源文件地址 链接&#xff1a;https://pan.baidu.com/s/1QGQIrVwg56g9eF16ERSLwQ 提取码&#xff1a;7v8n读取(load)和保存(write)操作&#xff0c;操作的文件的数据格式默认是parquet 也可以在load和write的时候&#xff0c;通过format指定数据的格式 如: spark.re…

UVa - 11283 - PLAYING BOGGLE

先上题目 Problem F PLAYING BOGGLE Boggle is a classic word game played on a 4 by 4 grid of letters. The letter grid is randomly generated by shaking 16 cubes labeled with a distribution of letters similar to that found in English words. Players try to find…

常用JVM参数参考

常用JVM参数参考一、前言二、常用JVM参数参考一、前言 这里有几个比较重要的指标&#xff1a; 内存占用&#xff1a;程序正常运行需要的内存大小。延迟&#xff1a;由于垃圾收集而引起的程序停顿时间。吞吐量&#xff1a;用户程序运行时间占用户程序和垃圾收集占用总时间的比…

CIL中间语言浅谈

CIL中间语言通用中间语言&#xff08;Common Intermediate Language&#xff0c;简称CIL&#xff09;&#xff08;曾经被称为微软中间语言或MSIL)是一种属于通用语言架构和.NET框架的低阶&#xff08;lowest-level&#xff09;的人类可读的编程语言。目标为.NET 框架的语言被编…

关于读、写SD卡的操作

1.点击按钮将assets文件夹中的内容复制到SD卡中。 private void copyToSD() { // 检测SD卡是否挂载 Environment.MEDIA_MOUNTED 表示被挂载 // Environment.getExternalStorageState() 将返回sd卡的状态 if(! Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorag…