• 【SpringCloud】Re04 Gateway


    微服务网关:

    1、身份认证 和 权限校验

    2、服务路由、负载均衡

    3、请求限流

     

     

    搭建服务网关:

    网关是一个独立的服务,同样需要被注册中心注册到,这里依然使用的是Nacos

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>cloud-demo</artifactId>
            <groupId>cn.itcast.demo</groupId>
            <version>1.0</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>gateway</artifactId>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
        <dependencies>
            <!--nacos服务注册发现依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <!--网关gateway依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
        </dependencies>
        <build>
            <finalName>app</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>

    网关信息配置:

    server:
      port: 10010
    logging:
      level:
        cn.itcast: debug
      pattern:
        dateformat: MM-dd HH:mm:ss:SSS
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          server-addr: nacos:8848 # nacos地址
        gateway:
          routes:
            - id: user-service # 路由标示,必须唯一
              uri: lb://userservice # 路由的目标地址
              predicates: # 路由断言,判断请求是否符合规则
                - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
          default-filters:
            - AddRequestHeader=Truth,Itcast is freaking awesome!

     

    server:
      port: 10010
    logging:
      level:
        cn.itcast: debug
      pattern:
        dateformat: MM-dd HH:mm:ss:SSS
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          server-addr: nacos:8848 # nacos地址
        gateway:
          routes:
            - id: user-service # 路由标示,必须唯一
              uri: lb://userservice # 路由的目标地址
              predicates: # 路由断言,判断请求是否符合规则
                - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
          default-filters:
            - AddRequestHeader=Truth,Itcast is freaking awesome!

    网关过滤器配置:

    server:
      port: 10010
    logging:
      level:
        cn.itcast: debug
      pattern:
        dateformat: MM-dd HH:mm:ss:SSS
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          server-addr: nacos:8848 # nacos地址
        gateway:
          routes:
            - id: user-service # 路由标示,必须唯一
              uri: lb://userservice # 路由的目标地址
              predicates: # 路由断言,判断请求是否符合规则
                - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
          default-filters:
            - AddRequestHeader=Truth,Itcast is freaking awesome!

    全局过滤器

    package cn.itcast.gateway;
    
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.core.Ordered;
    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;
    
    // @Order(-1) 表示过滤顺序
    @Component
    public class AuthorizeFilter implements GlobalFilter, Ordered {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            // 1.获取请求参数
            ServerHttpRequest request = exchange.getRequest();
            MultiValueMap<String, String> params = request.getQueryParams();
            // 2.获取参数中的 authorization 参数
            String auth = params.getFirst("authorization");
            // 3.判断参数值是否等于 admin
            if ("admin".equals(auth)) {
                // 4.是,放行
                return chain.filter(exchange);
            }
            // 5.否,拦截
            // 5.1.设置状态码
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            // 5.2.拦截请求
            return exchange.getResponse().setComplete();
        }
    
        @Override // 表示过滤顺序 
        public int getOrder() {
            return -1;
        }
    }

     网关跨域攻击问题处理:

    server:
      port: 10010
    logging:
      level:
        cn.itcast: debug
      pattern:
        dateformat: MM-dd HH:mm:ss:SSS
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          server-addr: nacos:8848 # nacos地址
        gateway:
          routes:
            - id: user-service # 路由标示,必须唯一
              uri: lb://userservice # 路由的目标地址
              predicates: # 路由断言,判断请求是否符合规则
                - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
          default-filters:
            - AddRequestHeader=Truth,Itcast is freaking awesome!
          globalcors: # 全局跨域处理
            add-to-simple-url-handler-mapping: true # 加入到简易URL处理器映射 是
            cors-configurations:
              '[/**]': # 路径格式, 所有路径
                allowedOrigins: # 允许哪些网站跨域请求
                  - "http://localhost:8090"
                  - "http://localhost:8091"
                allowedMethods: # 允许的请求方式
                  - "GET"
                  - "POST"
                  - "PUT"
                  - "DELETE"
                  - "OPTIONS"
                  - "HEADER"
                allowedHeaders: "*" # 允许在请求头中携带信息
                allowedCrendentials: true # 允许带Cookie
                maxAge: 360000 # 跨域检测的有效期?

     

     

  • 相关阅读:
    3、Nginx负载均衡实现的策略
    2、Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?Nginx常见的优化手段有哪些?502错误可能原因有哪些?
    1、HTTP 的负载均衡?Nginx负载均衡
    用 Python 手写十大经典排序算法
    处理TypeError: testFunc() missing 1 required positional argument: 'self' -- 没有实例化对象的错误
    Socket技术详解
    MAC终端常用命令
    接口自动化测试框架 -- reudom
    如何在Pypi发布上传你自己的Python库
    Docker数据目录迁移解决方案
  • 原文地址:https://www.cnblogs.com/mindzone/p/15316775.html
Copyright © 2020-2023  润新知