【spring-cloud-gateway总结】

文章目录

什么是gateway

在微服务架构中,gateway网关是一个服务,它作为系统的唯一入口点,处理所有的客户端请求,然后将这些请求路由到适当的服务。提供了几个关键功能:

1.请求路由:根据请求的URL路径和其他参数,将请求路由到正确的后端服务。

2.负载均衡:在多个服务实例之间分配流量,以提高可用性和可扩展性。

3.认证和授权:检查用户是否有权访问特定的服务。

4.限流:控制访问后端服务的请求速率,以防止过载。

5.监控:收集关于API使用情况的统计数据,用于分析和计费。

6.日志记录:记录所有通过网关的请求和响应,以便进行问题排查和性能监控。

7.缓存:提高响应速度和减少后端负载,通过缓存常见的响应。

8.过滤:检验当前的请求是否符合请求的规则。

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

如何导入gateway依赖

1.导包

java 复制代码
<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文件

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在每个部分的第一句或第二句中。参数通常按快捷方式配置所需的顺序列出。

快捷方式配置由过滤器名称识别,后跟等号(=),后跟用逗号分隔的参数值(,)。

配置文件实现:

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

java代码实现过滤方式:

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();
    }
}
java 复制代码
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配置断路器

导包

java 复制代码
<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>

配置

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
        filters:
        - name: CircuitBreaker
          args:
            name: myCircuitBreaker
            fallbackUri: forward:/fallback
 //断路器配置
 resilience4j:
  circuitbreaker:
    instances:
      myCircuitBreaker:
        slidingWindowSize: 10
        failureRateThreshold: 50
        minimumNumberOfCalls: 5
        waitDurationInOpenState: 10s

兜底接口

java 复制代码
@RestController
@Slf4j
public class GateController {
    @Autowired
    private FeginClients feginClients;
    @GetMapping("/fallback")
    public Wrapper query(){
        log.info("test:================");
        return WrapperMapper.error();
    }
}
相关推荐
言、雲几秒前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
TT哇7 分钟前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
Yvemil736 分钟前
《开启微服务之旅:Spring Boot 从入门到实践》(三)
java
Anna。。37 分钟前
Java入门2-idea 第五章:IO流(java.io包中)
java·开发语言·intellij-idea
.生产的驴1 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
爱上语文1 小时前
宠物管理系统:Dao层
java·开发语言·宠物
王ASC2 小时前
SpringMVC的URL组成,以及URI中对/斜杠的处理,解决IllegalStateException: Ambiguous mapping
java·mvc·springboot·web
撒呼呼2 小时前
# 起步专用 - 哔哩哔哩全模块超还原设计!(内含接口文档、数据库设计)
数据库·spring boot·spring·mvc·springboot
是小崔啊2 小时前
开源轮子 - Apache Common
java·开源·apache
因我你好久不见2 小时前
springboot java ffmpeg 视频压缩、提取视频帧图片、获取视频分辨率
java·spring boot·ffmpeg