• 微服务04-Gateway网关


    作用

    身份认证:用户能不能访问

    服务路由:用户访问到那个服务中去

    负载均衡:一个服务可能有多个实例,甚至集群,负载均衡就是你的请求到哪一个实例上去

    在这里插入图片描述
    ·请求限流功能:对请求进行流量限制,对服务进行请求限制

    两种网关实现:

    在这里插入图片描述

    搭建网关

    在这里插入图片描述

    流程

    1.首先咱们先将服务以及网关注册到Nacos注册中心;
    2.然后用户请求,网关路由进行判断地址是不是以/user或者/order开头的,如果是,则跳转路由目标地址uri,然后请求地址则会代理到userservice或者是orderservice,
    3.然后再从Nacos注册中心里根据服务orderservice或者是xxxservice找到对应的地址,
    4.最后根据负载均衡找到实例

    在这里插入图片描述
    1.创建gateway网关模块

    2.导入nacos服务发现依赖和gateway依赖,说明是个网关

    3.然后进行配置文件的配置,配置服务的信息以及地址将其注册到Nacos中。还有路由的信息(1.路由标示2.目标地址3.路由断言)

    server:
      port: 10010
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          server-addr: localhost:80  #nacos地址  (因为我在上一章中还是使用的nacos集群启动 Nginx反向代理的 端口是80  正常的话是8848 )
        gateway:
          routes:
            - id: user-service # 路由标示,必须唯一
              uri: lb://userservice # 路由的目标地址
              predicates: # 路由断言,判断请求是否符合规则
                - Path=/user/** # 路径断言,判断路径是否以/user开头,如果是则符合,跳转路由
     
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    然后我们访问10010端口,断言predicate设置的path路径正确即可访问
    在这里插入图片描述

    路由断言

    Predicate作用:将断言规则解析成条件作为请求过来的判断

    在这里插入图片描述
    在这里插入图片描述

    server:
      port: 10010
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          server-addr: localhost:8848 #nacos地址
        gateway:
          routes:
            - id: user-service # 路由标示,必须唯一
              uri: lb://userservice # 路由的目标地址
              predicates: # 路由断言,判断请求是否符合规则
                - Path=/user/** # 路径断言,判断路径是否以/user开头,如果是则符合,跳转路由
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
                - After=2022-05-14T15:14:47.433+08:00[Asia/Shanghai] # (这个时间点之后的才能访问)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    Gateway中的路由过滤器配置

    在这里插入图片描述
    过滤器可以对于请求进行过滤:比如请求头请求体请求参数…
    也可以对响应进行过滤,给到用户服务想给的内容

    在这里插入图片描述

    过滤器案例 :加请求头

    1.我们直接在配置文件中进行配置即可:

    第一种:在路由中配置(这是一个服务的范围,对于访问这个服务会有过滤)

    第二种:与routes范围一样,是对于整个全局的,所有服务;

     gateway:
          routes:
            - id: user-service # 路由标示,必须唯一
              uri: lb://userservice # 路由的目标地址
              predicates: # 路由断言,判断请求是否符合规则
                - Path=/user/** # 路径断言,判断路径是否以/user开头,如果是则符合,跳转路由
     
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
              filters: # 过滤器添加一个请求头
                - AddRequestHeader=Truth,Itcast is freaking aowsome!
          default-filters: # 对所有路由生效
            - AddRequestHeader=Truth,Itcast is freaking awesome!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这里我们对用户服务增加一个请求头信息,访问localhost:10010/user/1,服务器就会打印过滤器中的信息

      @GetMapping("/{id}")
        public User queryById(@PathVariable("id") Long id,
                              @RequestHeader(value="Truth",required = false) String truth) {
            System.out.println("truth:"+truth);
            return userService.queryById(id);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果:
    在这里插入图片描述

    全局过滤器

    作用:处理一切进入网关的请求和微服务的响应,与GatewayFilter的作用一样

    与GatewayFilter区别:前者通过自定义配置可以处理逻辑,后者的逻辑需要自己写代码实现;

    在这里插入图片描述

    案例:定义全局过滤器,拦截用户判断身份

    在这里插入图片描述

    步骤:

    我们直接定义一个全局过滤器即可,实现GlobalFilter

    package cn.itcast.gateway;
     
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.core.annotation.Order;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.server.reactive.ServerHttpRequest;
    import org.springframework.stereotype.Component;
    import org.springframework.util.MultiValueMap;
    import org.springframework.web.server.ServerWebExchange;
    import reactor.core.publisher.Mono;
     
    /**
     * @author diao 2022/5/9
     */
    @Order(-1)
    @Component
    public class AuthorizeFilter implements GlobalFilter {
     
        /**
         *
         * @param exchange:里面有request和response
         * @param chain:过滤器链
         * @return
         */
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            ServerHttpRequest request = exchange.getRequest();
            //1.得到request中的所有参数
            MultiValueMap<String, String> params = request.getQueryParams();
     
            //2.获取里面含有authorization的参数
            String auth = params.getFirst("authorization");
     
            //3.判断参数是否符合:authorization==admin
            if("admin".equals(auth)){
                return chain.filter(exchange);
            }
     
            //4.进行拦截,并且设置响应状态码
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    当request请求参数authorization!=admin,被拦截的情况

    在这里插入图片描述
    当加上请求参数,并且值符合
    在这里插入图片描述
    总结:

    跟Gateway过滤器最大的区别就是,它可以自定义

    在这里插入图片描述

    过滤器执行顺序

    在这里插入图片描述
    可以发现GlobalFilter和DefaultFilter、当前路由器是同一种

    在这里插入图片描述

    执行顺序注意事项:

    1.order值越小优先级越高,优先看order值

    2.当order值一样时,顺序好似defaultFilter优先,因为它是排在路由routes

    在这里插入图片描述

    跨域请求处理

    跨域:域名不一致

    端口不一致:8080与8081

    跨域问题:浏览器禁止请求的发起者与服务端发生跨域的ajax请求,请求被浏览器拦截的问题——>像我们之前的订单服务调用用户服务就不属于跨域问题;

    CORS方案:

    模板:

      globalcors: # 全局的跨域处理
            add-to-simple-url-handler-mapping: true # 网关放行请求
            cors-configurations:
              '[/**]':
                allowedOrigins: # 允许哪些网站跨域请求
                  - "http://localhost:8090"
                  - "http://www.leyou.com"
                allowedMethods: #运行跨域ajax的请求方式
                  - "GET"
                  - "POST"
                  - "DELETE"
                  - "PUT"
                allowedHeaders: "*" #允许在请求中有头信息
                allowCredentials: true # 是否允许携带cookie
                maxAge: 3600
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    对比于寻常的nginx,除了负载均衡之外,我们的gateway可以对异常进行统一处理,包括权限设置,跨域等等; 主要是通过nacos中拉去服务,通过服务名称进行拉取

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    设计模式之模板方法模式
    Midjourney学习(四)光源类型prompt
    Reinforcement Learning 强化学习(四)
    【Linux篇】第十七篇——信号量
    数据结构之查找(分块查找)
    多元函数的偏导数
    STM32玩转物联网实战篇:5.ESP8266 WIFI模块MQTT通信示例详解
    专注区块链底层技术突破,“复杂美”用技术开源推动产业未来
    Fastweb - Lua操作SQLite数据库
    Linux-Vi和 Vim编辑器
  • 原文地址:https://blog.csdn.net/weixin_67201964/article/details/132742016