微服务技术栈-Gateway服务网关

文章目录

  • 前言
  • 一、为什么需要网关
  • 二、Spring Cloud Gateway
  • 三、断言工厂和过滤器
    • 1.断言工厂
    • 2.过滤器
    • 3.全局过滤器
    • 4.过滤器执行顺序
  • 四、跨域问题
  • 总结


前言

在之前的文章中我们已经介绍了微服务技术中eureka、nacos、ribbon、Feign这几个组件,接下来将介绍另外一个组件SpringCloud-Gateway,Gateway网关是我们服务的守门神,所有微服务的统一入口。


一、为什么需要网关

试着思考一下,我们后台的微服务是任何人都可以访问的吗?是否每个用户都有资格访问某个微服务?当微服务的数量越来越多时,我们该如何优雅的把每个请求转发到具体的某个微服务上?当请求的流量过大时,我们该如何泄洪?

因此我们需要一个网关服务,来帮助我们解决上述问题。

网关的核心功能特性

  • 请求路由:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
  • 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
  • 限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。
    在这里插入图片描述

二、Spring Cloud Gateway

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式,基于响应式编程的实现,具备更好的性能。。
下面,我们就来搭建一下Spring Cloud Gateway,其基本步骤如下:
1.创建SpringBoot工程gateway,引入网关依赖。
在这里插入图片描述

<!--网关-->
<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>
</dependency>

2.编写gateway启动类。

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

3.编写基础配置和路由规则。

server:port: 10010 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置- id: user-service # 路由id,自定义,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates: # 路由断言,也就是判断请求是否符合路由规则的条件#  - After=2037-01-20T17:42:47.789-07:00[America/Denver]- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

上述的配置信息:将符合Path 规则的一切请求,都代理到 uri参数指定的地址。本例中,我们将 /user/**开头的请求,代理到lb://userservice,lb是负载均衡,根据服务名拉取服务列表,实现负载均衡。
在这里插入图片描述


三、断言工厂和过滤器

1.断言工厂

predicates: # 路由断言,也就是判断请求是否符合路由规则的条件#  - After=2037-01-20T17:42:47.789-07:00[America/Denver]- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件,例如Path=/user/**是按照路径匹配,这个规则是由
org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的,像这样的断言工厂在SpringCloudGateway还有十几个,有兴趣的可以自己在SpringCloudGateway的文档中学习。
在这里插入图片描述

2.过滤器

介绍完断言的概念之后,接下来我们来介绍一下过滤器的概念。GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。
在这里插入图片描述
在这里插入图片描述
下面我们以请求头过滤器为例,给所有进入userservice的请求添加一个请求头。

spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置- id: user-service # 路由id,自定义,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates: # 路由断言,也就是判断请求是否符合路由规则的条件#  - After=2037-01-20T17:42:47.789-07:00[America/Denver]- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求filters: # 过滤器- AddRequestHeader=Truth, jinzihao is freaking awesome! # 添加请求头

注意:当前过滤器写在userservice路由下,因此仅仅对访问userservice的请求有效。接下来在方法中添加请求头参数,即可获取Truth的值。

@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id,@RequestHeader(value = "Truth",required = false)String truth) {System.out.println(truth);return userService.queryById(id);
}

如果要对所有的路由都生效,则可以将过滤器工厂写到default下,即默认过滤器。

spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/**default-filters: # 默认过滤项- AddRequestHeader=Truth, jinzihao is freaking awesome! 

总结:过滤器对路由的请求或响应做加工处理,配置在路由下的过滤器只对当前路由的请求生效,defaultFilters是对所有路由都生效的过滤器。

3.全局过滤器

SpringCloud-Gateway中提供了很多种过滤器,但每一种过滤器的作用都是固定的,如果我们希望拦截请求并做自己的业务逻辑,则可以使用全局过滤器。
全局过滤器的定义方式是实现GlobalFilter接口,并且重写里面的filter接口。

public interface GlobalFilter {/***  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理* @param exchange 请求上下文,里面可以获取Request、Response等信息* @param chain 用来把请求委托给下一个过滤器 * @return {@code Mono<Void>} 返回标示当前过滤器业务结束*/Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

4.过滤器执行顺序

请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter。
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器,过滤器的排序规则:

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

四、跨域问题

跨域:域名不一致就是跨域,主要包括以下两种情况:

  • 域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com
  • 域名相同,端口不同:localhost:8080和localhost:8081

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题。有关跨域问题的详情可以参考这篇文章跨域资源共享 CORS 详解

SpringCloud-Gateway解决跨域问题:在gateway服务的application.yml文件中,添加下面的配置。

spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置- id: user-service # 路由id,自定义,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates: # 路由断言,也就是判断请求是否符合路由规则的条件#  - After=2037-01-20T17:42:47.789-07:00[America/Denver]- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求filters: # 过滤器- AddRequestHeader=Truth, jinzihao is freaking awesome! # 添加请求头globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:'[/**]':allowedOrigins: # 允许哪些网站的跨域请求- "http://localhost:8090"- "http://www.leyou.com"allowedMethods: # 允许的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期

总结

在本篇文章中,我们又介绍了微服务技术栈的另外一个技术SpringCloud-Gateway,网关具有限流、路由、权限控制等作用,其重要性不言而喻,可以在更多实践中体会网关的魅力。


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

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

相关文章

合成数据在计算机视觉任务中的应用指南

今年早些时候&#xff0c;我与 Cognizant 深度学习协会团队的一位经理进行了交谈。 他的团队使用深度学习算法创建概念验证&#xff08;展示商业机会的试点项目&#xff09;。 他注意到他的团队面临的主要挑战之一是获取此类 POC 的数据。 获取特定于某个问题的具有良好代表性的…

雷达波束高度估计、折射分类、大气波导现象概念

一、雷达波束高度估计 雷达波束在地球大气层中的传播并非直线,而是受到大气层的影响呈现出一种弯曲的形态,这种现象称为大气折射。这是由于地球大气的密度并非均匀,从地面到高空,大气的密度逐渐减小,因此电磁波在穿过大气层时,会因大气密度的变化而改变传播方向,形成弯曲…

2000至2022年中国月度植被覆盖度产品

简介&#xff1a; 中国区域2000至2022年月度植被覆盖度产品的空间分辨率250米&#xff0c;合成方式采用月最大值合成。本产品采用基于归一化植被指数&#xff08;NDVI&#xff09;像元二分模型&#xff0c;根据土地利用类型确定纯植被像元值和纯裸土像元值&#xff0c;计算中去…

cereal:支持C++11的开源序列化库

cereal:支持C11的开源序列化库 文章目录 一&#xff1a;引言二、cereal简介三、cereal的下载和使用 一&#xff1a;引言 序列化 (Serialization) 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中&#xff0c;然后将其写入某个文件或是将它传输到网络中的另…

互联网图片安全风控实战训练营开营!

内容安全风控&#xff0c;即针对互联网产生的海量内容的外部、内部风险做宏观到微观的引导和审核&#xff0c;从内容安全领域帮助企业化解监管风险和社会舆论风险&#xff0c;其核心是识别文本、图片、视频、音频中的有害内容。 由于互联网内容类型繁杂、多如牛毛&#xff0c;加…

JVM技术文档--JVM诊断调优工具Arthas--阿里巴巴开源工具--一文搞懂Arthas--快速上手--国庆开卷!!

​ Arthas首页 简介 | arthas Arthas官网文档 Arthas首页、文档和下载 - 开源 Java 诊断工具 - OSCHINA - 中文开源技术交流社区 阿丹&#xff1a; 之前聊过了一些关于JMV中的分区等等&#xff0c;但是有同学还是在后台问我&#xff0c;还有私信问我&#xff0c;学了这些…

三维模型3DTile格式轻量化的纹理压缩和质量关系分析

三维模型3DTile格式轻量化的纹理压缩和质量关系分析 在三维模型的3DTile格式轻量化处理中&#xff0c;纹理压缩是一个重要环节。但是&#xff0c;纹理压缩和模型质量之间存在明显的关系需要权衡。以下是纹理压缩和模型质量关系的详细分析&#xff1a; 1、压缩率与纹理质量&…

【UE】在游戏运行时,通过选择uasset来生成静态网格体

目录 主要流程 步骤 一、创建用于包含静态网格体的Actor蓝图 二、按钮点击事件 效果 主要流程 用户点击按钮后产生一个文件对话框&#xff0c;用户通过文件对话框选择指定的文件夹&#xff0c;我们获取到这个文件夹路径后处理成“按路径获取资产”节点所需的输入&#x…

【开发篇】二十、SpringBoot整合RocketMQ

文章目录 1、整合2、消息的生产3、消费4、发送异步消息5、补充&#xff1a;安装RocketMQ 1、整合 首先导入起步依赖&#xff0c;RocketMQ的starter不是Spring维护的&#xff0c;这一点从starter的命名可以看出来&#xff08;不是spring-boot-starter-xxx&#xff0c;而是xxx-s…

【源码】hamcrest 源码阅读 空对象模式、模板方法模式的应用

文章目录 前言1. 类图概览2. 源码阅读2.1 抽象类 BaseMatcher2.1 接口 Description提炼模式&#xff1a;空对象模式 2. 接口 Description 与 SelfDescribing 配合使用提炼模式 模板方法 后记 前言 hamcrest &#xff0c;一个被多个测试框架依赖的包。听说 hamcrest 的源码质量…

STM32 DMA从存储器发送数据到串口

1.任务描述 &#xff08;1&#xff09;ds18b20测量环境温度存储到存储器&#xff08;数组&#xff09;中。 &#xff08;2&#xff09;开启DMA将数组中的内容&#xff0c;通过DMA发送到串口 存在问题&#xff0c;ds18b20读到的数据是正常的&#xff0c;但是串口只是发送其低…

机器学习7:pytorch的逻辑回归

一、说明 逻辑回归模型是处理分类问题的最常见机器学习模型之一。二项式逻辑回归只是逻辑回归模型的一种类型。它指的是两个变量的分类&#xff0c;其中概率用于确定二元结果&#xff0c;因此“二项式”中的“bi”。结果为真或假 — 0 或 1。 二项式逻辑回归的一个例子是预测人…

Scala第十七章节

Scala第十七章节 scala总目录 文档资料下载 章节目标 了解集合的相关概念掌握Traversable集合的用法掌握随机学生序列案例 1. 集合 1.1 概述 但凡了解过编程的人都知道程序 算法 数据结构这句话, 它是由著名的瑞士计算机科学家尼古拉斯沃斯提出来的, 而他也是1984年图灵…

车险计算器微信小程序源码 带流量主功能

车险计算器微信小程序源码带流量主功能&#xff0c;可以精准的算出车险的书目&#xff0c;是一个非常实用的微信小程序源码。 简单的计算让你得知车险价值 另外也支持流量主&#xff0c;具体小编也就不多说了&#xff0c;大家自己搭建研究吧。 源码下载&#xff1a;https://d…

React xlsx(工具库) 处理表头合并

前端导出excel表格 引入xlsx插件&#xff0c;不然应该是运行不起来的 npm i xlsx xlsx中文文档 插件2 exceljs npm i exceljs exceljs中文文档 导出 例子 import { ExportExcel } from ./exportExcel/index;const columns[{title: id,dataIndex: item1,},{title: 序号,dataInd…

开环模块化多电平换流器仿真(MMC)N=6(Simulink仿真)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

RabbitMQ之Fanout(扇形) Exchange解读

目录 基本介绍 适用场景 springboot代码演示 演示架构 工程概述 RabbitConfig配置类&#xff1a;创建队列及交换机并进行绑定 MessageService业务类&#xff1a;发送消息及接收消息 主启动类RabbitMq01Application&#xff1a;实现ApplicationRunner接口 基本介绍 Fa…

12.1 使用键盘鼠标监控钩子

本节将介绍如何使用Windows API中的SetWindowsHookEx和RegisterHotKey函数来实现键盘鼠标的监控。这些函数可以用来设置全局钩子&#xff0c;通过对特定热键挂钩实现监控的效果&#xff0c;两者的区别在于SetWindowsHookEx函数可以对所有线程进行监控&#xff0c;包括其他进程中…

Spring Cloud Gateway2之路由详解

Spring Cloud Gateway路由 文章目录 1. 前言2. Gateway路由的基本概念3. 三种路由1. 静态路由2. 动态路由1. 利用外部存储2. API动态路由 3. 服务发现路由(自动路由)3.1. 配置方式3.2 自动路由&#xff08;服务发现&#xff09;原理核心源码GatewayDiscoveryClientAutoConfigur…

机器学习算法基础--KNN分类算法

文章目录 1.KNN算法原理介绍2.KNN分类决策原则3.KNN度量距离介绍3.1.闵可夫斯基距离3.2.曼哈顿距离3.3.欧式距离 4.KNN分类算法实现5.KNN分类算法效果6.参考文章与致谢 1.KNN算法原理介绍 KNN&#xff08;K-Nearest Neighbor&#xff09;工作原理&#xff1a; 在一个存在标签的…