我们现在做TECH SPEC的时候可能关注内部的实现,如果是SOA的话,我们就需要关注现在在做的这个系统会用到别人的哪些接口,别人可能会用到我什么接口,我需要公开出来。可能还会考虑,我用了ABC三个系统的接口,是否需要把这个逻辑以粗粒度服务公开出来。每一个公开接口的参数、返回都需要仔细考虑,把这些都列入到架构设计中,和架构师一起完成服务的定义。开发人员可能只对自己系统的接口和逻辑比较熟悉,架构师的作用是给开发人员建议,哪些接口你可能需要,哪些接口你可能需要对外提供,是否需要做缓存。
我们现在的部署是非常简单的,如果实施了SOA,很有可能一个系统需要调用十几个外部子系统的接口,每一个接口都需要制定地址、调用策略以及契约。地址和调用策略需要是可配置的,一般定义在配置文件中或者数据库中,这样一个系统的部署可能非常复杂,打个比方就像芯片的引脚一样,有很多,一个引脚没有接到合适的地方,系统就不能工作。虽然部署负责了,但是系统之间的耦合非常小的,大家只是依赖于某个网络环境中的地址,依赖于某个契约。这样的话,系统的伸缩性就很强,有些服务需要很高的资源,就给独立的服务器,有些服务占用资源很小,可以合并在一起。当然,也可以根据服务的性质,比如特别需要IO、特别需要CPU来分配到合适的服务器上。服务器并不一定是一样的,有的服务器内存特别大,有的服务器CPU特别好。
还会遇到一个问题,就是开发人员不太愿意调用其它的接口。一是对别人的东西往往默认会觉得是实现糟糕的,性能很差的,二是觉得不放心,会不会到时候你没给我正确的数据,影响我的开发,产生相互推卸责任的问题。其实,这种想法不对,一个人不可能开发系统的全部,作为使用者来说要使用别人的接口信任别人的接口,作为接口提供者来说需要积极对自己的接口负责,进行完善的单元测试,如果调用者有特别的需求在讨论后进行改进。这也就是说引入SOA的话,我们需要更多的沟通。
说的有点乱,接下来想说说我在实施过程中遇到的一些细节问题,很多时候SOA实施的失败都是因为一些细节。
SOA的接口设计必须基于业务的。架构师应该是一个总导演,对所有系统的业务都有一个认识,理解业务之间的关系,和开发人员一起定义合理的接口。这包括,接口是否代表了业务、是否是合适的粒度、是否会有性能问题,别小看接口设计,一旦确定以后很难修改,接口的好坏决定成败,我列为第一要素。
在实施中,管理很关键,有许多要点是需要有强制的。比如除非特殊需要不能直接引用其它数据库,即使是本系统也应该引用本系统的服务,也就是说网站项目里面没有连接字符串、没有数据访问逻辑,只有端点的配置。还比如是A系统的开发人员有这个责任为A系统对外的所有接口进行后续的维护和功能扩展,不是说A系统结束了,我的数据我也不管,不行,别人如果需要的数据确实是我的数据的话,我就要管。
从性能角度考虑,一般内网中的服务通讯采用TCP(二进制序列化),公网的走HTTP。还有一种方式是IPC方式,进程间通讯,我们以前也用的挺多的,虽然说缓存应该在一个地方建立。但很多时候,某个方法的调用是每次访问页面都需要进行一次或多次的,如果再进行网络调用的话性能很成问题,比如论坛上的脏话过滤,如果某个脏话服务提供了脏话过滤的接口,如果这个这个接口需要TCP调用的话性能不高,这个时候我们会考虑把这个服务部署在WEB服务器上,而不是APP服务器上,IPC方式进行进程间通讯。
到最后我们会发现我们有20个子系统,也就至少有20个服务(一般是以Windows服务部署在APP服务器上)。而且如果服务部署多份做负载均衡的话,可能就有上百个网络地址。一个网站如果引用了5个服务,就需要一个一个IP地址(或者说端点)进行配置,如果将来服务迁移,那么这些网站的配置文件修改是一个大问题。虽然说我们会有一个拓扑图来描述网站之间服务的依赖情况,但是配置文件的修改工作量不小而且容易出错。推荐的做法是有一个数据库来存放所有服务的端点定义、描述,使用一个单独的服务来提供所有服务的端点信息,在网站中只需要配置这个服务的端点信息,然后引用各种服务的契约就可以了。考虑到效率关系,在每一个WEB服务器上都安装有这个配置服务,以IPC方式提供所有网站进行调用,当然,其中的端点信息都会做缓存。
前面说的是网站引用服务的端点信息配置问题,还有一个问题就是服务的健康监视问题,服务是以Windows服务形式运行的,我们需要检测Windows服务的状态,占用的CPU和内存信息。我们在每一个APP服务器上又装有一个AGENT服务,专门用于监视这些服务进程的情况,一旦发现问题会第一时间通知网络部门甚至是开发人员,当然服务无响应的情况比较少,一般常见的情况是服务没有正确部署(缺少DLL不能启动),或者是占用了过多的内存。这个AGENT的另外一个作用就是收集服务器上的错误日志,并且负责更新和重启服务。也就是说所有服务的更新是自动化的更新,我们发布的时候发布到指定的RELEASE服务器,由专门的管理工具进行服务的自动更新,服务如果做负载均衡的话手动更新很麻烦。而且很多情况下相同的服务需要在多个服务器部署,比如IPC服务 。
文章来源于领测软件测试网 https://www.ltesting.net/