• Getaway


    Getaway

    依赖和基本配置

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    server:
      port: 8888
    spring:
      application:
        name: api-gateway
      cloud:
        gateway:
          routes: #数组形式 所以可以配置多个  
            - id: order-service #路由唯⼀标识  一般是要转发的服务名
              uri: http://127.0.0.1:8087 #想要转发到的地址 ip和对应id(服务)的端口号一致
              order: 1 #优先级,数字越⼩优先级越⾼
              predicates: #断⾔ 配置哪个路径才转发
                - Path=/order-server/**
              filters: #过滤器,请求在传递过程中通过过滤器修改
                - StripPrefix=1 #去掉第⼀层前缀  这里是去掉order-server 不然无法访问
              #访问路径 http://localhost:8888/order-server/api/v1/video_order/list
              #转发路径 http://localhost:8087/api/v1/video_order/list(中间的order-server已经被过滤器过滤了)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    网关整合nacos实现转发后的负载均衡

    优点:可以进行负载均衡且地址不需要写死直接指向nacos的服务名即可

    添加依赖

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4

    启动类添加注解

    @EnableDiscoveryClient
    
    • 1

    配置yml

    server:
      port: 8888
    spring:
      application:
        name: api-gateway
      cloud:
        nacos:
          discovery:
            server-addr: xx.xx.xx.xx:8848  nacos运行的服务器的ip
    
        gateway:
          routes: #数组形式
            - id: order-service #路由唯一标识 一般是要转发的项目名
              #uri: http://127.0.0.1:8087 #想要转发到的地址 ip和对应id(服务)的端口号一致
              uri: lb://xdclass-order-service #从nacos进行转发  lb的意思是负载均衡
              order: 1 #优先级,数字越小优先级越高
              predicates: #断言 配置哪个路径才转发
                - Path=/order-server/**
              filters: #过滤器,请求在传递过程中通过过滤器修改
                - StripPrefix=1 #去掉第⼀层前缀
              #访问路径 http://localhost:8888/order-server/api/v1/video_order/list
              #转发路径 http://localhost:8087/order-server/api/v1/video_order/list
              #需要过滤器去掉前面第一层
    
          discovery:
            locator:
              enabled: true   #开启网关拉取nacos的服务
            # 访问路径 c
    
    
    • 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

    这时候在需要调用的同一个服务 开启两个不同的端口号(8081.8082)
    访问 http://localhost:8888/order-server/api/v1/video_order/list
    这时候会轮询访问8081和8082端口

    路由断言参数配置

    predicates:
     - Host=
     - Path=/order-server/**  只有这个路径才转发
     - before=2022-8-16T01:01:01.000+08:00   +08是东八区  这里是8.16号之前才能访问 超时之后无法访问
     - Method=
     - Header=
     - Query=source    意思是网址后必须加?source=xxx 不然也无法访问
     - Cookie=
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    实现用户鉴权

    @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.isBlank("token")){
                //设置状态码未授权
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                //已经完成
                return exchange.getResponse().setComplete();
            }
    
            // 如果成功继续往下执行
            return chain.filter(exchange);
        }
    
        //过滤器的优先级 数字越小 优先级越高    
        @Override
        public int getOrder() {
            return 0;
        }
    
    }
    
    • 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

    这时候请求 如果不在Header里面传token那么就无法访问,

  • 相关阅读:
    markdown语法实现页内跳转(csdn写博客利器)绝对通俗易懂 秒学会
    聊一聊被人嘲笑的if err!=nil和golang为什么要必须支持多返回值?
    Nacos 注册中心入门及使用
    小红书账号管理软件,批量账号发布笔记!
    数据结构 图
    C++_多态
    逐秒追加带序号输入当前时间:fgets fputs sprintf fprintf
    基座向量施密特正交化
    【机器学习】K-means聚类分析
    AWS SAP-C02教程0--课程概述
  • 原文地址:https://blog.csdn.net/Andrew0219/article/details/126347195