微服务之api-gateway
目录
一、api网关设计
二、api网关部署
三、api网关实现技术
四、关键功能设计
五、总结
六、实战使用
一、api网关设计
1、含义
API网关是微服务架构(Microservices Architecture)标准化服务的模式。API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理则是一样。API网关统一服务入口,可方便实现对平台众多服务接口进行管控,对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或者计费等等
2、组件设计
3、组件介绍
4、相关网关框架
1、基于nginx平台实现的网关有:KONG、API Umbrella
2、自研发的网关有:apigee、zuul
3、老牌esb控件:camel、mule
4、自定义:servlet、spring-mvc、node.js、erlang
二、api网关部署
三、api-gateway实现技术
1、camel:接收请求、处理和路由选择、后端请求
2、服务端:spring-mvc
3、服务注册:通过收集应用中controller+requestMapping向zk注册规范信息
4、服务发现:获取zk中注册的服务信息
5、支持手动注册服务
四、关键功能
1、限流设计
限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。这种模式不能解决服务依赖的问题,只能解决系统整体资源分配问题,因为没有被限流的请求依然有可能造成雪崩效应。限流模式则可以称为预防模式
2、隔离设计
这种模式就像对系统请求按类型划分成一个个小岛的一样,当某个小岛被火少光了,不会影响到其他的小岛。例如可以对不同类型的请求使用线程池来资源隔离,每种类型的请求互不影响,如果一种类型的请求线程资源耗尽,则对后续的该类型请求直接返回,不再调用后续资源。这种模式使用场景非常多,例如将一个服务拆开,对于重要的服务使用单独服务器来部署,再或者多中心。
(1)线程池隔离模式:使用一个线程池来存储当前的请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式需要为每个依赖的服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)
(2)信号量隔离模式:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服
3、熔断设计
这种模式主要是参考电路熔断,如果一条线路电压过高,保险丝会熔断,防止火灾。放到我们的系统中,如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。
其中最重要的是三个模块:熔断请求判断算法、熔断恢复机制、熔断报警
(1)熔断请求判断机制算法:使用无锁循环队列计数,每个熔断器默认维护10个bucket,每1秒一个bucket,每个blucket记录请求的成功、失败、超时、拒绝的状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。
(2)熔断恢复:对于被熔断的请求,每隔5s允许部分请求通过,若请求都是健康的(RT<250ms)则对请求健康恢复。
(3)熔断报警:对于熔断的请求打日志,异常请求超过某些设定则报警
4、超时设计
超时分两种,一种是请求的等待超时,一种是请求运行超时。
等待超时:在任务入队列时设置任务入队列时间,并判断队头的任务入队列时间是否 大于超时时间,超过则丢弃任务。
运行超时:直接可使用线程池提供的get方法
五、总结
API网关作为企业能力开放的一个门户,除了具备基本的请求转发、协议转换、路由等功能,以及高性能和高稳定性外,还需具备良好的扩展性,已便于网关能力的不断增强。在网关实施过程中,要规划好网关层与服务层的交互方式,尽量使得网关层与服务层解耦,便于各个团队工作的独立性。另外,在API的管理上,需要提供API全生命周期的发布、配置、鉴权、流控、监控等配套的管理功能。才能让API网关真正在企业中运转起来。
六、实战使用
1、适用于任何基于spring-mvc框架
2、可以自定义注册满足的接口信息道zk
3、基于http的网关代理
4、项目介绍:
项目分为4个模块
hms-gateway-api :定义用到的模型:节点、服务、限流、隔离、熔断
hms-gateway-register:收集客户端节点和url信息注册到zk
hms-gateway-core:http代理核心处理:服务发现和路由、限流、隔离、熔断
hms-gateway:代理入口,打包成war进行部署
hms-gateway-admin:后台管理,对节点和服务进行启用、禁用、限流、隔离、熔断、接口管理平台
5、框架使用
如果你是spring-mvc项目,两步完成框架使用
依赖
a、maven 引入
<dependency>
<groupId>org.hbhk.hms</groupId>
<artifactId>hms-gateway-register</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
b、spring 配置文件
<bean id="restServiceRegistry" class="org.hbhk.hms.gateway.registry.RestServiceRegistry">
<!--zk地址,此地址与api-gateway配置一致-->
<property name="registryAddress" value="47.98.169.10:2181"/>
<!--应用名称-->
<property name="app" value="hbhk" />
<!-- 此端口配置是为了试吃maven tomcat 插件开发支持,如果内部能获取到端口,此配置无效 -->
<property name="port" value="8082" />
</bean>
c、api-gateway 使用
1、修改配置文件 config.properties 里面的zk地址
zk.host=47.98.169.10:2181
zk.timeout=26000
2、maven 执行 clean install 打成 war部署 ,或者 maven tomcat 插件启动 clean tomcat7:run
未来预告
1、微服务之服务注册和服务发现
2、微服务之api网关
3、微服务之异步mq(最终事务一致性)
4、微服务之分库分表
5、微服务之全链路跟踪
注意事项: 一切都有源码 ,如需源码联系微信:hmsjava