API网关作用就是把各个服务对外提供的API汇聚起来,让外界看起来是一个统一的接口。同时也可在网关中提供额外的功能。
总结:网关就是所有项目的一个统一入口。
API 网关并不是微服务场景中必须的组件,如下图,不管有没有 API 网关,后端微服务都可以通过 API 很好地支持客户端的访问。
但对于服务数量众多、复杂度比较高、规模比较大的业务来说,引入 API 网关也有一系列的好处:
聚合接口使得服务对调用者透明,客户端与后端的耦合度降低
聚合后台服务,节省流量,提高性能,提升用户体验
提供安全、流控、过滤、缓存、计费、监控等 API 管理功能
所以,在分布式微服务架构中,API网关的重要性是非常高的。
API网关由路由转发和过滤器(编写额外功能)组成。
接收外界请求,通过网关的路由转发,转发到后端的服务上。
网关非常重要的功能就是过滤器。在Gateway中,过滤器默认提供了25内置功能还支持额外的自定义功能。
对于我们来说比较常用的功能有网关的容错、限流以及请求及相应的额外处理等。
由Spring 自己推出的网关产品,完全依赖Spring自家产品。符合Spring战略意义,其更新版本等都由Spring自己把控。目前很多项目中都是使用Gateway替代Zuul。在本套课程中讲解的也是Gateway。
属于Spring Cloud Netflix下一个组件,具有灵活、简单的特点。在早期Spring Cloud中使用的比较多。其版本更新都依赖于Netflix Zuul。
Spring Cloud Gateway是Spring Cloud 的二级子项目,提供了用于在Spring网络流程中构建API网关的代码库,旨在提供一个简单有效的方式,路由到API;并提供了必要的各种功能,如:路由、权限安全、监控/指标等。
在学习Gateway时里面有一些名词需要提前了解,这对于后面的学习是很有帮助的。
Route中文称为路由,Gateway里面的Route是主要学习内容,一个Gateway项目可以包含多个Route。
一个路由包含ID、URI、Predicate集合、Filter集合。在Route中ID是自定义的,URI就是一个地址。剩下的Predicate和Filter学习明白了,Route就学习清楚了。
谓词是学习Gateway非常重要的一点,简单点理解:谓词就是一些路由前的条件和内容。
在Gateway运行过程中,Filter负责在路由后,代理服务“之前”或“之后”做的一些事情。
网关客户端访问Gateway网关,Gateway中Handler Mapping对请求URL进行处理。处理完成后,交由Web Handler处理,Web Handler 运行时会被Filter过滤。Filter中前半部分代码是处理请求的代码。处理完成后调用真实被代理的服务;被代理服务返回响应结果,结果会被Filter中后半部分代码过滤处理;操作完成后把结果返回给Web Hanlder,再返回给Handler Mapping,最终响应给客户端。
SpringCloud Gateway的底层基于Netty,主要组成有Predicates(谓词)、Route(路由)、Filter(过滤器)
使用前面课程中的Nacos注册中心即可。
使用前面课程中的任意微服务工程即可。
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
dependencies>
# 服务器端口, gateway启动器中,不包含Tomcat,自带Netty服务器。提供HTTP协议处理能力。
server:
port: 9999
# 配置spring应用名字,并注册到nacos中
spring:
application:
name: gateway-app
cloud:
nacos:
discovery:
server-addr: 192.168.8.128:8848
gateway: # 配置 spring cloud gateway 网关相关信息。
discovery: # 网关发现机制,从注册中心中订阅哪些服务。默认订阅所有的服务。
locator: # 默认的路由。默认路由方式是: http://网关IP:网关端口/要访问的具体服务名字/要访问的具体服务中的path地址3
enabled: false # 是否开启默认的路由。默认是false。
lower-case-service-id: true # 是否把注册中心的微服务名字,自动转换成全小写字母。默认是false。
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
访问 http://localhost:9999/application-service/test ,可看到下述结果:
谓词:当满足条件在进行路由转发。
在Spring Cloud Gateway中谓词实现GatewayPredicate接口。其中类名符合:XXXRoutePredicateFactory,其中XXX就是在配置文件中谓词名称。
所有的谓词都设置在predicates属性中,当设置多个谓词时取逻辑与条件,且一个谓词只能设置一组条件,如果需要有个多条件,添加多个相同谓词。
用于匹配路由地址规则的谓词。
修改配置文件application.yml:
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled<