目录

一、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

 

 



 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐