搞微服务真的很麻烦的,为了解决单点的性能问题引入微服务,同时也引入了无数新的问题出现。对于这些问题,亦有一些新的概念和工具被发明出来,这篇记录一下,我见过的各种微服务中的开源工具,以及它们所存在的意义,提供了哪些便利或者解决了什么问题。
基础设施
ZooKeeper
ZooKeeper是一个具有高可靠性的分布式的协作工具,基于PAXOS协议,其实现了一个可保证分布式一致性的类文件系统。
利用它的这个机制以及它提供操作与读取该类文件系统的API,分布式系统可用它实现各种功能,包括数据发布/订阅,负载均衡,命名服务,分布式协调/通知,集群管理,Master选举,分布式锁,分布式队列与服务发现等多个分布式中常见的需求应用场景。
rabbitmq
基于AMQP协议,使用非常小众的erlang语言编写的分布式消息队列,有非常详实的文档与tutorials,同时提供了web页面,用于管理和查看队列的使用情况。
jumpserver
使用Django编写的跳板机系统,可通过终端登录各测试机,同时提供web应用,可用于某服务器上文件的上传与下载,跑脚本什么的再方便不过了。
它有着全套的权限管理,遵循 Web 2.0 规范,配备了业界领先的 Web Terminal 解决方案,交互界面美观、用户体验好,采纳分布式架构,支持多机房跨区域部署,中心节点提供 API,各机房部署登录节点,可横向扩展、无并发限制。
azkaban
由linkedin研发的分布式调度工具,使用Java编写,可使用Cron的配置方式来管理分布式调度任务,数据落于MySQL,整体还是蛮重的。
具有便于使用的web UI,并且在任务执行成功或失败时可以发送邮件通知,并且提供重试机制。
Apollo
携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,提供了Java,Python等语言的接入sdk。
RPC框架
微服务中RPC框架当然是少不了的,最常用的是Facebook研发的thrift,以及阿里的dubbo,现都归于Apache基金会下,此外,饿了么研发的thriftpy在Python领域也比较优秀。
当然,在Thrift框架的上层,公司往往会再包一层,做为自己的框架,在其中引入sentry、zookeeper,gitlab地址pull idl等基于公司具体情况的处理。
发布
jenkins
jenkins是由Java编写的开发自动化平台,其本身提供了1000+的plugins可供各种自动化场景使用,使用者可以通过编写jenkinsfile来自定义自己的自动化任务。
使用jenkins的常见场景为项目构建,运行自动化测试,静态代码分析与项目部署。
spinnaker
spinnaker是一个由Netflix开发的使用Python编写的用于持续集成的平台,主要用于结合容器发布各环境的代码,发布地点可以是各种云平台,包括 AWS EC2, Kubernetes, Google Compute Engine, Google Kubernetes Engine, Google App Engine, Microsoft Azure和Openstack等,而这,已经包含了市场上所有主流的云服务商。
它的一个很大的特点是自动化,可以通过git events, Jenkins, Travis CI, Docker, CRON等事件来触发构建而不用人工手动去操作,在工作中的一个非常便利的常见使用场景是在自己的开发分支使用git push命令后,spinnaker将会自动构建这个branch的容器,并生成相应的访问url,真的是非常方便。
kubernetes
使用Go语言编写的容器管理平台,它的官网对自己的简介为Production-Grade Container Orchestration,Automated container deployment, scaling, and management。
用于编排、发布容器,提供水平伸缩性,便与扩展,并且可以登录某个容器,运行命令、查看log等。
监控
sentry
你不可能没听说过的跨平台Bug追踪网站,Github上17000+star,其受欢迎程度可见一般。它使用Python编写,并且提供了大部分主流语言的API供其使用,它能很好地融入log系统中,完备地记下问题出现当时的调用链与场景。
常见的使用方式为将它纳入到各种公司框架中,使得开发人员直接拿到logger,当使用warning或error时,sentry就会记录这个事件并发邮件给到关心它的人。
open-falcon
小米开源的微服务监控系统,使用它可以查看各服务器的状态,包括网络IO,与CPU运行情况,以及数据库的负载。
生成user friendly的图表,提供强大的统计与自定义功能,用户可以按照自己想要的方式获取信息。
kibana
elastic团队的作品,用于数据收集与分析,可以用于根据各种条件(时间、关键字)等来查询各环境的日志,正是根据这些日志,它可以生成各种统计图表等,被称为elastic技术栈的视窗。
不过说实话它这个查询的界面有些难懂,不够user friendly。
cat
cat是大众点评开源的一套基于java的实时应用监控平台,主要应用于服务中间件框架(MVC 框架、RPC 框架、持久层框架、分布式缓存框架)的监控,为开发和运维提供各项性能指标、健康检查、自动报警等可视化服务。
除了上面提到的工具提供的错误日志统计、CPU负载、各种连接池状态之外,cat还可以记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,可以用来记录一段代码的执行时间和次数,特别地,对Java应用程序,它可以上报一些如JVM内存、GC等核心指标。
不只如此,对于业务方面的指标,也可以利用它来进行监控和统计,比如订单数、交易额、支付成功率等。
功能真的是很全面了,有很多业界公司都在使用这个工具,但忍不住要吐槽的一点是,界面可能真的有点丑,不如上面的sentry好看。
其他
Gitlab
开源的用于公司自建代码仓库的项目,其功能丝毫不逊于Github。
phabricator
使用PHP编写的code review平台。
redmine
使用ROR编写的项目管理工具,主要用于线上bug的提出、跟踪与管理。
以上内容只是基于我在工作中接触过的,但这并不是全部,还有一堆其他的自研应用用于优化整个流程与开发效率,比如Nginx配置平台,以及一些基于业务的数据分析平台,数据打点平台,API管理应用(与spinnaker集成直接将前后端连接起来),灰度发布平台,AB Test实验管理平台,等等,基于一个思想就是有开源的就尝试使用开源的产品,找不到合适的,也不妨花些时间自己研发,只要它可以带来整体效率的提升,便是很有意义的。
当然,我上面所提到的例子,可能并不是某个领域的最佳的解决方案,或者在整个微服务架构内还不够全面,希望大家可以分享一下自己觉得好的工具,我也会随着自己见识的不断提升,来逐渐更新这个列表。
总之,devops、微服务真的是有太多的学问,还有很多我没有接触过的东西,里面的水真的是无限深。有太多的工具,太多的可以优化的点,面对这些我们倒也用不着惊慌与烦躁,工具是为了给人带来便利的,一个工具的出现必然是为了解决或者优化一个问题,了解得越多,自己对这种大型网站的整体理解与感知就会更深一些。