微服务——Gateway网关

  • Post author:
  • Post category:其他


为什么需要网关

搭建网关服务

编写启动类

@SpringBootApplication
public class GateWayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GateWayApplication.class,args);

    }



断言 : 可以理解为布尔(是或否 true or false)

三,路由断言工厂 Route Predicate Factory

断言工厂的作用为 读取用户配置的断言规则而后解析成判断条件,为将来用户请求进来做条件。

如设置禁止某ip登录的 RemoteAddr ,某时间段登录的Between等;


官网内(spring.io)都有文档实例

例子:before

server:
  port: 10010 # 网关端口
spring:
  application:
    name: gateway # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos地址
    gateway:
      routes: # 网关路由配置
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
        - id: user-service # 路由id 自定义 只要唯一即可
          # url:http//127.0.0.1:8081
          uri: lb://userservice # 路由的目标地址 lb是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/** #这个是按照路径匹配 只要以user开头就符合要求
            - Before=2027-01-20T17:42:47.789-07:00[America/Denver]

四,过滤器(Filter)

gatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。

在断言同级下添加filters

 filters:
#            - AddRequestHeader=12345678,abcdefghigk

在对应的服务中添加以下内容

/**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id,@RequestHeader(value = ("12345678"),required = false)String Header) {
        System.out.println(Header);
        return userService.queryById(id);
    }

@RequestHeader(vlaue =(),required= false(有没有请求头都可以正常运行,不加的话会出问题 )最后定义String   输出即可获取

默认过滤器

全局过滤器

首先全局过滤器要更加灵活 (因为默认过滤器和filter是下载配置中的)

GlobalFilter中只有一个filter方法然后其具有两个参数:

exchange 请求进入网关后到离开网关整个流程中都可以共享exchange 请求上下文 无论是request 还是response都可以获取还可以存取其它信息。

chain过滤器链 不是只有一个过滤器还有其他的 主要是放行(调用这里的chain 等于处理结束)。

一个简单的案例(只是试着拦截一下请求数据中的authorization)

@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        //2.获取参数中的authorization的参数
        String auth = queryParams.getFirst("authorization");
        //3.获取参数值是否为admin
        if("admin".equals(auth)) {
            //4.是,放行
            return chain.filter(exchange);
        }
        //5.否,拦截
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }
}

@component 把方法注入spring容器 成为一个组件

@order 过滤器顺序 越小优先级越高 (因为不只有一个过滤器)

过滤器顺序

order值相同的情况下

默认>路由>全局



版权声明:本文为xujiangyu1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。