当前位置:[首页 > 韩语学习 > 语法 > 华尔街见闻:基于腾讯云容器服务的微服务架构]

华尔街见闻:基于腾讯云容器服务的微服务架构

发布: 2017-05-09 18:56 | 来源:网络整理 | 查 看:

  华尔街见闻的运营方上海阿牛信息科技有限公司是全球金融信息服务提供商,每天全平台为近200万用户提供资讯、数据、研究等服务。旗舰产品华尔街见闻APP长期位居各应用市场财经资讯类客户端第1位。由于将重大事件、市场的基本面变化和100多种全球资产价格紧密关联,在金融领域具有极高渗透率。首创的7x24快讯模式已经成为在中文世界理解全球市场的最快来源。也因此,该产品有技术架构复杂,需要高并发承载能力等特性。

  背景

  老系统日益臃肿

  原先的系统是PHP monolithic架构,功能按模块划分,日积月累,最后模块达到60+个,新人接手项目会拿到一整个系统的代码,以及需要整个系统的配置,而他可能只需要专注开发不到1/10的业务。

  伸缩性

  我们的主要业务是即时资讯,资讯具有时效性,网站的访问量会呈现锯齿形分布。当遇到特大新闻如英国退欧、美国大选、法国大选等,我们要能弹性地通过增加服务资源,提高服务的容量。

  容错性

  我们希望一个低优先级服务出现问题之后,不影响主要服务;一个主要服务能保证更高的可用性,就算出现问题,也要保证优雅降级。

  比如在重大事件发生的时候,我们希望文章API保证不会受到影响。

  单体应用

  PHP单体应用在生产环境服务的时候,所有业务都跑在一个程序里,增加了系统的脆弱性,一个隐藏的性能问题,能在服务量激增的时候成为压垮骆驼的一根稻草。

  云服务商成本

  由于架构落后于需要,我们不得不用硬件弥补性能上的问题,导致云服务器成本不断增加。

  线上运维

  由于没有方便的监控和运维工具,导致排查问题的效率低,使得在系统遇到问题的时候排查困难,耗时过长。

  开发新功能

  开发新任务的同时,我们需要修复原有系统的性能问题。

  PHP monolithic架构图

华尔街见闻:基于腾讯云容器服务的微服务架构

  每台服务器部署相同的服务端PHP代码,由PHP-fpm解释执行,通过Nginx进行反向代理。

  华尔街见闻微服务架构设计

  因此,在2016年11月至2017年3月,我们采用微服务架构启动重构,尝试解决一部分上述问题,在伸缩性上能以服务为单位进行拓容,同时,这一设计会在某些方面增大我们的开发成本和运维成本。

  错误排查复杂

  很显然,以前在单体应用中能直接登录服务器,查看出错日志,现在错误散落在不同的服务中,为我们的错误排查带来了困难。

  日志源增加

  如何把服务的日志收集并分析。

  基础设施增加

  每个服务有互相独立的MySQL、Redis,公共服务方面需要高可用的服务发现,调用链路分析,日志收集储存设施等。

  技术选型

  微服务架构图

华尔街见闻:基于腾讯云容器服务的微服务架构

  每台服务器上均衡地部署服务,LB接受用户的请求,将请求转发到API gateway,API gateway向服务发现查询具体服务的IP和端口,服务执行完业务逻辑后向上返回数据。

  服务框架

  我们选择golang作为我们的后端开发语言。

  golang在性能和开发效率上有很好的平衡,语法上很简单,并发编程简单高效,基础库健全。

  调试工具强大

  自带一些pprof包可以profile当前程序的CPU消耗、内存占用、锁状态、channel阻塞等,非常便利我们定位问题。

  有一些优秀的微服务框架

  我们选用go-micro作为开发框架,里面包含几乎所有微服务组件,并且支持非常好的拓展性,通过接口的设计方式,让我们可以拓展一些自己的组件,如服务发现、传输协议等。

  golang在华尔街见闻已经有过比较多的应用,工程师使用golang开发几乎0学习成本。

  服务拆分

  拆分的原则是通过服务功能划分,尽量避免双向依赖。我们拆分出了13个服务,包括用户、内容、实时新闻、评论、搜索、商城、支付、三方代理等服务。

  服务间通信

  服务间使用protobuf协议对数据进行编码,使用UDP作为传输协议。

  服务发现

  Etcd搭建多节点高可用的服务发现。

  服务保护

  我们选择Hystrix作为服务保护以及服务降级的方案。

  每个服务开发者,需要定义自己服务接口的并发量、超时时间以及fallback方法。

  部署方案

  我们选择了Kubernetes。

  * Docker Swarm