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

【spring-cloud-gateway总结】

文章目录

  • 什么是gateway
  • 如何导入gateway依赖
  • 路由配置
  • gateway配置断路器
    • 导包
    • 配置

什么是gateway

在微服务架构中,gateway网关是一个服务,它作为系统的唯一入口点,处理所有的客户端请求,然后将这些请求路由到适当的服务。提供了几个关键功能:
1.请求路由:根据请求的URL路径和其他参数,将请求路由到正确的后端服务。
2.负载均衡:在多个服务实例之间分配流量,以提高可用性和可扩展性。
3.认证和授权:检查用户是否有权访问特定的服务。
4.限流:控制访问后端服务的请求速率,以防止过载。
5.监控:收集关于API使用情况的统计数据,用于分析和计费。
6.日志记录:记录所有通过网关的请求和响应,以便进行问题排查和性能监控。
7.缓存:提高响应速度和减少后端负载,通过缓存常见的响应。
8.过滤:检验当前的请求是否符合请求的规则。

在这里插入图片描述
客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 确定请求与路由匹配,则将其发送到 Gateway Web Handler。此处理程序通过特定于该请求的过滤器链运行该请求。过滤器被虚线分开的原因是过滤器可以在发送代理请求之前和之后运行逻辑。所有“前”过滤器逻辑都​​会执行。然后发出代理请求。发出代理请求后,运行“后”过滤器逻辑。

如何导入gateway依赖

1.导包

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>>2021.0.5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.6.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
 		</dependency>

2.配置yaml文件

spring:
  cloud:
    gateway:
      discovery:
        locator:
          lower-case-service-id: true
          enabled: true
      default-filters:
        - name: CircuitBreaker
          args:
            name: myCircuitBreaker
            fallbackUri: forward:/fallback //默认的兜底策略
      routes:
      - id: fee-service
        uri: lb://fee-service //指定的服务
        predicates:
        - Path=/query  //断言

路由配置

1.配置路由谓词工厂和网关过滤器工厂
配置谓词和过滤器有两种方式:快捷方式和完全展开参数。
名称和参数名称将列code在每个部分的第一句或第二句中。参数通常按快捷方式配置所需的顺序列出。
快捷方式配置由过滤器名称识别,后跟等号(=),后跟用逗号分隔的参数值(,)。
配置文件实现:

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

java代码实现过滤方式:

@Configuration
public class GateConfig {
    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/check")
                        .filters(f -> f.filter(new IpWhitelistFilter()))  // 注册过滤器
                        .uri("lb://fee-service"))
                .build();
    }
}
package com.umpay.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @author zq
 * data 2024-12-18
 */
@Configuration
@Slf4j
public class IpWhitelistFilter implements GatewayFilter, Ordered {
    private static final String ALLOWED_IPS = "allowedIps";
    private static final String DENIED_IPS = "deniedIps";

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String clientIp=exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
        log.info("获取到的ip:============:{}",clientIp);
        String responseBody = "{\"error\": \"Custom error message\"}";
        if(!"1111111".equals(clientIp)){
            exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
            exchange.getResponse().getHeaders().add("Content-Type", "application/json");
            return exchange.getResponse()
                    .writeWith(Mono.just(exchange.getResponse()
                            .bufferFactory().wrap(responseBody.getBytes())));
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

gateway配置断路器

导包

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
        </dependency>
        <dependency>
            <groupId>io.github.resilience4j</groupId>
            <artifactId>resilience4j-feign</artifactId>
        </dependency>
        <dependency>
            <groupId>io.github.resilience4j</groupId>
            <artifactId>resilience4j-reactor</artifactId>
        </dependency>

配置

spring:
  cloud: 
    gateway:
      discovery:
        locator:
          lower-case-service-id: true
          enabled: true
      default-filters:
        - name: CircuitBreaker
          args:
            name: myCircuitBreaker
            fallbackUri: forward:/fallback
      routes:
      - id: fee-service
        uri: lb://fee-service
        predicates:
        - Path=/query
        filters:
        - name: CircuitBreaker
          args:
            name: myCircuitBreaker
            fallbackUri: forward:/fallback
 //断路器配置
 resilience4j:
  circuitbreaker:
    instances:
      myCircuitBreaker:
        slidingWindowSize: 10
        failureRateThreshold: 50
        minimumNumberOfCalls: 5
        waitDurationInOpenState: 10s

兜底接口

@RestController
@Slf4j
public class GateController {
    @Autowired
    private FeginClients feginClients;
    @GetMapping("/fallback")
    public Wrapper query(){
        log.info("test:================");
        return WrapperMapper.error();
    }
}

http://www.kler.cn/a/452644.html

相关文章:

  • C++--------效率和表示
  • Python的安装过程和环境搭建(超详细过程)
  • 虚拟机桥接模式网络连接不上解决方法
  • K8s 无头服务(Headless Service)
  • 48页PPT|2024智慧仓储解决方案解读
  • day14-16系统服务管理和ntp和防火墙
  • 20241225在ubuntu20.04.5下监控SSD
  • 重温设计模式--5、职责链模式
  • 基于 Nginx 的网站服务器与 LNMP 平台搭建指南
  • 使用ForceBindIP绑定应用到指定IP
  • 第十七届山东省职业院校技能大赛 中职组“网络安全”赛项任务书正式赛题
  • 【Redis】配置序列化器
  • 每天40分玩转Django:Django管理界面
  • 「下载」智慧产业园区-数字孪生建设解决方案:重构产业全景图,打造虚实结合的园区数字化底座
  • 鸿蒙项目云捐助第二十一讲云捐助项目物联网IoT模拟器的使用
  • (ES Modules)prettier格式化typescript源码
  • ubuntu 如何重装你的apt【apt-get报错: symbol lookup error/undefined symbol】
  • SpringBoot Restful接口同时支持多个文件上传和参数传递
  • 要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量
  • springboot473基于web的物流管理系统(论文+源码)_kaic
  • xshell 隧道
  • 华为手机建议使用adb卸载的app
  • NTLM 中继到 LDAP 结合 CVE-2019-1040 接管全域
  • Ubuntu安装教程+网页部署于服务器(前端+后端+mysql数据库)新版
  • leetcode之hot100---2两数相加(C++)
  • 网络安全等级自我评价