微服务之路

为什么要走微服务

优点

  • 迭代迅速?
  • 适合大企业
  • jira是最好的例子

缺点

  • 开发难度大
    • api向后兼容性: 不同api,还是不同api版本
    • 单元测试覆盖率
    • 如何确定微服务的边界?
  • 要有PAAS层
    • 数据库
    • 中间件
  • devops要求高
    • 自动打包
    • 自动部署
    • 自动生成配置
    • 自动测试
    • 自动上线

我们是怎么做的

自动打包

  • 我们选用了Travis-CI的方案,这个是SAAS服务,只要写好.travis.yml就可以了
    • 支持java等几十种语言
    • 上传到几十种平台
    • 跟github集成
    • 简单的yaml格式编写
  • 代码检查是用的sonar,支持以下功能:
    • 糟糕的复杂度分布:文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们
    • 重复:sonar可以展示源码中重复严重的地方
    • 缺乏单元测试: sonar可以很方便地统计并展示单元测试覆盖率
    • 没有代码标准: sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写
    • 没有足够的或者过多的注释: 没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降
    • 潜在的bug: sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的bug
    • 意大利面式设计: 通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,检测耦合, 可以检测自定义的架构规则, 可以利用LCOM4检测单个任务规则的应用情况
  • 包仓库是用的nexus,同时我们还做了一个nexus镜像站点
    • 基于maven的包管理
    • 代理外部maven仓库
    • 管理本地maven仓库
  • docker仓库
    • 基于vmware的harbor
    • 可以进行账号管理
    • 权限分类更细致(支持目录,支持pull和push)

基础平台

  • mesos+marathon
    • mesos作为DC/OS使用
    • mesos对cpu,内存,网络(加patch)限制
    • marathon进行调度
  • PAAS基础
    • 基础资源信息收集Collectd(对比prometheus, ganglia等)
    • 服务metric收集StatsD, Collectd集成了部分StatsD的功能,有些statsd支持的类型不支持
    • influxdb数据存储(历史数据如何保存), sql更好,方便扩展。
    • 日志收集fluentd,优点是方便扩展,第三方插件多,缺点是效率不是很高,处理量大的时候需要起多个进程。
    • redis使用了Mr-redis这种方案。也有redis-cluster这样的方案,但是像codis这样的因为使用blpop和rpush是没法支持的。
    • 服务注册consul, 其他有zk, etcd. cousul的优势是支持多数据中心。Consul通过Gossip协议,完成跨数据中心的同步;而且其他的产品则需要额外的开发工作来实现
    • APIGateway: zuul, kong, istio

开发规范

  • 如何集成服务发现: kce
  • 根据不同环境自动生成配置。
  • 基础组件标准化: redis client, kafka client等
  • 如何查找线上问题的日志:日志格式标准化
  • 服务调度跟踪:pinpoint,zipkin
  • 用户请求跟踪: 每一个请求加入msgid

现有问题

  • elasticsearch,cassandra如何进行paas化?还是没有这个必要先阶段?
  • 波峰波谷的调度?
  • 整体的扩容缩容。