大小公司都适用的架构选型工具箱(涵盖上百个组件)( 二 )


binlog是实时增量工具 , ETL工具做辅助 。 通常一个数据同步功能 , 需要多个组件的参与 , 他们共同组成一个整体 。
五、通讯
推荐:http+json , 方便调试 。 高性能要求可选二进制协议 。
大小公司都适用的架构选型工具箱(涵盖上百个组件)文章插图
Java 中 , netty已经成为当之无愧的网络开发框架 , 包括其上的socketio(不要再和我提mina了) 。 对于http协议 , 有common-httpclient , 以及更加轻量级的工具okhttp来支持 。
对于一个rpc来说 , 要约定一个通讯方式和序列化方式 。 json是最常用的序列化方式 , 但是传输和解析成本大 , xml等文本协议与其类似 , 都有很多冗余的信息;avro和kryo是二进制的序列化工具 , 没有这些缺点 , 但调试不便 。
rpc是远程过程调用的意思, 其中 , thrift、dubbo、gRPC默认都是二进制序列化方式的socket通讯框架;feign、hessian都是onhttp的远程调用框架 。
对了 , gRPC的序列化工具是protobuf , 一个压缩比很高的二进制序列化工具 。
通常 , 服务的响应时间主要耗费在业务逻辑以及数据库上 , 通讯层耗时在其中的占比很小 。 可以根据自己公司的研发水平和业务规模来选择 。
六、微服务
推荐:
【大小公司都适用的架构选型工具箱(涵盖上百个组件)】1.注册中心:consul
2.网关:nginx+Gateway
3.配置中心:Apollo
4.调用链:Skywalking
5.熔断:resilience4j
大小公司都适用的架构选型工具箱(涵盖上百个组件)文章插图
我们不止一次说到微服务 , 这一次我们从围绕它的一堆支持框架 , 来窥探一下这个体系 。 是的 , 这里依然是在说spring cloud 。
默认的注册中心eureka不再维护 , consul已经成为首选 , 它使用raft协议开发开箱即用 。 nacos、zookeeper等 , 都可以作为备选方案 。 其中nacos带有后台 , 比较适合国人使用习惯 。
熔断组件 , 官方的hystrix也已经不维护了 。 推荐使用resilience4j , 最近阿里的sentinel也表现强劲 。
对于调用链来说 , 由于OpenTracing的兴起 , 有了很多新的面孔 。 推荐使用jaeger或者skywalking 。 spring cloud集成的sleuth+zipkin功能稍弱 , 甚至不如传统侵入式的cat 。
配置中心是管理多环境配置文件的利器 , 尤其在你不想重启服务器的情况下进行配置更新 。 目前 , 开源中做的最好的要数apollo , 并提供了对spring boot的支持 。 disconf使用也较为广泛 。 相对来说 , spring cloud config功能就局限了些 , 用的很少 。
网关方面 , 使用最多的就是nginx , 在nginx之上 , 有基于lua脚本的openrestry 。 由于openresty的使用非常繁杂 , 所以有了kong这种封装级别更高的网关 。
对于spring cloud来说 , zuul系列推荐使用zuul2 , zuul1是多线程阻塞的 , 有硬伤 。 spring-cloud-gateway是spring cloud亲生的 , Spring Cloud 大力支持 , 基于 Spring5.0 的新特性 WebFlux 进行开发 。 底层网络通信框架采用的是 Netty , 吞吐量高 。
七、分布式工具
大小公司都适用的架构选型工具箱(涵盖上百个组件)文章插图
大家都知道分布式系统zookeeper能用在很多场景 , 与其类似的还有基于raft协议的etcd和consul 。
由于它们能够保证极高的一致性 , 所以用作协调工具是再好不过了 。 用途集中在:配置中心、分布式锁、命名服务、分布式协调、master选举等场所 。
对于分布式事务方面 , 则有阿里的fescar工具进行支持 。 但如非特别的必要 , 还是使用柔性事务 , 追寻最终一致性 , 比较好 。
八、监控系统
推荐:prometheus + grafana + telegraf
日志收集:大量ELKB , 小量loki
大小公司都适用的架构选型工具箱(涵盖上百个组件)文章插图
监控系统组件种类繁多 , 目前 , 最流行的大概就是上面四类 。
zabbix在主机数量不多的情况下 , 是非常好的选择 。
prometheus来势凶猛 , 大有一统天下的架势 。 它也可以使用更加漂亮的grafana进行前端展示 。
influxdata的influxdb和telegraf组件 , 都比较好用 , 主要是功能很全 。
使用es存储的elkb工具链 , 也是一个较好的选择 。 我所知道的很多公司 , 都在用 。
九、调度
推荐:xxl-job
大小公司都适用的架构选型工具箱(涵盖上百个组件)文章插图
大家可能都用过cron表达式 。 这个表达式 , 最初就是来自linux的crontab工具 。
quartz是java中比较古老的调度方案 , 分布式调度采用数据库锁的方式 , 管理界面需要自行开发 。