文章目录
什么是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();
}
}