springcloud-gateway简介

news/2024/4/25 14:57:56/文章来源:https://blog.csdn.net/qq_62881798/article/details/128418706

目录

1. gateway简介

1.1 是什么

1.2 作用

1.3 主要特征

1.4 与zuul的主要区别

1.5 主要组件

1.6 架构图

2. 开发示例

2.1 创建一个gateway模块

2.2 与nacos结合使用

2.2.1 默认规则

2.2.2 通过配置文件配置路由

2.2.3 动态路由


1. gateway简介


1.1 是什么


SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。

1.2 作用


Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

1.3 主要特征


  • 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
  • 集成 Hystrix 断路器
  • 集成 Spring Cloud DiscoveryClient
  • Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
  • 具备一些网关的高级功能:动态路由、限流、路径重写

1.4 与zuul的主要区别


Spring Cloud Gateway 底层使用了高性能的通信框架Netty, zuul采用的是传统的servlet IO。

1.5 主要组件


  • Filter
    过滤器,与zuul中的过滤器作用相同,可以用来拦截和修改请求,也可以对响应做处理。比如用来进行安全校验等。

  • Route
    路由组件,将网关接受到的请求发送给指定的上游服务进行处理。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问

  • Predicate
    断言, 这是一个 Java 8 的 Predicate。简单的理解是路由转发的条件,满足条件的请求才会被转发。有点像sql中的where子句的作用。

1.6 架构图


官网

对上图的理解:
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑

2. 开发示例


2.1 创建一个gateway模块


1)创建一个gateway模块

2)如上图,配置pom文件,引入必要的包

    <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 从注册中心进行服务发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 向注册中心进行服务注册 --><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies>
  1. 项目配置文件:application.yml

server:port: 8090spring:application:name: service-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848

4)创建启动类,

@SpringBootApplication
public class GatewayApp {public static void main(String[] args) {SpringApplication.run(GatewayApp.class, args);}}

2.2 与nacos结合使用


2.2.1 默认规则


将gateway注册到nacos注册中心,使用默认规则进行路由,默认规则使用简单,但功能也相当较弱。
默认规则:
http://gateway_host:gateway_port/服务名/**

服务名 默认为nacos注册的服务点的大写,可以修改

这个nacos和geteway要评级,也就是缩进关系要一致

配置文件:

server:port: 8090spring:application:name: service-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:#开启服务发现功能,从注册中心获取服务列表,(nacos->服务管理->服务列表)#默认服务名称需要为大写,可以通过配置lower-case-service-id: true 改变这一规则enabled: true#配置服务名使用小写lower-case-service-id: true#配置配置
logging:level:#trace,debug,infoorg.pringframework.cloud.gateway: trace #便于跟踪调试,生产环境最好不用org.springframework.http.server.reactive: debugorg.springframework.web.reactive: debugreactor.ipc.netty: debug

2.2.2 通过配置文件配置路由

RouteDefinition中,主要有五个属性:

  • id:路由标识(id:标识,具有唯一性,默认为uuid
  • predicates:PredicateDefinition 路由断言定义列表
  • filters:FilterDefinition 过滤器定义列表,为一个数组
  • uri:目标服务地址(uri:地址,请求转发后的地址)
  • order:优先级, 越小越优先

通过配置文件配置路由的缺点是,当增加服务时需要修改配置文件并重启网关。

配置文件:

server:port: 8090spring:application:name: service-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:#开启服务发现功能,从注册中心获取服务列表,(nacos->服务管理->服务列表)#默认服务名称需要为大写,可以通过配置lower-case-service-id: true 改变这一规则enabled: false#配置服务名使用小写lower-case-service-id: trueroutes:# http://localhost:5000/usr/hello#路由标识(id:标识,具有唯一性)- id: consumer-service-api#目标服务地址(uri:地址,请求转发后的地址),会自动从注册中心获得服务的IP,不需要手动写死uri: lb://service-consumer#优先级,越小越优先#order: 999#路由条件(predicates:断言)predicates:# 路径匹配,- Path=/consumer/**filters:#路径前缀删除示例:请求/name/bar/foo,StripPrefix=2,去除掉前面两个前缀之后,最后转发到目标服务的路径为/foo#前缀过滤,请求地址:http://localhost:5000/usr/hello#此处配置去掉1个路径前缀,再配置上面的 Path=/usr/**,就将**转发到指定的微服务#因为这个api相当于是服务名,只是为了方便以后nginx的代码加上去的,对于服务提供者service-client来说,不需要这段地址,所以需要去掉- StripPrefix=1#配置配置
logging:level:#trace,debug,infoorg.pringframework.cloud.gateway: trace #便于跟踪调试,生产环境最好不用org.springframework.http.server.reactive: debugorg.springframework.web.reactive: debugreactor.ipc.netty: debug

2.2.3 动态路由

功能强,在新增服务时不需要重启网关

1)配置文件

# 自定义配置
# 自定义配置
nacos:dataId: gateway-config.jsongroup: GWC-GROUP#配置配置
logging:level:#trace,debug,info#便于跟踪调试,生产环境最好不用org.springframework.cloud.gateway: traceorg.springframework.http.server.reactive: debugorg.springframework.web.reactive: debugreactor.ipc.netty: debug

2)读取配置文件的中的配置信息

/*** 1. 保存Gateway(网关)中与nacos相关的属性* 2. 这些信息是自定义配置属性,它们保存在配置文件application.yml中*/
@Configuration
@Data
public class GatewayNacosProperties {@Value("${spring.cloud.nacos.discovery.server-addr}")private String serverAddr;@Value("${nacos.dataId}")private String dataId;@Value("${nacos.group}")private String group;}

3)实现实现动态路由

/*** 此类实现了Spring Cloud Gateway + nacos 的动态路由* 该类用于监听配置中心中的路由配置的变化,当监听到配置变化,则发布一个事件,* 用于更新本地路由信息。* 它实现一个Spring提供的事件推送接口ApplicationEventPublisherAware*/
@Component
public class DynamicRoutingConfig implements ApplicationEventPublisherAware {private final Logger logger = LoggerFactory.getLogger(DynamicRoutingConfig.class);@Autowiredprivate RouteDefinitionWriter routeDefinitionWriter;@Autowiredprivate GatewayNacosProperties gatewayNacosProperties;private ApplicationEventPublisher applicationEventPublisher;@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher = applicationEventPublisher;}/*** 这个方法主要负责监听Nacos的配置变化,这里先使用参数构建一个ConfigService,再使用ConfigService开启一个监听,* 并且在监听的方法中刷新路由信息。** @throws NacosException*/@Beanpublic void refreshRouting() throws NacosException {Properties properties = new Properties();properties.put(PropertyKeyConst.SERVER_ADDR, gatewayNacosProperties.getServerAddr());ConfigService configService = NacosFactory.createConfigService(properties);//获得nacos中已有的路由配置String json = configService.getConfig(gatewayNacosProperties.getDataId(), gatewayNacosProperties.getGroup(), 8090);this.parseJson(json);//添加监听器,监听nacos中的数据修改事件configService.addListener(gatewayNacosProperties.getDataId(), gatewayNacosProperties.getGroup(), new Listener() {@Overridepublic Executor getExecutor() {return null;}@Overridepublic void receiveConfigInfo(String configInfo) {logger.info(configInfo);parseJson(configInfo);}});}/*** 解析从nacos读取的路由配置信息(json格式)** @param json*/public void parseJson(String json) {logger.info("从Nacos返回的路由配置(JSON格式):" + json);List<RouteDefinition> routeArr = JSON.parseArray(json).toJavaList(RouteDefinition.class);for (RouteDefinition route : routeArr) {update(route);}}/*** 路由更新:* 1)先将原来的路由信息删除* 2)保存新的路由信息* @param routeDefinition* @return*/public void update(RouteDefinition routeDefinition) {try {this.routeDefinitionWriter.delete(Mono.just(routeDefinition.getId()));logger.info("删除原来的路由信息");} catch (Exception e) {logger.error(e.getMessage(), e);}try {routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe();this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));logger.info("路由更新成功");} catch (Exception e) {logger.error(e.getMessage(), e);}}}

4)在配置中心中配置路由信息

路由配置采用json格式,参考配置如下:

[{"id": "service-consumer","predicates": [{"name": "Path","args": {"_genkey_0": "/consumer/**"}}],"filters": [{"name": "StripPrefix","args": {"_genkey_0": "1"}}],"uri": "lb://service-consumer","order": 0}
]

需要根据自己的项目的具体情况配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_239681.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VuePress初学之利用模板theme创建一个个人博客网站

目录前言官方文档创建项目创建目录安装VuePress初始化项目创建文档修改package.json运行项目修改README.md的编码显示官方默认主题创建.vuepress文件创建config.js修改README.md补充logo资源运行效果更多默认主题配置开源主题vuepress-theme-reco安装脚手架初始化项目安装npm运…

10.2、Django入门--前台管理

文章目录1、URLconf 路由管理展示首页2、视图函数处理业务逻辑展示书籍的详细页3、模板管理实现好看的HTML页面3.1 模板引擎配置3.2 模板语法&#xff1a;变量3.3 模板语法: 常用标签3.4 主页与详情页前端HTML设计常用的HTML编写基础标题标签列表标签图片标签链接标签表格标签表…

RabbitMQ 第一天 基础 6 SpringBoot 整合RabbitMQ

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础6 SpringBoot 整合RabbitMQ6.1 SpringBoot 整合 RabbitMQ【生产者】6.1.1 生产者6.2 SpringBoot 整合 RabbitMQ【消费者】6.2.1 消费者6.3 小结第一天 基础 6 Spri…

day3-javascript

HTML的注释 CSS的注释 Javascript的注释是不一样的 JQuery JQuery是一个JavaScript的第三方模块 基于JQuery&#xff0c;自己开发一个功能。 现成的工具 依赖jQuery&#xff0c;例如BootStrap动态效果

Vue事件处理的基本使用

前言 事件处理在vue中也是非常重要的一项技术&#xff0c;它类似于js的事件处理&#xff0c;但是也有不同&#xff0c;下面就简单介绍一下在vue中如何进行事件使用以及一些要点 1 事件基本使用 在这里我们使用单击事件为例&#xff0c;简单讲讲在vue中单击事件的编写以及细节…

Spring Bean作用域

目录 什么是作用域呢 ? 那什么又是Spring Bean的作用域呢 ? Spring框架默认Bean作用域是什么呢 ? Spring Bean的作用域都有哪些呢 ? 如何设置Bean作用域 什么是作用域呢 ? 在JavaSE中,作用域就是指一个变量可生效的范围. 就比如一个变量的作用域是方法的代码块的范围…

将单向链表按照目标值value 划分成左边小,中间等,右边大的形式,给定一个单链表,判断单链表的值是否是回文结构【图文解释包你看懂】

将单向链表按照目标值value 划分成左边小&#xff0c;中间等&#xff0c;右边大的形式 例如 1 -> 3 -> 5-> 3 -> 7 按照value 3划分 1-> 3-> 3 -> 5 -> 7 解题思路&#xff1a;给定值为 value 用6个变量&#xff0c;分别表示 小于value 的Head sH &…

第11章_数据库的设计规范(理论了解)

第11章_数据库的设计规范 范式 2.3键和相关属性的概念 范式的定义会使用到主键和候选键&#xff0c;数据库中的键(Key)由一个或者多个属性组成。数据表中常用的几种键和属性的定义: 超键︰能唯─标识元组的属性集叫做超键。候选键︰如果超键不包括多余的属性&#xff0c;那…

WEB1.0起源:全球首个网站info.cern.ch

伯纳斯李&#xff08;图&#xff09;1990年创立第一个网站。 info.cern.ch是世上第一个网站&#xff0c;提供有关万维网的资料。 info.cern.ch这个网站依然运作如常。 英国科学家蒂姆伯纳斯-李 (Tim Berners-Lee) 于 1989 年在 CERN 工作期间发明了万维网 (WWW)。Web 最初的构思…

mqtt的使用与二次封装

前提&#xff1a;先安装Mosquitto并启动服务&#xff0c;可使用mqttx进行接收发送的测试。 Mosquitto以配置启动命令 mosquitto -c mosquitto.conf -v原文链接&#xff1a;mqtt的使用 本文为测试使用固无账号密码&#xff0c;可在原文查看 封装后实现效果&#xff0c;加入一个…

耗时二周,万字总结Maven简明教程,与君共勉!

什么是Mavne Maven 是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (POM&#xff1a;Project Object Model)&#xff0c;一组标准集合。由于 Maven 使用标准目录布局和默认构建生命周期&#xff0c;开发团队几乎可以立即自动化项目的构建基础设施。在多个开发团队环…

消息队列RabbitMQ学习笔记(四)死信队列和延迟队列

1. 死信的概念 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理 解&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或者直接到queue 里了&#xff0c;consumer 从 queue 取出消息 进行…

Linux 下 使用点阵在LCD上显示汉字,字符

文章目录前言一、显示字符1.获取点阵&#xff1a;2.描点&#xff08;显示字符函数&#xff09;&#xff1a;3. 要打开LCD设备&#xff1a;4. 通过ioctl 获取Framebuffer参数:5. 通过mmap映射出Framebuffer的地址&#xff1a;6.清屏并显示字符&#xff1a;二、显示汉字1.区位码&…

多线程基础入门

文章目录前言一、认识线程&#xff08;一&#xff09;概念1.线程是什么2.为啥要有线程&#xff08;轻量级进程&#xff09;为什么线程比进程更轻量经典面试题&#xff1a;谈谈进程和线程的区别和联系3.线程的结构&#xff08;二&#xff09;第一个多线程程序&#xff08;三&…

我国用电信息采集系统行业应用需求及市场容量分析 现6省上线运行

用户用电信息采集系统是通过对配电变压器和终端用户的用电数据的采集和分析&#xff0c;实现用电监控、推行阶梯定价、负荷管理、线损分析&#xff0c;最终达到自动抄表、错峰用电、用电检查&#xff08;防窃电&#xff09;、负荷预测和节约用电成本等目的。建立全面的用户用电…

RabbitMQ 第一天 基础 4 RabbitMQ 的工作模式 4.4 Topic 通配符模式 4.5 工作模式总结

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础4 RabbitMQ 的工作模式4.4 Topic 通配符模式4.4.1 模式说明4.4.2 代码编写4.4.3 小结4.5 工作模式总结第一天 基础 4 RabbitMQ 的工作模式 4.4 Topic 通配符模式 …

32天高效突击:开源框架+性能优化+微服务架构+分布式,面阿里获P7(脑图、笔记、面试考点全都有)

今年的大环境不佳&#xff0c;所以大部分的人在今年的招聘旺季都没有收获到好的结果。 但不要着急&#xff0c;今天分享的内容则是由 一位阿里P7的面试心得&#xff0c;通过32天的高效突击训练&#xff0c;成功拿下offer的学习方法。 篇章分为三大章节&#xff0c;可以根据自…

day 10 模拟和高精度

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 #include<bits/stdc.h> using namespace std; int n, na, nb, fa, fb;//f:得分 int a[205], b[205];void fun(int ta, int tb){if(ta 0 && tb 1) fb;if(ta 1 && tb 0) fa;if(ta 0 && tb …

【nowcoder】笔试强训Day2

目录 一、选择题 二、编程题 2.1排序子序列 2.2倒置字符串 一、选择题 1.A 派生出子类 B &#xff0c; B 派生出子类 C &#xff0c;并且在 java 源代码有如下声明&#xff1a; 1. A a0new A(); 2. A a1new B(); 3. A a2new C(); 问以下哪个说法是正确的&#xff08;&…

机器学习 | 线性回归

一.基本原理 利用回归方程&#xff08;函数&#xff09;对一个或多个自变量&#xff08;特征值&#xff09;和因变量&#xff08;目标值&#xff09;之间关系进行建模的一种分析方式 根据线性代数&#xff0c;我们可以定义方程 xwy&#xff0c;在线性回归问题中&#xff0c;x…