孢子框架-接口访问层、ESB、微服务API GateWay对比

时间:2015-10-30 18:41:54   收藏:0   阅读:7213

  如果从百度去搜索“接口访问层”你会发现主要是.NET里面的技术,叫做IDAL,其实是数据访问层接口。它的主要作用是兼容多种数据库。比如你定义一个标准接口,然后实现改接口的SqlServer访问和Oracle访问,那么利用IDAL就可以自由切换数据库。看.NET DEMO PetShop4,总共有22个项目。大体思想是3层,从Model、DAL、BLL,然后他在各层上又采用了工厂模式,把逻辑与实现想分离,比如以前BLL直接调用DAL就好了,但现在BLL却调用了IDAL,IDAL就是一个接口层,里面封装了要完成的一些业务逻辑,而具体的实现则交给DAL去实现,然后借助于工厂模式DALFactory和映射完成IDAL层中类的实例化。

       孢子(Spore)框架所指的接口访问层IAL大概也是这个一个概念,只不过这个概念用于微服务间调用而不是数据库。不过最初有这个想法还是看了沈理的文章《微观SOA:服务设计原则及其实践方式》所启发,再结合其它思想想到的。该思想目前只能算实用新型,具体使用效果还需要进一步验证,不过只是对于中小开发团队,在微服务实施前期是完全可以代替API GateWay的。下图是ESB、微服务API GateWay以及IAL的功能、实现技术、开发难度的对比:

 

功能

实现技术

开发难度系数

ESB

服务注册、路由、负载均衡、授权、监控、多种协议集成

C++、epoll

10

API GateWay

授权、监控、路由、缓存

Go语言或Nodejs

5

IAL+Nginx

路由、负载均衡、授权、监控、多种协议集成

Java、spring AOP

1

  从表中可以看到,其实三者要实现的功能类似。不过从实现技术上来讲ESB最难,IAL最简单。具体ESB采用什么技术还真难说,因为国内大都使用开源的ESB或者使用国外的第三方产品。笔者猜测ESB的实现方式应该跟网游网关的实现技术类似,就是使用C++调用linux epoll(或windows完成端口)来完成高并发。当然nodejs也是调用epoll来完成高并发的,但nodejs封装过后就简单多了。我们看到IAL使用了最简单的java基本语法加上spring AOP(已经算不上技术了)就完成了和ESB一样的功能。如下图:

    技术分享

从上面的图也不难看出,如果使用方调用IAL的方式由API进程内调用换成RPC调用,那么IAL就有点像API GateWay或ESB。当然因为后者需要处理高并发,你这么做了也变不成,还需要加一层高并发处理的壳。IAL如何完成ESB、API GateWay类似的功能,比如授权、监控?主要是通过spring AOP技术,在解释这个之前我们先来看IAL如何实现。

        第一步定义标准接口:

       public interface SporeService {

       public List<Spore> findById(Long id);

       public void update(Spore spore);

    }

       第二步按协议实现这个接口(有点像废话),下面是rest协议实现该接口:

       public class SporeServiceRestProxy implements SporeService {

        ……

    }

       你还可以定义thrift的接口实现:

       public class SporeServiceThriftProxy implements SporeService {

        ……

  }

  第三步,使用spring AOP拦截所有接口,并编写处理模块。

  这就完成了。如果接口访问者需要调用接口只需要注入SporeService来执行面向对象的一些操作即可。通过AOP可以实现诸如授权、监控、缓存、多种协议集成等功能。多种协议集成就不用说了,因为刚才接口的定义方式已经实现了。授权、监控、缓存都可以定义相关的注解,然后使用AOP拦截并处理:

  public class SporeServiceRestProxy implements SporeService { 

  @Cache({"TYPE_UPDATE"}) //缓存操作注解

  @Log({"TYPE_FUND"}) //采集日志注解

  @Secured({"ROLE_SPITTER", "ROLE_ADMIN"}) //授权注解

  @Override

     public void update(Spore spore) {}

  }

  这样注解并使用AOP拦截注解的方法后,其实是形成一条处理管道,你可以在这条管道上添加任何你想处理的宏观功能。并且这些宏观功能你也可以在这里不做处理,将其转发到某服务,以此实现职责分离设计。比如授权,你只需要在AOP模块里将授权信息提交到授权服务,然后拿到结果就可以了。日志采集你只需要将信息发送到消息队列就完事了,剩下的都有日志处理服务去监听处理。至于ESB中提到的服务注册功能,在IAL里面是无法实现的,需要到接口发布模块去实现,在接口发布模块自己编写代码(或配置文件)进行服务注册。

  另外,我们说整个系统是要支持高并发的,那么IAL会影响高并发么,这是不会的。假如一个系统在满负荷运转,只有两个服务,每个服务支持1000的并发,加了API Gateway后,API Gateway至少要支持2000的并发才行,原并发量不变,它不会影响并发量;加了IAL后,IAL和客户端是进程内调用,还是等于客户端直接访问服务,还是2000的并发,加了等于没加,也不会影响并发量。

  其实原本ESB最重要的功能是路由和负载均衡(类似Nginx,Nginx如果加上授权、审计这些功能就变成Web领域的ESB了),但现在这些都不是事,因为有大把技术可以做到,比如Rest接口你用Nginx可以做到,Thrift接口你用Zookeeper可以做到等等。所以理论上IAL+Nginx是可以实现ESB众多功能的,关键是前者太简单了,并且做到了职责分离。

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!