为什么需要网关

网关功能:

  1. 身份认证和权限校验
  2. 服务路由、负载均衡
  3. 请求限流

在SpringCloud中网关的实现包括两种:

  • Zuul:基于Servlet的实现,属于阻塞式编程。
  • SpringCloudGateway:是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

Gateway快速入门

搭建网关服务

步骤1:创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:

<!--网关依赖-->
<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:编写路由配置及nacos地址

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: # 路由断言,也就是判断请求是否符合路由规则的条件- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

路由配置包括:

  1. 路由id:路由的唯一标示
  2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
  3. 路由断言(predicates):路由断言,判断请求是否符合要求,符合则转发到路由目的地
  4. 路由过滤器(filters):对请求或响应做处理

路由断言工厂(Route Predicate Factory)

  • 路由断言(predicates):路由断言,判断请求是否符合要求,符合则转发到路由目的地。
  • 配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
  • 例如Path=/user/**是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的

SpringCloudGateway中的断言工厂:

名称

说明

示例

After

是某个时间点后的请求

- After=2037-01-20T17:42:47.789-07:00[America/Denver]

Before

是某个时间点之前的请求

- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

Between

是某两个时间点之前的请求

- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]

Cookie

请求必须包含某些cookie

- Cookie=chocolate, ch.p

Header

请求必须包含某些header

- Header=X-Request-Id, \d+

Host

请求必须是访问某个host(域名)

- Host=**.somehost.org,**.anotherhost.org

Method

请求方式必须是指定方式

- Method=GET,POST

Path

请求路径必须符合指定规则

- Path=/red/{segment},/blue/**

Query

请求参数必须包含指定参数

- Query=name, Jack或者- Query=name

RemoteAddr

请求者的ip必须是指定范围

- RemoteAddr=192.168.1.1/24

Weight

权重处理

可跟踪官方文档获取最新支持:


过滤器工厂

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

Spring提供了30+种不同的路由过滤器工厂: Spring Cloud Gateway

过滤器执行顺序:

  • 请求进入网关会碰到三类过滤器:当前路由的过滤器、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和localhost8081

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

解决方案:CORS

spring:cloud:gateway:globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:'[/**]':allowedOrigins: # 允许哪些网站的跨域请求- "http://localhost:8090"- "http://www.xxx.com"allowedMethods: # 允许的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期

「微服务系列」统一网关Gateway相关推荐

  1. 「微服务系列」微服务框架的介绍

    为什么要学习微服务框架知识? 从求知的角度.企业的角度,微服务都是必知必会的! 需要学习哪些微服务知识? 传统单点架构,无法承载高并发场景:微服务领域按功能模块,将应用拆分成多个服务.大型企业可能拆分 ...

  2. 「微服务系列 13」熔断限流隔离降级

    我们知道微服务分布式依赖关系错综复杂,比方说前端的请求转化为后端调用的服务请求,一个前端请求会转为成很多个后端调用的服务请求,那么这个时候后台的服务出现不稳定或者延迟,如果没有好的限流熔断措施,可能会 ...

  3. 架构设计之「 微服务入门 」

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 奎哥 来源 | 不止思考 微服务这几年不可谓不火,很多技术团队都开始在自己的项目上引入了微服务.一方面这些团队确实很好的推动了微服务 ...

  4. 架构演进之「微服务架构」

    "为什么要搞「微服务架构」"?这也是我们当初讨论的聚焦点.现在天天把"微服务"挂在嘴边的人很多,但是有多少人真正深入思考过"为什么",我认为 ...

  5. 基于go-micro微服务的实战-实现网关Gateway(三)

    基于go-micro微服务的实战-实现网关Gateway(三) 文章最后附带完整代码 基于go-micro实现网关层 创建好网关层目录 common: 公告模块,配置初始化等 conf: 配置文件 h ...

  6. 「springcloud 2021 系列」Spring Cloud Gateway + OAuth2 + JWT 实现统一认证与鉴权

    通过认证服务进行统一认证,然后通过网关来统一校验认证和鉴权. 将采用 Nacos 作为注册中心,Gateway 作为网关,使用 nimbus-jose-jwt JWT 库操作 JWT 令牌 理论介绍 ...

  7. 「微服务架构」基于NGINX的三种微服务参考架构

    作者注:本博文是系列文章的第一篇: Introducing the NGINX Microservices Reference Architecture (this post) MRA, Part 2 ...

  8. 同事操作两个数据源保持事务一致_「微服务架构」微服务架构中的数据一致性...

    在微服务中,一个逻辑上原子操作可以经常跨越多个微服务.即使是单片系统也可能使用多个数据库或消息传递解决方案.使用多个独立的数据存储解决方案,如果其中一个分布式流程参与者出现故障,我们就会面临数据不一致 ...

  9. 「微服务架构」亚马逊引领其自有微服务架构的原因

    "新堆栈"的真实故事,一次又一次,是关于具有巨大服务器需求的公司如何受到现有架构无法满足这些需求的限制,如何为自己解决问题,然后转而将其解决方案转售给 剩下的世界. 我们多么快地忘 ...

最新文章

  1. JSP+Servlet+JavaBean
  2. 特殊权限控制之SUID、SGID、Sticky及facl
  3. ASP.NET中实现Flash与.NET的紧密集成(转,没看,有空研究一下)
  4. Base64加解密的实现方式
  5. RocketMQ 常见面试题
  6. 获取props里面的数据_Kafka 使用Java实现数据的生产和消费demo
  7. 运行linux中degui_Windows与Linux合二为一?终于能在windows上运行Linux了!
  8. C#执行osql脚本时部分脚本未执行
  9. redis.conf
  10. 深入理解 MapReduce
  11. tjh_pipeline_tools Maya工具盒 1.2.1 下载及教程 动画影视团队工具共享系统
  12. 产生式系统有哪几种推理方式?各自的特点?
  13. 水利系统防雷,如何做好洪水预报警报系统的雷电防护
  14. Java银行账户管理系统实验总结
  15. 凑微分公式_不定积分的计算凑微分法.ppt
  16. 高盛为什么认为中国AI领域将超越美国?
  17. 支付宝广告投放形式有哪些?支付宝广告的投放方向!
  18. Turtle 画方形 画圆 画三角形
  19. 小米校招 C++研发 相机部 一二面
  20. 单片机编程系列之分层设计2(怎样合理拆分子系统)

热门文章

  1. Vue+vant使用uploader上传图片
  2. tar 解压指定文件,解压到指定文件夹
  3. Word转pdf一个方法就可以完成~手机电脑都可以免费使用~办公必备
  4. Android制作圆形背景
  5. 如何将 elasticsearch 版本从 openshift-logging 4.2.36 降级到 v4.2.29
  6. 安卓WebView的那些坑
  7. MySQL 更新某个字段的值加1 是有前提条件的(非auto_increament)
  8. 百度携手重庆渝中区,打造区块链大数据智能化应用示范城区
  9. iOS自动打包,并上传蒲公英
  10. 相似图片搜索、算法、识别的原理解析(上)