目录
一、场景介绍
开发过程中,随着业务需求的增加,处理请求瓶颈等等原因,大部分公司会将原有的单体架构服务向微服务架构迁移。举个简单的例子,原某个单体架构中有用户中心,基础数据,支付等等多种业务。一个服务完全满足不了现在的需求,于是拆分出,用户模块,基础数据模块,支付模块,损益模块等多个微服务。
- user-service 用户服务 /user/*
- account-service 支付服务 /account/*
- infomation-service 基础信息服务 /information/*
服务拆分以后,对应业务可以在对应模块开发,减轻了原有单体服务的 "重量",各个微服务各司其职,起到自己对应的作用,前端调用也从原有的打在一个单体服务的情况,分发到各个微服务。
但是这样的缺点也很明显。
- 如果服务部署在不同的服务器上,对应的IP 10.1.1.1/infor 、 10.1.1.2/user 、 10.1.1.3/accout,那么映射关系就是多个,配置很繁琐。
- 接口不能统一管理,每个服务的接口都是各玩各的,那么问题也就很明显了,最简单的例子,接口鉴权A是A,B是B,C是C。
- 熔断机制,超时机制,过滤机制,鉴权机制,每个服务都要配置,这样公用配置岂不是要配置3份甚至更多,维护也要维护三份,这样的事情就是浪费时间好么。
那么,我们可不可以对微服务接口进行统一接入管理,公有流量,访问策略统一执行,调用者完全透明。而每个微服务只专心创建和管理提供接口即可。这时候我们就需要引用API网关。
二、API网关
-
什么是API网关?
网关的角色是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。
-
API能做什么事情?
三、Gateway
-
什么是Gateway
Gateway是Spring官方基于Spring5.x,Boot2.x开发的网关,相当于Zuul1.x的升级版,替代版,但是相较于Zuul更高效,而且因为是Spring官方出品,跟SpringCloud融合度更高,使用起来更方便。不仅提供了统一的路由方式,而且提供了Filter链,可以很好的实现路由中心,鉴权中心等功能。而且对服务的限流,熔断,监控也很好的提供了支持。
-
Gateway的几个重要组件
- Route(路由):网关的基本构建块。由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
- Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
- Filter(过滤器):这是
org.springframework.cloud.gateway.filter.GatewayFilter
的实例,可以使用它修改请求和响应。
-
怎么用Gateway?
其实就是在Route设置对应的断言,也就是匹配规则,比如断言设置的是 10.1.1.4/user/* 对应 10.1.1.2/user/* ,设置了对应的自定义Filter,Gateway就会按照路由的配置自动转发到对应的服务上面,并且在请求之前会走到自定义的Filter执行过滤规则,这些按照配置都会自动完成,所以对于初始使用来说还是蛮简单的。
四、搭建入门Gateway(省去Cloud配置)
按常规,微服务中搭配Cloud,我们将每个微服务的接口注册到注册中心中,Gateway按照路由就会去注册中心中寻找对应的接口进行转发调用,但是本文仅仅是给大家演示一个入门Demo,所以省去了Cloud部分,直接实现去服务中调用,相当于一个高级些的HttpClient。
-
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
-
配置yml(也可使用配置类在项目中配置)
server:
port: 9099
spring:
cloud:
gateway:
routes:
- id: server-account
uri: http://localhost:9083
predicates:
- Path=/account/*/*
如上图配置,比如我们访问Gateway的localhost:9099/account/*/*时,Gateway就会按照断言规则去localhost:9083/account/*/*上调用请求。
四、总结
本文仅仅是简单的介绍API网关,目的在于大家理解,为什么我们使用微服务架构以后,还要统一管理API接口,一方面是方便接口调用,另一方面跟做一个切面很像,在接口调用之前,做一个公有策略。后续文章我准备继续探索Gateway,融入Hystrix实现熔断,增加Filter实现Token鉴权,完成鉴权中心和流量中心的配置。