Gateway
Posted mty072788
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gateway相关的知识,希望对你有一定的参考价值。
Gateway网关是我们服务的守门神,所有微服务的统一入口。
网关的核心功能特性:
请求路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。
简单使用(网关本身也是一种服务,需要注册到注册中心,才能从注册中心发现其他在注册中心的服务)
- 引依赖 spring-cloud-starter-gateway spring-cloud-starter-alibaba-nacos-discovery
- 启动类
- 配置文件:
点击查看代码
spring:
cloud:
gateway:
routes: #路由
- id: #路由id,自定义,唯一即可。 这里的 "-" ,代表的数组或者集合(反正就是多个的意思),因为路由规则可以有多个
uri: lb://user-server # "lb",负载均衡,后面跟服务名称
predicates: #路由断言,按照以下路径匹配,只要符合要求就路由到 uri
- Path=/user/** # "-" 代表有多个该属性(这里是 Path), - Path=/user/**。 **注意大小写, Path** 。断言规则只是字符串,符合yaml的写法
全局过滤器:
gateway包括 route 和 filter。用户要访问服务,发请求到网关,然后根据路由断言匹配到设置的服务,但在这之前必须要经过 过滤器的过滤处理。
网关提供了31种过滤器,但每一种过滤器的作用都是固定的。如果我们希望拦截请求,做自己的业务逻辑则没办法实现。
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。
自定义全局过滤器的方式是 实现 GlobalFilter接口,然后在实现方法 Mono
Mono
处理当前请求,有必要的话通过@link GatewayFilterChain将请求交给下一个过滤器处理
@param exchange 请求上下文,里面可以获取Request、Response等信息
@param chain 用来把请求委托给下一个过滤器
@return @code Mono
**请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter,一般优先规则是 默认>路由>全局。
每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。
**
关于跨域问题, 解决方案推荐 CORS 即可
nacos+gateway服务的配置
参考技术A 1、pom文件中引入的依赖gateway包:网关服务的主要依赖
alibaba-nacos-discovery包:nacos的发现注册功能组件,在子服务启动类添加注解@EnableDiscoveryClient,就可以把服务注册到nacos中。
alibaba-nacos-config包:nacos的配置功能组件,添加后服务可以动态的从nacos中读取配置。
2、配置文件
配置组件的数据应该配在bootstrap.yml文件,而不是application.yml当中。因为两者的加载时机不同,bootstrap在程序引导阶段读取,而application在加载配置阶段读取。因为配置文件需要在加载配置阶段之前获取,所以bootstrap中写入引用配置的nacos地址,命名空间,还有dataId的参数。
在application中配入路由的断言规则,和注册发现的nacos服务地址。
3、跨域配置。
创建过滤器CorsWebFilter,并添加@Bean注解,让服务启动时创建此类。
以上是关于Gateway的主要内容,如果未能解决你的问题,请参考以下文章