一、网关是什么?有什么用?
在微服务架构中,一个模块可能会部署到多个不同地址的服务器上,比如一个item模块,它的端口号可能有8081、8082等。如果是以前,当用户发送请求时只能指定发送给某一个地址,但是网关可以帮我们进行转发请求到对应的地址或端口上,同时帮我们实现负载均衡
二、网关和Nacos有什么区别?
网关主要负责接收和处理外部请求,对请求进行路由、过滤、认证、限流等操作,将请求合理地分发到后端的各个微服务实例上;Nacos主要用于服务的注册和发现,帮助开发人员管理服务的生产者和消费者
三、提示
使用网关服务,通常需要创建一个网关的模块(像别的模块一样),然后在网关模块添加依赖,并在网关的application.yml填写对应的配置信息,启动网关application之后才能使用
使用方法
①创建网关项目
②添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
③修改配置文件application.yml,配置网关路由
server:port: 8080 //网关服务的
spring:application:name: gatewaycloud:nacos:server-addr: localhost:8848gateway:routes:- id: item uri: lb://item-service predicates: - Path=/items/**,/search/** filters:- AddRequestHeader=X-Request-red, blue- id: carturi: lb://cart-servicepredicates:- Path=/carts/**......
id(必填)是路由唯一标识,不能重复
uri(必填)就是路由到哪个服务 对应服务的url,通常前面加 lb 让其负载均衡
predicates(必填)是路由断言,路由断言有很多种规则,比如path、method等,用户的请求必须满足所有的路由断言才会转发到对应的服务
filters(选填)是过滤器,会在拦截请求后对请求做一定操作后再转发
四、过滤器
当一个请求到达网关的时候,首先他会根据路径断言匹配对应的route,然后加载这个route下对应的filters,逐个遍历对应的过滤器,所以我们可以自定义一些过滤器添加到filters,比如我们要做登录校验功能,就是添加到这里
过滤器又分为两类:
GlobalFilter
:全局过滤器,作用范围是所有路由,不可配置
GatewayFilter
:路由过滤器,作用范围比较灵活,可以是任意指定的路由
自定义路由过滤器:
如下:自定义一个类实现AbstractGatewayFilterFactory,同时该类的名称一定要以GatewayFilterFactory为后缀(因为前缀是你到时候要添加到route的)
@Component
public class PrintAnyGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {@Overridepublic GatewayFilter apply(Object config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取请求ServerHttpRequest request = exchange.getRequest();// 编写过滤器逻辑System.out.println("过滤器执行了");// 放行return chain.filter(exchange);}};}
}
写完这个自定义路由过滤器后如此在application.yml中配置使用
spring:cloud:gateway:default-filters:- PrintAny # 此处直接以自定义的GatewayFilterFactory类名称前缀类声明过滤器
自定义全局过滤器类似,其实两者就是新建一个过滤器类,继承自带的过滤器类,在里面设置具体的过滤器规则,并在网关的yml里进行相应的配置,明白原理之后具体的细节问gpt即可