0.1概念

cloud全家桶中有个很重要的组件就是网关,为微服务架构提供一种简单有效的统一的API路由管理方式。

在1.x版本中都是采用的Zuul网关,但在2.x版本中,zuul的升级一直跳票。SpringCloud最后自己研发了一个网关替代Zuul,那就是SpringCloud Gateway,Gateway是原zuul1.x版的替代。

SpringCloud Gateway使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。

主要功能:

反向代理

鉴权

流量控制

熔断

日志监控

官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/

微服务架构中网关位置:

0.2为什么选择Gateway?

SpringCloud Gateway具有如下特性:

SpringCloud Gateway与Zuul的区别:

0.3GateWay三大核心

Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由

Predicate(断言):如果请求满足断言规则,则进行相对应的路由

Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

总结:

web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。

predicate就是我们的匹配条件,而filter,就可以理解为一个无所不能的拦截器。

有了这两个元素,再加上目标uri,就可以实现一个具体的路由了。

0.4GateWay搭建

(1)创建Maven工程为网关(cloud-gateway-gateway9527)

(2)添加GateWay依赖

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

(3)application.yml

server:port: 9527
spring:application:name: cloud-gatewaycloud:gateway:routes:- id: payment_routh #路由的ID,要求唯一,建议配合服务名uri: http://localhost:8001   #匹配后提供服务的路由地址,这个是写死的地址predicates:- Path=/payment/get/**  #断言,路径相匹配的进行路由- id: payment_routh2uri: http://localhost:8001predicates:- Path=/payment/lb/**  #断言,路径相匹配的进行路由
#省略eureka配置

9527网关如何做路由映射?

看yml的的Path=/payment/get/**,跟controller里的访问地址是否一致。

(4)测试:

启动7001Eureka

cloud-provider-payment8001

9527网关

添加网关前:http://localhost:8001/payment/get/31,直接访问8001

添加网关后:http://localhost:9527/payment/get/31,让网关在前面挡一层,使用网关的ip加端口加controller层的访问地址

0.5GateWay通过微服务名称实现动态路由

默认情况下Gateway会根据注册中心的服务列表,以微服务名为路径创建动态路由进行转发,从而实现动态路由的功能。

(1)修改9527的application.yml,在gateway下加

discovery:locator:enabled: true  #开启从注册中心动态创建路由的功能,利用微服务名进行路由

(2)上面配置中的uri是写死的地址,现在可以使用下面的uri

cloud-payment-service是cloud-provider-payment8001的微服务名称

uri: lb://cloud-payment-service #匹配后提供服务的路由地址,需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能

(3)测试

启动7001Eureka、8001和8002服务提供者

访问:http://localhost:9527/payment/lb,8001和8002两个端口互相切换,负载均衡成功

0.6predicate(断言)的使用

- After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]:在该时间以后有效
- Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]:在该时间以前有效
- Between=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] ,  2020-03-08T10:59:34.102+08:00[Asia/Shanghai]:在这之间有效
- Cooie=username,zzyyCookie需要两个参数,Cookie name和正则表达式。路由规则会通过获取对应的Cooie name值和正则表达式去匹配。cmd后输入:http://localhost:9527/payment/lb没有带Cookie报错输入:http://localhost:9527/payment/lb --cookie "username=zzyy",成功访问
- Header=X-Request-Id, \d+:请求头中要有X-Request-Id属性并且值为整数的正则表达式cmd输入:http://localhost:9527/payment/lb -H "X-Request-Id:123"
- Host=**.atguigu.com:接收一组参数,一组匹配的域名列表,用,号做分隔符,通过参数中的主机地址作为匹配规则
- Method=GET:get请求才可以访问
- Query=username, \d+ #要有参数名称username并且值是正整数才能路由

0.7Filter(过滤)的使用

生命周期:在业务逻辑之前,在业务逻辑之后

种类:单一,全局

内置的太多了,自行百度

(1)案例:9527里

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("*********come in MyLogGateWayFilter: "+new Date());String uname = exchange.getRequest().getQueryParams().getFirst("uname"); //表示请求地址要带一个参数名为unameif(StringUtils.isEmpty(uname)){log.info("*****用户名为Null 非法用户,(┬_┬)");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//给人家一个回应return exchange.getResponse().setComplete();}return chain.filter(exchange); //给下一个filter链,或者放行}@Overridepublic int getOrder() {return 0; //优先级,越小优先级越高}
}

5.服务网关:GateWay相关推荐

  1. Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway

    转载自  Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使 ...

  2. SpringCloud 微服务网关Gateway 动态路由配置

    概述:在上一章节<SpringCloud 微服务网关Gateway介绍及简单路由配置>中我们讲述了Gateway的最简单的路由配置方式.但是其中比较明显的问题就是我们在配置路由服务的地址时 ...

  3. Spring Cloud之(十八)微服务网关GateWay

    十八.微服务网关GateWay Zuul 1.x 是一个基于阻塞 IO 的 API Gateway 以及 Servlet:直到 2018 年 5 月,Zuul 2.x(基于Netty,也是非阻塞的,支 ...

  4. SpringCloud—— 微服务网关GateWay

    目录 1.GateWay网关概述 1.1.什么是GateWay? 1.2.为什么要使用微服务网关? 1.3.Zuul与GateWay网关的区别? 2.快速入门 2.1.创建项目 2.2.配置yml文件 ...

  5. 博海拾贝--springcloud的组件及使用(3)服务网关 GateWay

    Srpingcloud 服务网关 GateWay 前言: Spring Cloud Gateway是springcloud官方推出的第二代网关框架,她包括转发.限流.熔断.权限校验等功能. 本文就来介 ...

  6. 微服务网关Gateway

    使用场景 不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会多次请求不同的微服务,增加了客户端 ...

  7. SpringCloud 微服务网关Gateway介绍及简单路由配置

    概述:什么是微服务网关?为了解决用户客户端在调用微服务系统中的多个消费者工程接口时,需要维护非常多的消费者应用接口地址等信息,以及可能存在不同应用见的调用跨域等问题,微服务网关组件随即出现.网关作为用 ...

  8. 微服务架构-服务网关(Gateway)-服务网关在微服务中的应用

    服务网关在微服务中的应用 我们将目光转向Spring Cloud应用的外围,讨论微服务架构下的各个模块如何对外提供服务. 1.对外服务的难题 微服务架构下的应用系统体系很庞大,光是需要独立部零的基础组 ...

  9. 微服务_服务网关(Gateway)

    目录 一.为什么需要网关 二.SpringCloud网关的实现方式 三.Gateway实践 1)创建gateway服务,引入依赖 2)编写启动类 3)编写基础配置和路由规则 4)重启测试 5)网关路由 ...

  10. 微服务网关Gateway(七)

    前言 zuul目前已经出现了分歧,zuul 升级到 Zuul2的时候出现了内部分歧,并且导致Zuul的核心人员的离职,导致Zuul2一直跳票,等了两年,目前造成的局面是Zuul已经没人维护,Zuul2 ...

最新文章

  1. 各种 Optimizer 梯度下降优化算法总结
  2. 【Origin】晨起忆梦
  3. 测开之路十五:构造函数、析构函数
  4. MySQL数据库az排序_RDS Mysql Single-AZ和Multi-AZ性能差异
  5. OriginPro 2021b SR1 9.8.5 for win 科学绘图完美中文版
  6. HBase regions分布不均匀的解决
  7. 为什么大多数人是穷人?
  8. Andriod编程之Environment类
  9. VMWare workstation Pro 14 For Linux key
  10. HBuilder实现WiFi调试Android
  11. CentOS 7.4 安装Teamviewer 14
  12. 【计组】超标量、超级流水线、超长指令字区别详解
  13. (Struts)ActionForm类及表单数据验证
  14. 沟通成本:信任,外包永远的痛——外包实践(65)
  15. 【我的OpenGL学习进阶之旅】学习OpenGL ES 3.0 的实战 Awsome Demo (下)之 图片转场和轮播特效专场
  16. CodeVS 1359 数字计数 51nod 1042 数字0-9的数量 Pascal
  17. 计算机启动修复取消,w7电脑启动修复无法进入操作系统怎么解决 w7系统取消启动修复的方法...
  18. 音乐歌单Android,[CloudReader]Android - 仿网易云音乐歌单详情页
  19. deepinV20一路艰辛系列六:更新微信到最新版本
  20. 如何查询澳大利亚药监局(TGA)药品信息数据

热门文章

  1. C语言自学路之将小写数字完美转换成大写数字
  2. java中的解耦_java-了解如何解耦
  3. 【解析】心田上的百合花开——心田花开
  4. JAVA java学习(9)——————java常用开发工具介绍
  5. 7-20 出生年 (10 分)
  6. SQL一对多,子表关联查询
  7. mixer: 一个用go实现的mysql proxy
  8. 大学生提高计算机应用能力,大学生计算机应用能力的培养
  9. linux:framebuffer驱动之ssd1363驱动和fbtft驱动修改
  10. ios-app杀死状态下响应推送