写在前面
网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。
GateWay : 是Spring Cloud的一个全新的API网关项目,基于性能的Reactor模式响应式通信框架Netty,异步阻塞模型 等技术开发,性能高于Zuul。旨在为微服务架构提供种简单有效的统的API路由管理式。
spring cloud gateway 核心功能:
- 路由(route) 路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Filter组成。如果路由断言为真,说明请求URL和配置路由匹配。
- 断言(Predicate) Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于Http Request中的任何信息比如请求头和参数。
- 过滤器(Filter) 一个标准的Spring WebFilter。 Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。
一些概念
路由(Route)是GateWay中最基本的组件之一,表示一个具体的路由信息载体,主要由下面几个部分组成:
- id: 唯一标识,名字
- uri: 路由的目的地URL,请求被转发到这里
- predicate:断言,它的作用是进行条件判断,符合判断的才会执行路由
- filter: 过滤器,用于修改请求和响应信息
对应的先看下怎么配置一个路由,长这样:
代码语言:javascript复制# 下面的路由配置了: 来自 /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 发送到具体的微服务。
路由的逻辑过程:
代码语言:javascript复制(1) 请求开始:Gateway Client 向 Spring Cloud Gateway 发送请求,请求首先会被 HttpWebHandlerAdapter 进行提取组装成网关上下文.
(2) 执行断言:网关的上下文会传递到 DispatcherHandler ,它负责将请求分发给 RoutePredicateHandlerMapping
RoutePredicateHandlerMapping 负责路由查找,并根据路由断言判断路由是否可用
(3) 过滤器链:如果过断言成功,由FilteringWebHandler 创建过滤器链并调用
执行所有 前置过滤器逻辑。然后进行代理请求(分发到具体微服务)。完成代理请求后,将运行 后置过滤器逻辑。
(4) 响应:处理完毕之后将 Response 返回到 Gateway 客户端
动手上代码
1、添加依赖
添加 gateway 依赖
代码语言:javascript复制<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2、写个 main 函数启动
代码语言:javascript复制@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
System.out.println("启动成功 !");
}
}
3、写 yml 配置文件
代码语言:javascript复制# 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) 直接转发,直接写网址,这样配置。
代码语言:javascript复制uri: http://localhost:8803/
(2) 负载均衡转发到具体微服务
代码语言:javascript复制uri: lb://account-service
扩展:关联到 naocs
如果关联nacos,依赖:
代码语言:javascript复制<!-- 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 将无法使用
代码语言:javascript复制<!-- SpringCloud Loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>