网关旨在为微服务架构提供一种简答有效的同意的API入口,负载服务请求路由、组合及协议转换,并且基于Filter链的方式提供了权限认证,监控,限流等功能。
网关优点:1.性能强 2.功能强大:内置了很多实用的功能,如:转发 监控 限流等 3.容易扩展
网关缺点:依赖Netty与WebFlux(spring5.0),学习成本高 ,需要spring boot2.0及以上的版本次才支持
网关需要进行的配置:
第一步:添加相关依赖。
注意:添加完这个依赖不能添加web依赖,会起冲突
<!-- 配置网关依赖,基于Netty去写的。加了这个依赖不能加web依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 限流依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- 在限流上显示网关依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
第二步:添加application.yml相关配置:
其中:路由是gateway最基本的组件之一,表示一个具体的路由信息载体
id:路由表示符,路由名称
uri:路由执行的目的地,客户端请求最终被转发到的微服务
predicate:断言 谓词 条件判断,当返回的都是true时才会执行路由
filter: 过滤器,用于修改请求和响应信息
lb:指从nacos中按照名称获取微服务,并遵循负载均衡策略,同时简易开发阶段打开gateway日志
server:
port: 9000
spring:
application:
name: sso-gateway #通过网关进行访问。
cloud:
nacos:
discovery: #服务注册端口
server-addr: localhost:8848
config: #配置中心端口
server-addr: localhost:8848
file-extension: yml #配置文件后缀名
sentinel: #配置限流端口
transport:
dashboard: localhost:8180
eager: true #开启通过服务注册中心的serbiceId创建路由
gateway:
routes: #路由
- id: router01 #资源服务路由名称
uri: lb://sso-resource #lb表示负载均衡 后面是需要进行负载均衡的服务名
predicates: #匹配规则
- Path=/sso/resource/** #设置访问路径 以及规则
filters:
- StripPrefix=1
- id: router02 #认证服务路由名称
uri: lb://sso-auth #lb表示负载均衡 后面是需要进行负载均衡的服务名
predicates: #谓词对象,可以定义多个谓词逻辑
- Path=/sso/oauth/**
filters:
- StripPrefix=1 #去掉第一层路径
globalcors: #跨域配置(写到配置文件的好处是可以将其配置写到配置中心)
corsConfigurations: #所有跨域配置只是针对ajax请求,因为ajax请求不支持跨域
'[/**]':
allowedOrigins: "*"
allowedHeaders: "*"
allowedMethods: "*"
allowCredentials: true
logging: #日志
level:
org.springframework.cloud.gateway: debug
第三步:当你完成配置后 启动网关项目,检查sentinel控制台网关菜单。启动时,需要添加jvm参数:
-Dcsp.sentinel.app.type=1
基于请求属性限流
自定义API维度限流
自定义API分组,是一种更细的限流规则定义,它允许我们利用sentinel提供的API,将请求路径进行分组,然后在组上设置限流规则即可
定义流控网关返回值:
@Configuration
public class GatewayConfig {
public GatewayConfig(){
GatewayCallbackManager.setBlockHandler( new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
Map<String,Object> map=new HashMap<>();
map.put("state",429);
map.put("message","two many request");
String jsonStr=JSON.toJSONString(map);
return ServerResponse.ok().body(Mono.just(jsonStr),String.class);
}
});
}
}
其中,Mono 是一个发出(emit)0-1个元素的Publisher对象。