微服务之网关

Gateway,是系统的唯一对外的⼊入⼝口,介于客户端和服务器端之间的中间层,处理理非业务功能 提供路由请求、鉴权、监控、缓存、限流等功能

               微服务之网关

 SpringCloud Gateway

 基于Reactor+WebFlux

网关的使用:

网关是一个项目,需要新建一个模块module

1、添加依赖

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

2、连接到nacos负载均衡上拉取目标服务的信息

      可以解决负载均衡问题和微服务地址写死的问题。

在网关中添加完nacos依赖后,启动类开启client

@EnableDiscoveryClient

3、配置文件

server:
  port: 8888

spring:
  application:
    name: api-gateway
    
  cloud:
    nacod:
      discovery:
        service-addr: ip:port
        
    gateway:
      routes: #数组形式
        - id: order-service #路由唯⼀标识,一般写服务名称
        uri: lb://xdclass-order-service #从nacos进行转发,lb是负载均衡的意思
        order: 1 #优先级,数字越小优先级越高
        predicates: #断言 配置哪个路径才转发
          - Path=/order-server/**
        filters: #过滤器,请求在传递过程中通过滤器修改
          - StripPrefix=1 #去掉第一层前缀
      discovery:
        locator:
          enabled: true  # 开启网关拉取nacos的服务

网关的交互过程

交互过程:

        客户端向Spring Cloud Gateway发出请求
        如果网关处理程序映射确定请求与路由匹配
        则将其发送到网关Web处理理程序
        通过特定过滤器链运行,前置处理-后置处理

微服务之网关

 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了了各种路由匹配规则

断言的种类:Path、Query、Method、Header ------配置中predicates设置断言

利用网关中的内置断言实现接口的定时下线

在配置中设置before的值,

微服务之网关

配置完成后,超过这个时间就不能访问这个接口了

 springcloud的过滤器

局部过滤器GatewayFilter:应用在某个路由上,每个过滤器工厂都对应一个实现类,并且这些类的名称必须以GatewayFilterFactory 结尾
全局过滤器:作用全部路由上.

微服务之网关

 利用网关实现全局过滤器实现用户的鉴权

网关的第一职责是转发,不要加太多业务逻辑,否则会影响性能。

业务逻辑可以放在对应的微服务中

@Component
public class UserGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 业务逻辑
        String token = exchange.getRequest().getHeaders().getFirst("token");
        //TODO 根据业务开发对应的鉴权规则
        if(StringUtils.isEmpty(token)){  // token为空的时候
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        // 不为空的时候,继续往下执行
        return chain.filter(exchange);
    }

    // 过滤器的优先级,数字越小,优先级越高
    @Override
    public int getOrder() {
        return 0;
    }
}

 

上一篇:gateway-GatewayFilter Factory 过滤器工厂


下一篇:SpringCloud2020 Gateway+NACOS,503 Service Unavailable解决