5.服务网关:GateWay
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相关推荐
- Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway
转载自 Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使 ...
- SpringCloud 微服务网关Gateway 动态路由配置
概述:在上一章节<SpringCloud 微服务网关Gateway介绍及简单路由配置>中我们讲述了Gateway的最简单的路由配置方式.但是其中比较明显的问题就是我们在配置路由服务的地址时 ...
- Spring Cloud之(十八)微服务网关GateWay
十八.微服务网关GateWay Zuul 1.x 是一个基于阻塞 IO 的 API Gateway 以及 Servlet:直到 2018 年 5 月,Zuul 2.x(基于Netty,也是非阻塞的,支 ...
- SpringCloud—— 微服务网关GateWay
目录 1.GateWay网关概述 1.1.什么是GateWay? 1.2.为什么要使用微服务网关? 1.3.Zuul与GateWay网关的区别? 2.快速入门 2.1.创建项目 2.2.配置yml文件 ...
- 博海拾贝--springcloud的组件及使用(3)服务网关 GateWay
Srpingcloud 服务网关 GateWay 前言: Spring Cloud Gateway是springcloud官方推出的第二代网关框架,她包括转发.限流.熔断.权限校验等功能. 本文就来介 ...
- 微服务网关Gateway
使用场景 不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会多次请求不同的微服务,增加了客户端 ...
- SpringCloud 微服务网关Gateway介绍及简单路由配置
概述:什么是微服务网关?为了解决用户客户端在调用微服务系统中的多个消费者工程接口时,需要维护非常多的消费者应用接口地址等信息,以及可能存在不同应用见的调用跨域等问题,微服务网关组件随即出现.网关作为用 ...
- 微服务架构-服务网关(Gateway)-服务网关在微服务中的应用
服务网关在微服务中的应用 我们将目光转向Spring Cloud应用的外围,讨论微服务架构下的各个模块如何对外提供服务. 1.对外服务的难题 微服务架构下的应用系统体系很庞大,光是需要独立部零的基础组 ...
- 微服务_服务网关(Gateway)
目录 一.为什么需要网关 二.SpringCloud网关的实现方式 三.Gateway实践 1)创建gateway服务,引入依赖 2)编写启动类 3)编写基础配置和路由规则 4)重启测试 5)网关路由 ...
- 微服务网关Gateway(七)
前言 zuul目前已经出现了分歧,zuul 升级到 Zuul2的时候出现了内部分歧,并且导致Zuul的核心人员的离职,导致Zuul2一直跳票,等了两年,目前造成的局面是Zuul已经没人维护,Zuul2 ...
最新文章
- 各种 Optimizer 梯度下降优化算法总结
- 【Origin】晨起忆梦
- 测开之路十五:构造函数、析构函数
- MySQL数据库az排序_RDS Mysql Single-AZ和Multi-AZ性能差异
- OriginPro 2021b SR1 9.8.5 for win 科学绘图完美中文版
- HBase regions分布不均匀的解决
- 为什么大多数人是穷人?
- Andriod编程之Environment类
- VMWare workstation Pro 14 For Linux key
- HBuilder实现WiFi调试Android
- CentOS 7.4 安装Teamviewer 14
- 【计组】超标量、超级流水线、超长指令字区别详解
- (Struts)ActionForm类及表单数据验证
- 沟通成本:信任,外包永远的痛——外包实践(65)
- 【我的OpenGL学习进阶之旅】学习OpenGL ES 3.0 的实战 Awsome Demo (下)之 图片转场和轮播特效专场
- CodeVS 1359 数字计数 51nod 1042 数字0-9的数量 Pascal
- 计算机启动修复取消,w7电脑启动修复无法进入操作系统怎么解决 w7系统取消启动修复的方法...
- 音乐歌单Android,[CloudReader]Android - 仿网易云音乐歌单详情页
- deepinV20一路艰辛系列六:更新微信到最新版本
- 如何查询澳大利亚药监局(TGA)药品信息数据