9.4 总体架构
融数数据微服务总体架构(Graeae)如图 9.6 所示。
9.4.1 总体架构的特性
融数数据微服务总体架构有如下特性。
Graeae 架构与协议无关。该架构可以基于 Netty4、线程模型及 buffer pool 进行调整,以减少 GC 压力并通过线程切换提升性能协议。
遵循 protocol buffer 协议,可以做到通用性强、序列化性能好、压缩效率高。
语言中立,目前整个架构支持 Java、Python 和 Go 三种语言的开发。
引入了熔断器机制、流量控制、服务治理。
基于 Proxy 和 PaaS 平台进行分布式治理监控。
使用集成 Zipkin 的调用链监控,以及基于 Pinpoint 的 APM 监控。
对于该架构而言,直接调用的性能好于反射调用,且使用 Netty4 线程模型优化。
9.4.2 具体实现
服务提供者 Endpoint 基于责任链模式(如图 9.7 所示)对 gRPC 进行封装,对屏蔽了 gRPC 框架的事件驱动采用同步调用方式,方便业务迁移。
Endpoint 封装了脚手架工具,提供基于 ProtoBuf 的 IDL 接口定义语言,使用契约优先的方式定义服务,并可以自动生产服务端和客户端的代码框架。
代码优先意味着实现简单,能够快速执行。问题也很明显,可能和某个具体语言绑定,面对多语言环境,其打通成本较高。
契约优先的中立性提供了一个中间桥梁,让面向多语言成为了可能,基于契约的元信息为后续治理和演进提供了入口点。缺点是需要引入契约语言的学习,并与多语言进行适配。
Endpoint 采用生命周期自管理的方式,提供容器化的生命周期管理 API 和相应的 SPI,方便扩展及与 DevOps 工具结合。
外部管理(如 Tomcat)让用户不用关注自身的起始、消亡,但带来的不足是对生命周期的管理相对减弱、部署的依赖管理扩散。
进程自治可以加强其对自身生命周期的管理,高内聚,不将依赖扩散。在一定程度上能够带来部署的便利及不同部署环境的适应性(如云环境)。为优雅关闭提供切入点,进一步增强对系统的可控性。
从对环境适应性和对生命周期的管理能力考虑,进程自治有着不可忽略的优势。Endpoint 将配置与代码分离,提供多种方式的配置覆盖能力,使得改变配置无须重新
部署。
配置和代码一起进行的优点是使开发变得简单,但不足也很明显,即面对不同的环境需要部署多套代码,复杂度增加。
配置和代码分离后的优点是真正做到了只部署一套代码。配置信息按环境独立配置,不受环境制约,可随时调整。
集成 Spring Boot,提供自定义注解方式,能够快速启动服务,方便开发。
//服务提供方
public class SmsTemplateApplication {
public static void main(String[] args) {
new SpringApplicationBuilder().sources(SmsTemplateApplication.class)
.web(false).showBanner(false).run(args);
}
}
//服务实现
public class SmsTempletServiceImpl implements SmsTemplateService { @Autowired
private SmsTempletDao smsTempletDao;
@Transactional
public DeleteReply deleteById(IdRequest req) { return SmsTemplateReply.newBuilder().build(); }
}
利用 Proxy 部署和设置服务治理端点,进行分层治理,如图 9.8 和图 9.9 所示。
图 9.9