网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。
GateWay : 是Spring Cloud的一个全新的API网关项目,基于性能的Reactor模式响应式通信框架Netty,异步阻塞模型 等技术开发,性能高于Zuul。旨在为微服务架构提供种简单有效的统的API路由管理式。
spring cloud gateway 核心功能:
路由(Route)是GateWay中最基本的组件之一,表示一个具体的路由信息载体,主要由下面几个部分组成:
对应的先看下怎么配置一个路由,长这样:
# 下面的路由配置了: 来自 /account 开头的请求,都转到 account-service 微服务中。同时 先去掉 url 中的第一个段。
routes:
- id: account-service
uri: http://localhost:8803/
predicates:
- Path=/account/**
filters:
- StripPrefix=1
# StripPrefix 的意思是去掉 url 中的第一个段,比如 /account/user/list 就变成了/user/list 这样的 url 发送到具体的微服务。
路由的逻辑过程:
(1) 请求开始:Gateway Client 向 Spring Cloud Gateway 发送请求,请求首先会被 HttpWebHandlerAdapter 进行提取组装成网关上下文.
(2) 执行断言:网关的上下文会传递到 DispatcherHandler ,它负责将请求分发给 RoutePredicateHandlerMapping
RoutePredicateHandlerMapping 负责路由查找,并根据路由断言判断路由是否可用
(3) 过滤器链:如果过断言成功,由FilteringWebHandler 创建过滤器链并调用
执行所有 前置过滤器逻辑。然后进行代理请求(分发到具体微服务)。完成代理请求后,将运行 后置过滤器逻辑。
(4) 响应:处理完毕之后将 Response 返回到 Gateway 客户端
添加 gateway 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
System.out.println("启动成功 !");
}
}
# Tomcat
server:
port: 8080
# Spring
spring:
application:
# 应用名称
name: gateway
profiles:
# 环境配置
active: dev
main:
allow-bean-definition-overriding: true
cloud:
gateway:
discovery:
locator:
lowerCaseServiceId: true
enabled: true
routes:
- id: account-service
uri: http://localhost:8803/
#uri: lb://account-service
predicates:
- Path=/account/**
filters:
- StripPrefix=1
配置转发的方式,常用两种: (1) 直接转发,直接写网址,这样配置。
uri: http://localhost:8803/
(2) 负载均衡转发到具体微服务
uri: lb://account-service
如果关联nacos,依赖:
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注意, nacos 不要使用 ribon负载均衡器,建议使用 loadbalancer,添加下面的依赖。 不引入下面这个依赖的话,配置 lb://you_service 格式的url 将无法使用
<!-- SpringCloud Loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>