zoukankan      html  css  js  c++  java
  • 【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 # 跨域检测的有效期?

     

     

  • 相关阅读:
    MySQL服务器变量:MySQL系列之八
    存储引擎:MySQL系列之七
    用户与授权:MySQL系列之六
    视图、存储函数、存储过程、触发器:MySQL系列之五
    SQL语法:MySQL系列之四
    关系型数据库基础概念:MySQL系列之开篇
    基础篇:MySQL系列之三
    多实例:MySQL系列之二
    安装篇:MySQL系列之一
    DNS
  • 原文地址:https://www.cnblogs.com/mindzone/p/15316775.html
Copyright © 2011-2022 走看看