转载本文需注明出处:微信公众号EAWorld,违者必究。
前言:
微服务平台的安全控制包括登录认证、用户授权、服务调用安全等多个方面,其中,服务调用安全又分为系统内服务调用认证、系统间服务调用认证。
EOS微服务平台提供基于EOS SDK的访问控制机制和基于网关的API授权鉴权机制,用于实现同一系统内部服务调用和跨系统服务调用的安全认证。
目录:
1.服务安全
2.API发布到网关
3.精细化授权
4.服务调用与网关鉴权
5.总结
1.服务安全
微服务之间的调用,可以分为系统内服务调用、系统间服务调用。在EOS微服务平台中,同一系统内的微服务之间可以直接互相调用,不同系统间的微服务必须通过网关进行API发布、授权、访问鉴权、路由转发才能实现调用。EOS微服务平台的服务调用安全认证依赖于平台提供的基于EOS SDK的访问控制机制和基于网关的API授权鉴权机制。
1、 同一系统内的服务调用认证
在EOS微服务管理平台(Governor)中可以创建系统,系统有唯一的系统编码、系统凭证,每个微服务应用都必须属于某个系统。
对于同一系统内的微服务,EOS微服务平台允许服务之间互相调用,通过微服务应用依赖的EOS SDK实现服务调用认证。
(1)微服务应用配置文件application.properties中添加服务调用认证所需的配置;
参数说明如下:
系统凭证、系统编码可以在Governor的系统管理功能中获取,如下图所示:
微服务应用配置文件示例如下:
(2) 服务调用方发起服务调用请求时,SDK会将系统编码、系统凭证放到请求头;
(3) 服务提供者收到调用请求时,SDK会拦截所有的请求,检查请求头中的X-EOS-SourceSysKey系统凭证、X-EOS-SourceAppCode应用所属系统编码。
如果系统编码、系统凭证与本系统一致,并且根据X-EOS-SourceAppCode检查调用方IP确实属于已注册的应用实例组的实例,则说明调用方是本系统内的其他应用,允许继续访问当前服务,否则拒绝访问。
2、跨系统的服务调用认证
对于系统间的服务调用认证,EOS微服务平台要求服务提供者必须将API发布到网关、配置路由规则、对调用方进行订阅授权,调用方获得授权之后调用网关上已发布的API。EOS微服务平台将基于网关的API授权鉴权与基于EOS SDK的访问控制机制相结合,实现跨系统的服务调用认证。
接下来的内容将会对跨系统的服务调用认证进行详细介绍。
2.API发布到网关
1、API导入与发布
在EOS微服务平台中,一个系统部署一套网关,通过Governor的网关API发布功能,可以将服务提供者的对外API发布到所属系统的网关上。
(1) 将API导入网关;
选择系统内的应用及实例组,通过微服务实例的swagger在线接口描述显示所有API,选择需要发布的API,并为发布后的API访问路径设置前缀,进行导入;
(2) 导入后默认状态为未发布,选择需要发布的API,进行批量发布。
2、 路由规则配置
API发布到网关之后,通过Governor为网关配置路由规则,如下图所示:
路由支持设置黑白名单、支持根据令牌桶算法对路由设置限流策略。
并且,路由规则提供Spring Cloud Gateway常用的路由规则样例模板,包括rewrite-path-filter、hystrix-gateway-filter、prefix-path-filter等;
3.精细化授权
1、订阅者管理
在实际业务场景中,往往会对网关API的授权控制提出比较细粒度的要求。例如,在下图所示场景中,订单管理系统的订单详情应用只允许调用产品管理系统发布的产品查询接口,而领券下单应用可以调用产品管理系统的产品查询接口、库存更新接口等。
在EOS微服务平台中,通过订阅者的模式来实现精细化的授权管理。每个需要授权的系统可以有多个订阅者,每个订阅者有各自的订阅凭证,订阅者与API建立授权关系。
在Governor的网关API授权管理功能中,服务提供者系统可以为每个需要授权的系统创建多个订阅者。
说明:微服务平台并不限制订阅者必须与应用是一对一的关系,多个应用如果需要授权的API完全相同,可以使用同一个订阅者的订阅凭证。
2、API授权
在API授权管理功能中,可以为每个订阅者授权访问不同的API,如下图所示:
4.服务调用与网关鉴权
1、系统内服务调用
此处以EOS微服务平台V8.1版本的后端项目及EOS服务的调用为例;
(1) 服务提供者StockManage在实现构件包中将已经实现的逻辑流或逻辑构件通过向导发布为EOS服务,在api构件包中生成EOS服务描述文件;
(2) 服务消费者ProductManage添加服务提供者的api构件包依赖;
代码语言:javascript复制<dependency>
<groupId>com.primeton.eos</groupId>
<artifactId>com.primeton.eos.stockmanage.api</artifactId>
<version>1.0.0</version>
</dependency>
(左右滑动查看全部代码)
(3) 在服务消费者的实现构件包的逻辑流中利用EOS服务图元直接调用服务提供者的EOS服务,运行期逻辑流调用EOS服务时,服务提供者依赖的SDK会对服务调用进行访问控制。
2、 跨系统服务调用
(1) 在Governor中将服务提供者ProductManage的EOS服务发布到所属系统的网关,并配置路由规则,然后为服务消费者OrderManage所属系统创建订阅者,并对其所需调用的EOS服务进行授权;
(2) 服务消费者OrderManage添加服务提供者的api构件包依赖;
代码语言:javascript复制<dependency>
<groupId>com.primeton.eos</groupId>
<artifactId>com.primeton.eos. productmanage.api</artifactId>
<version>1.0.0</version>
</dependency>
(左右滑动查看全部代码)
(3) 服务消费者在boot构件包实现SDK的SDKApiSubscriberProvider接口,返回的ApiSubscriber需要包含订阅凭证,跨系统调用接口时,订阅凭证会自动被SDK的RestTemplate和Feign拦截器添加到请求头中;
(4) 服务消费者可以在逻辑流中利用EOS服务图元调用网关上发布的EOS服务,此处的远程URL为网关上发布的EOS服务URL。
3、API网关鉴权
(1) 网关收到调用请求时,会校验请求头的API订阅凭证是否有权限调用指定的API,校验通过后,会按照路由规则将请求转发给服务提供者;
(2) 服务提供者收到网关转发的调用请求时,SDK会拦截所有的请求,检查请求头中的X-EOS-GatewayCode网关编码,如果为当前系统所属网关编码,则说明是当前系统授信网关,允许其继续访问,否则拒绝访问。
同时,考虑到高并发场景下的性能问题,为了避免频繁从持久化存储中查询数据,EOS微服务平台的网关内部设计了基于内存的高速缓存,网关发布的API、订阅关系、路由规则等都会加载到缓存。
4、调用链路追踪
对于复杂的系统内以及跨系统服务调用跟踪,通过Governor提供的业务链路追踪可以查看一次前端请求的完整调用链路,包括接口耗时、URL、状态等链路信息,可以帮助用户定位问题、解决性能瓶颈,如下图所示:
5、 微服务多版本
在灰度场景下,服务提供者会有多个版本同时在线,并且可能不同版本对外发布的API也会有差异,在EOS微服务平台中可以通过多个应用实例组、灰度策略、多个订阅者的方式来实现。这里结合以下示例场景来说明:
(1) 库存应用有两个在线版本,分为两个应用实例组,分别是默认实例组和V2.0版本,并且V2.0版本实例组的API也发布到网关;
(2) 对于调用服务提供者V2.0版本API的服务调用方,为其设置单独的订阅者,订阅服务提供者V2.0版本发布的API;
(3) 平台在默认情况下,所有的服务调用请求都只会发给默认实例组的实例,所以还需要在Governor中设置灰度策略,例如:请求头中如果指定某个自定义参数值,请求将会发给V2.0版本实例组。
(4) 服务调用方发起调用请求时,在请求头中设置灰度策略中指定的参数值,实现灰度场景下的跨系统服务调用。
5.总结
EOS微服务平台提供了基于EOS SDK的访问控制机制和基于网关的API授权鉴权机制,用于实现同一系统内部服务调用和跨系统服务调用的安全认证。
对于同一系统内的微服务,EOS微服务平台允许服务之间互相调用,微服务集成的EOS SDK通过检查请求头中的系统凭证和系统编码、核对服务调用方的IP地址,对服务调用进行访问控制。
对于跨系统的服务调用,EOS微服务平台要求服务提供者必须首先将API发布到所属系统的网关、配置路由规则,然后为服务调用方设置订阅者并进行授权。服务调用方获得授权之后根据订阅凭证调用服务提供者网关上已授权的API,网关会对调用请求进行访问鉴权和路由转发,服务提供者收到网关转发的调用请求时,EOS SDK还会检查是否来自当前系统授信网关,从而完成服务调用的认证。
除此之外,EOS微服务平台还提供Coframe(应用基础框架)、IAM(统一认证管理平台)作为登录认证、用户授权的默认实现,与服务调用安全认证一起构成了EOS微服务平台的安全控制机制。