网关是什么
网关是所有服务请求的一个统一入口,方便我们对服务请求与响应做统一的管理
网关的核心功能是路由转发,同时还可以做限流、熔断、日志监控、认证
为什么我们需要网关
我们在微服务架构的时候,把我们的业务员拆分为一个个小的服务,他们由不同的团队进行开发、测试、部署,而一个微服务为了高可用一般都需要部署多实例。如果我们让客户端直接调用服务:
- 会增加客户端的配置成本
- 服务端没办法对调用做统一管理
- 每个服务都需要去做权限认证
- 如果服务部署地址发生变化,则客户端需要修改服务调用地址
spring cloud gateway介绍
Spring Cloud Gateway是Spring官方提供的基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关。他是Spring cloud生态的第二代网关,旨在替代ZUUL(第一代)。Spring Cloud Gateway的底层是基于Netty、Reactor、WebFlux构建的。其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
优点:
- 性能强劲
- 功能强大,内置很多实用功能,不如转发、监控、限流。
- 设计优雅,易于扩展
缺点:
- 依赖Netty与WebFlux,不是Servlet编程模型
- 不能再Servler容器下工作,也不能达成WAR包
- 不支持Spring Boot 1.X
Spring Cloud Gateway 核心概念
- Route(路由):spring cloud Gateway的基础元素,可以简单理解成一条转发规则。包含ID、目标URL、Predicate集合一级Filter集合。
- Predicate(谓词):即java.util.function.Predicate,spring cloud Gateway使用Predicate实现路由的匹配条件
- Filter(过滤器):修改请求以及响应
Spring Cloud Gateway 架构
- 客户端发送请求到网关
- Gateway Handler Mapping 依据Predicate来判断请求路径是否匹配路由的配置,如果匹配,则请求发送的Gateway Web Handler
- Gateway Web Handler读取路由上的Filter,然后把请求交给Filter处理
- Filter被中间虚线分开,左边(“pre” filter)是发送请求到微服务之前处理的,右边(“post” filter)是请求从服务返回到网关之后处理的
Route Predicate Factories(路由谓词工厂)
Spring Cloud Gateway 提供了11中内置好的谓词工厂。这里就不一一去做演示了,可以参考官方文档Spring Cloud Gateway谓词工厂
整合spring cloud gateway
引入jar包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
写配置
server.port=9003
# Nacos注册时候的名称
spring.application.name=micro-provider
# Nacos 注册中心配置地址(无需配置 HTTP 协议部分)
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#让gateway通过服务发现组件找到其他微服务
spring.cloud.gateway.discovery.locator.enabled=true
测试
这里分别启动micro-provider、micro-gateway两个服务
直接调用
http://localhost:9003/echo/123
通过网关
http://localhost:9004/micro-provider/echo/gateway%E8%AF%B7%E6%B1%82
两次都可以请求通,这里gateway会自动去nacos拉取服务列表,依据路由规则做转发