当前位置: 首页 > article >正文

spring cloud Gateway网关

        网关是将所有面向用户的服务接口统一管理的代理服务器,所有内部服务的远程调用都是在局域网内部,而网关是在公网中。

一、依赖

        通过访问网关调用项目中的服务,需要使用Eureka,网关服务器需要在Eureka服务注册它自己,本身也就是一个Eureka Client。

        远程调用服务自然也离不开熔断降级的保护机制,使用Hystrix

        网关是对所有访问的统一入口,面对恶意攻击,大量并发的情况,通常使用令牌桶机制来处理,令牌储存在redis中。

        

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR12</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>


 


二、基本配置

gateway解析自己配置时,- 代表了创建一个对象: 

        id: 路由名称

        uri:  调用的服务主机名

        predicates:代理地址 

                  代理本身只解析主机名ip端口号,和代理地址做拼接,需要手动将/abc去除。

                  Vue3中代理配置也一样:      

        Filter:

                因为所有Filter都以GatewayFilterFactory结尾,所有该结尾省略不写。

                - StripPrefix=1

                          //简写形式  name =StripPrefixGatewayFilterFactory,参数为1

                - name: RequestRateLimiter  //通用的写法

                  args:...

server:
  port: 9999
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
spring:
  redis:
    host: localhost
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: false
          lower-case-service-id: true
      routes:
        - id: rateLimiter
          uri: lb://application-service
          predicates:
            - Path=/abc/**
          filters:
            - StripPrefix=1

 



三、令牌桶过滤器

        实现KeyResolver接口的resolve()方法

@Component
public class MyKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        String ip = exchange.getRequest()
                .getRemoteAddress()
                .getAddress()
                .getHostAddress();
        return Mono.just(ip);
    }
}
          filters:
            - StripPrefix=1

            - name: RequestRateLimiter
              args:
                keyResolver: '#{@myKeyResolver}' # 表达式, #{} 从容器找对象, @beanId
                redis-rate-limiter.replenishRate: 1 # 每秒令牌生成速率
                redis-rate-limiter.burstCapacity: 2 # 令牌桶容量上限


四、熔断降级过滤器

                配置HystrixGatewayFilterFactory对象,自定义降级的uri

          filters:
            - StripPrefix=1

            - name: RequestRateLimiter
              args:
                keyResolver: '#{@myKeyResolver}' # 表达式, #{} 从容器找对象, @beanId
                redis-rate-limiter.replenishRate: 1 # 每秒令牌生成速率
                redis-rate-limiter.burstCapacity: 2 # 令牌桶容量上限

            - name: Hystrix
              args:
                name: fallback # 随意定义的名称。相当于@HystrixCommand注解中的commandKey属性。
                fallbackUri: forward:/fallback # 如果转发


五、全局过滤器和自定义过滤器:

        全局过滤器:

                实现GlobalFilter的filter()方法

@Component
public class MyGlobalFilter implements GlobalFilter {
    /**
     * 过滤方法。
     * 实现上,只有唯一的要求。必须调用方法chain.filter(exchange),并把方法的返回值,返回。
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("前置全局过滤");
        Mono<Void> result = chain.filter(exchange);
        System.out.println("后置全局过滤");
        return result;
    }
}

         自定义过滤器:

                1.仿照其他Gateway提供的过滤器,创建一个LoggerFilterGatewayFilterFactory继承AbstractGatewayFilterFactory<LoggerFilterGatewayFilterFactory.Config>

@Component
public class LoggerFilterGatewayFilterFactory
        extends AbstractGatewayFilterFactory<LoggerFilterGatewayFilterFactory.Config> {

    /**
     * 建议提供2个构造方法。一个无参数。一个有参数,参数类型就是当前类型中的Config静态内部类的类对象类型。
     * 父类型,可以帮助解析配置文件,并创建Config对象。
     */
    public LoggerFilterGatewayFilterFactory(){
        this(Config.class);
    }

    public LoggerFilterGatewayFilterFactory(Class<Config> configClass){
        super(configClass);
    }

    /**
     * 如果需要简化配置方案。提供方法shortcutFieldOrder
     * 有当前方法,配置文件使用,可以简化配置为    LoggerFilter=abc
     * 没有当前方法,配置文件完整编写,内容是:
     *   name: LoggerFilter
     *   args:
     *     remark: abc
     */
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("remark");
    }

    /**
     * 创建网关过滤器的方法。
     * @param config 就是配置文件中的内容,就是当前类型中的静态内部类对象。
     * @return 一般使用匿名内部类,创建GatewayFilter接口的实现对象。
     */
    @Override
    public GatewayFilter apply(Config config) {

        return new GatewayFilter() {
            /**
             * 过滤方法。要求必须调用chain.filter(exchange),并返回方法的返回结果
             * @param exchange
             * @param chain
             * @return
             */
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                System.out.println("前置 - 日志过滤器 - config.remark = " + config.getRemark());
                Mono<Void> result = chain.filter(exchange);
                System.out.println("后置 - 日志过滤器 - config.remark = " + config.getRemark());

                return result;
            }
        };
    }

    /**
     * 定义静态内部类,作为配置对象
     * 定义的每个属性,都是用于在配置文件中配置的对应属性。
     * 必须提供getter和setter方法。
     */
    public static class Config{
        private String remark;

        public String getRemark() {
            return remark;
        }

        public void setRemark(String remark) {
            this.remark = remark;
        }
    }
}

        2.配置文件编写该自定义过滤器对象配置信息

          filters:
            - StripPrefix=1

            - name: RequestRateLimiter
              args:
                keyResolver: '#{@myKeyResolver}' # 表达式, #{} 从容器找对象, @beanId
                redis-rate-limiter.replenishRate: 1 # 每秒令牌生成速率
                redis-rate-limiter.burstCapacity: 2 # 令牌桶容量上限

            - name: Hystrix
              args:
                name: fallback # 随意定义的名称。相当于@HystrixCommand注解中的commandKey属性。
                fallbackUri: forward:/fallback # 如果转发

            - name: LoggerFilter
              args:
                remark: fullyTestGatewayFilter


http://www.kler.cn/news/324267.html

相关文章:

  • 网络编程(12)——完善粘包处理操作(id字段)
  • 【最新】微信小程序连接onenet——stm32+esp8266+onenet实现查看温湿度,控制单片机
  • 探索CefSharp,Cefsharp浏览器能做自动填表和模拟登录
  • 长芯微LPQ76930锂电池组保护芯片完全P2P替代BQ76930
  • 江协科技STM32学习- P20 实验-TIM编码器接口测速
  • windows安装Redis以后配置远程访问
  • 深度学习框架的选择:深入比较PyTorch与TensorFlow
  • Type-C接口桌面显示器的优势
  • 计算机毕业设计Python+Spark知识图谱微博舆情预测 微博推荐系统 微博可视化 微博数据分析 微博大数据 微博爬虫 Hadoop 大数据毕业设计
  • New major version of npm available! 8.3.1 -> 10.8.3 报错
  • 数组增删改查操作
  • 深度学习500问——Chapter14:超参数调整(3)
  • 深度解读 2024 Gartner DevOps 魔力象限
  • Jupyter Notebook 更换主题
  • 【hot100-java】【柱状图中最大的矩形】
  • 2024.9.23-2024.9.29组会报告
  • 【HTTP 和 HTTPS详解】3
  • Chainlit集成LlamaIndex实现知识库高级检索(子问题查询引擎)
  • VR虚拟展厅可以在手机上打开吗?
  • 【2023工业3D异常检测文献】基于混合融合的多模态工业异常检测方法Multi-3D-Memory (M3DM)
  • 图灵完备-奇数个信号
  • C++ | Leetcode C++题解之第441题排列硬币
  • FPGA在汽车电子中应用-ADAS
  • 基于 Debian 的系统(如 Ubuntu)上安装、启动和配置 SSH 服务的指令流
  • Redis篇(应用案例 - 商户查询缓存)
  • 深度学习反向传播-过程举例
  • opencv实战项目二十九:GrabCut分割人像
  • Kubernetes学习路线
  • 极狐GitLab 17.4 重点功能解读【一】
  • 基于php的酒店管理系