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

news/2023/9/26 19:52:20

网关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://dhexx.cn/news/show-18355.html

相关文章

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;并保存&…

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…

Open-Feign整合hystrix降级熔断实战

Open-Feign整合hystrix降级熔断实战一、服务端1、配置文件2、控制层二、客户端1、依赖2、配置文件3、启动类4、在控制层当中调用5、创建一个类实现服务FeignClient接口6、在服务FeignClient接口上配置FallBack实现类三、测试1、场景一服务正常调用2、场景二当被调服务停止运行时…

图的全局最小割的Stoer-Wagner算法及例题

Stoer-Wagner算法基本思想&#xff1a;如果能求出图中某两个顶点之间的最小割&#xff0c;更新答案后合并这两个顶点继续求最小割&#xff0c;到最后就得到答案。 算法步骤&#xff1a; ------------------------------------------------------------------------------------…

学习消息中间件Kafka从配置到基本应用

学习消息中间件Kafka从配置到基本应用一、服务器安装配置Kafka1、配置介绍与修改2、启动3、配置开机自启4、如果不使用自带的zookeeper二、Kafka的使用场景1、异步处理2、应用解耦3、流量削锋4、日志处理5、消息通讯三、点对点消息传递模式1、介绍四、发布-订阅消息传递模式1、…

【译】ASP.NET MVC 5 教程 - 1:入门

本教程将教你使用Visual Studio 2013 预览版构建 ASP.NET MVC 5 Web 应用程序 的基础知识。本主题还附带了一个采用 C# 源代码的 Visual Web Developer 项目。下载C# 版本。 入门 Visual Studio 是一个集成的开发环境。就像您使用 Microsoft Word 写文档&#xff0c;您将使用 I…

Redis雪崩、穿透、击穿补充学习与布隆过滤器

Redis学习补充与布隆过滤器一、缓存雪崩1、介绍2、处理雪崩数据二、缓存穿透1、介绍2、处理穿透数据三、缓存击穿2、处理击穿数据四、Redis其他知识1、Redis为何这么快2、Redis的持久化策略五、布隆过滤器1、安装2、介绍布隆过滤器3、使用布隆过滤器BloomFilter解决Redis的缓存…

在线音频江湖:内容大战、场景之争、AI博弈

配图来自Canva可画 智能终端的普及&#xff0c;让“耳朵经济”有了更大的发挥空间&#xff0c;连带着在线音频平台也获得了新增长。近期&#xff0c;在线音频赛道喜讯连连&#xff0c;先是喜马拉雅宣布首次单季度盈利&#xff0c;荔枝也紧跟着宣布首次实现全年盈利。 喜马拉雅…