一文掌握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.导包
<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(); } }
到此这篇关于spring cloud gateway 总结的文章就介绍到这了,更多相关spring cloud gateway内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!