网关作为微服务中统一入口,只需要对外暴露网关的ip。另外网关可以做统一的鉴权、日志记录等统一操作
根据配置的内容将请求转发到对应的服务上
配置
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true #默认大写匹配服务名
routes:
- id: xx
uri: lb://CLOUD #使用loadbalancer
#uri: http://localhost:8080
predicates:
- Path=/provide/**
filters:
- StripPrefix=1
Path:PathRoutePredicateFactory
当请求地址为:/provide/**,网关会将请求转发到CLOUD服务上
场景:当一个服务可能会部署V1、V2两个版本,可能会希望有的请求打到V1,有的打到V2上
使用
routes:
#权重
#灰度服务:服务CLOUD可能会部署V1和V2两个版本
#这里求根据设置的weight将有的请求打到V1有的打到V2上
- id: CLOUD_V1
uri: lb://CLOUD
predicates:
- Path=/weight/**
- Weight=GROUP,8
filters:
- StripPrefix=1
- id: CLOUD_V2
uri: lb://CLOUD2
predicates:
- Path=/weight/**
- Weight=GROUP,2
filters:
- StripPrefix=1
通过predicates配置Weight:第一个参数:对不同版本的统一名称,用于做负载使用;第二个参数:权重
当有uri为/provide/**时会负载到CLOUD和CLOUD2两个服务上
对请求做一些过滤操作
StripPrefix:StripPrefixGatewayFilterFactory
在转发请求时会去掉一级uri:如请求是 /provide/user,过滤后变为 /user
上面用的配置方式:
routes:
- id: xx
uri: lb://CLOUD #使用loadbalancer
predicates:
- Path=/provide/**
filters:
- StripPrefix=1
routes:
- id: xx
uri: lb://CLOUD #使用loadbalancer
predicates:
- Path=/provide/**
filters:
- name: StripPrefix
args:
patterns:
- 1
name:过滤器PathRoutePredicateFactory的前缀Path
args:PathRoutePredicateFactory类的config
实现GlobalFilter接口
public class MyFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
return null;
}
}
继承AbstractGatewayFilterFactory类或者其他相关类
public class MyFilter extends AbstractGatewayFilterFactory<MyFilter.Config> {
@Override
public GatewayFilter apply(Config config) {
return null;
}
static class Config{
}
}
导入redis-reactive依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redis-reactiveartifactId>
dependency>
配置redis连接信息
spring:
redis:
host: localhost
port: 6379
过滤器配置:
routes:
- id: xx
uri: lb://CLOUD
predicates:
- Path=/provide/**
filters:
- StripPrefix=1
- name: RequestRateLimiter
args:
keyResolver: '#{@myKeyResolver}'
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 2
过滤器名称:RequestRateLimiter
keyResolver:根据什么限流,取值为代码中定义的对象,这里根据请求uri限流
@Configuration
public class Config {
@Bean
public KeyResolver myKeyResolver(){
return new KeyResolver() {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getPath().value());
}
};
}
}
这里用的是令牌桶算法
redis-rate-limiter.replenishRate:装桶的速率,也就是令牌生成的速率(每秒)
redis-rate-limiter.burstCapacity:一秒内允许的最大流量也就是是令牌桶可以装下的令牌数
自定义继承AbstractGatewayFilterFactory:除了返回值处理其他都可以与RequestRateLimiterGatewayFilterFactory保持相同
配置中filterName换成自定义的类