往期回顾
前面我们已经介绍了Nacos
的安装与配置,Spring Cloud
集成Nacos
作为服务的注册中心和配置中心,集成Nacos
实现服务的负载均衡和一些常见的负载均衡策略以及使用Dubbo、OpenFegin进行RPC调用
接下来让我们一起来看看Spring Cloud另一大组件:Spring Cloud Gateway
API网关介绍
API网关是什么?
我们知道在微服务架构中,大型服务都被拆分成了独立的微服务,每个微服务通常会以RESTFUL API的形式对外提供服务。但是在UI方面,我们可能需要在一个页面上显示来自不同微服务的数据,此时就会需要一个统一的入口来进行API的调用。API 网关就在此场景下充当了多个服务的大门,系统的统一入口,从面向对象设计的角度看,它与外观模式类似,API 网关封装了系统的内部复杂结构,同时它还可能具有其他API管理/调用的通用功能,如认证,限流,流控等功能。
为什么要使用API网关
网关作为系统的唯一入口,也就是说,进入系统的所有请求都需要经过 API 网关。
当系统外部的应用或者客户端访问系统的时候,都会遇到这样的情况:
- 系统要判断它们的权限
- 如果传输协议不一致,需要对协议进行转换
- 如果调用水平扩展的服务,需要做负载均衡
- 一旦请求流量超出系统承受的范围,需要做限流操作
- 针对每个请求以及回复,系统会记录响应的日志
也就是说,只要是涉及到对系统的请求,并且能够从业务中抽离出来的功能,都有可能在网关上实现。
例如:协议转换,负载均衡,请求路由,流量控制等等。
Gateway简介
历史背景
Spring Cloud全家桶中有一个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关。但是在2.x版本中,Zuul的升级一直跳票,迟迟不发布,Spring Cloud最后自己研发了一个网关替代Zuul,就是Gateway
Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,基于Spring 5.0 + Spring Boot 2.0 和 Project Reactor 等技术开发的网关。它不能在传统的 Servlet 容器中工作,也不能构建成 war 包。它旨在为微服务架构提供一种简单有效的统一的API路由管理方式
Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,Spring Cloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty
Spring Cloud Gateway的目标是 提供统一的路由方式且基于 Filter链 的方式提供了网关基本的功能,例如:安全、监控/指标、限流
特性
Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等。
Spring Cloud Gateway 具有如下特性:
- 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建
- 动态路由:能够匹配任何请求属性
- 可以对路由指定 Predicate(断言)和 Filter(过滤器)
- 集成Hystrix的断路器功能
- 集成 Spring Cloud 服务发现功能
- 易于编写的 Predicate(断言)和 Filter(过滤器)
- 请求限流功能
- 支持路径重写
专业术语
- Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
- Predicate(断言):指的是Java 8 的 Function Predicate。 输入类型是Spring框架中的ServerWebExchange。 这使开发人员可以匹配HTTP请求中的所有内容,例如请求头或请求参数。如果请求与断言相匹配,则进行路由
- Filter(过滤器):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前后对请求进行修改。
工作原理
客户端向 Spring Cloud Gateway 发出请求。 如果网关处理程序映射确定请求与路由匹配,则将其发送到网关 Web 处理程序。 此处理程序通过特定于请求的过滤器链运行请求。 过滤器用虚线划分的原因是过滤器可以在发送代理请求之前和之后运行逻辑。 执行所有“预”过滤器逻辑。 然后发出代理请求。 发出代理请求后,将运行“发布”过滤器逻辑。
快速开始
1.准备子工程
- 在原有的父工程里面创建一个子工程gateway
- 引入对应的依赖
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<!-- 将ribbon排除 -->
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--Spring Cloud Gateway-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- 编写对应的配制文件
如果对Nacos配置中心不是很熟悉,请参见:SpringCloud集成Nacos作为配置中心
编写bootstrap.yml
,主要是对Nacos配置中心的一些设置
spring:
application:
name: gateway-service
cloud:
nacos:
discovery:
server-addr: 192.168.199.128:8848 #Nacos地址
config:
server-addr: 192.168.199.128:8848 #Nacos地址
file-extension: yaml #这里我们获取的yaml格式的配置
- 编写
application.yml
,启用对应环境
server:
port: 80
spring:
profiles:
active: dev
- 在Nacos后台编写对应的配制文件,dataId为
gateway-service-dev.yaml
service-url:
user-service: http://localhost:8080
spring:
cloud:
gateway:
# 全局的过滤器,跨域配置
default-filters:
- DedupeResponseHeader=Access-Control-Allow-Origin, RETAIN_UNIQUE
globalcors:
cors-configurations:
'[/**]':
allowedHeaders: '*'
allowedMethods: '*'
allowedOrigins: '*'
# 静态路由
routes:
- id: path_route
uri: ${service-url.user-service}/user/get/{id}
predicates:
- Path=/user/get/{id}
datasource:
type: com.alibaba.druid.pool.DruidDataSource #数据源,这里用的Druid
driver-class-name: com.mysql.cj.jdbc.Driver #驱动
url: jdbc:mysql://192.168.199.128:3306/cloud_learn?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username: root #数据库用户名
password: 123456 #密码
cache:
type: redis
redis:
host: 192.168.199.128
port: 6379
password: 123456
management:
endpoints:
web:
exposure:
include: "*"
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:cuit/epoch/pymjl/mapper/xml/*.xml
type-aliases-package: cuit.epoch.pymjl.entity
2.开始测试
启动对应的服务以及网关,如图所示,user-service和gateway-service都已经启动成功
访问接口进行测试
从图中可以看到,我们访问网关的请求,网关根据对应的路由规则对我们的请求进行了转发
至此,Nacos整合Spring Cloud Gateway就演示到这里了,但是Spring Cloud Gateway远远不止于此,关于它的一些特性我们后面会介绍到,今天先到这里吧
据对应的路由规则对我们的请求进行了转发
至此,Nacos整合Spring Cloud Gateway就演示到这里了,但是Spring Cloud Gateway远远不止于此,关于它的一些特性我们后面会介绍到,今天先到这里吧