网关功能
Gateway网关是是所有微服务的统一入口, 网关的核心功能特性主要体现在请求路由,权限控制,限流
三部分
规则(断言)
把请求转发给匹配的主机或者接口上,这个转发的过程就叫做路由负载均衡
: 当路由的目标微服务有多个实例时,还需要通过负载均衡规则从多个服务实例中挑选一个身份认证(鉴权)
: 网关作为微服务的入口需要校验用户是否有请求资格或是否有权限进行操作,如果没有则拦截访问控制
: 设置黑白名单,比如限制DDOS攻击的IP地址请求限流
: 当请求量过高时,网关会按照微服务能够接受的速度来放行请求,避免服务压力过大统一日志
: 统一的请求,响应信息记录接口保护
: 限制请求,信息脱敏,降级熔断进行兜底,请求限流(令牌桶算法,漏桶算法,RedisLimitHandler),设置超时时间,超时就中断网关的分类
全局网关(接入层网关)
: 主要实现负载均衡、请求日志等,不和业务逻辑代码绑定
业务网关(微服务网关)
: 将请求转发到不同的业务/项目/接口/服务,包含一些业务逻辑代码
在SpringCloud中网关的实现主要包括四种,它旨在为微服务框架提供一种简单有效的统一的API路由管理方式
Spring Cloud Gateway
: SpringCloud的一个全新项目,基于Spring 5.0和SpringBoot2.0以及ProjectReactor等响应式编程和事件流技术开发的网关Zuul
: 基于Servlet属于阻塞式编程实现, SpringCloudGateway则是基于Spring5中提供的WebFlux属于响应式编程实现因此具备更好的性能其他实现
: Nginx(全局网关),Kong(API网关,编程成本相对较高)网关的实现
第一步: 新建一个SpringBoot工程如gateway模块, 引入网关依赖和nacos服务发现依赖
<!--网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
第二步: 在gateway模块
中编写启动类
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
编程式(更灵活)
: 在项目启动类上添加对应网关代码, 实现https://yupi.icu/yupi到http://yupi.icu/
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("toyupi", r -> r.path("/yupi")
.uri("http://yupi.icu/"))
.route("路由Id", r -> r.path("路由规则")
.uri("路由的目标地址"))
.route.......
.build();
}
配置式(更直观)
: 编写基础配置和路由规则
路由名称(id)
: 路由的唯一表示,用户自定义只需要唯一即可路由目标地址(uri)
: 可以路由到某个固定地址,也可以路由到某个服务然后根据负载均衡规则选择一个服务实例路由断言(predicates)
: 判断请求是否符合路由规则的条件,符合则转发到路由目的地路由过滤器(filters)
: 对请求或响应进行一些处理操作# 快捷配置方式
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org # 路由到固定地址
uri: lb://Nacos中注册的服务名称 # 路由到某个服务
predicates:
- Cookie=mycookie,mycookievalue # cookie里必须有mycookie且值是mycookievalue
# 完全展开配置方式
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- name: Cookie
args:
name: mycookie
regexp: mycookievalue
网关的工作流程
第一步: 客户端向网关发起请求,如果请求与Handler Mapping
定义的路由匹配则将请求转发给Web Handler
第二步: 通过定义的过滤器链过滤用户请求,过滤器可以在代理请求之前或者之后执行