12年互联网产品开发人眼中的微服务架构云端应用

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 拥有超过12年互联网产品开发和管理经验,好雨云创始人兼CEO刘凡对微服务架构云端应用的干货分享。

微服务架构很热,讨论的文章非常多。但如果提到微服务架构的云端应用,可以深入分析的还比较少。本篇来自中生代技术群(FreshmanTechnology)第二期,好雨云创始人兼CEO刘凡的分享。其曾任澳客网 CTO和CEO职位。拥有超过12年互联网产品开发和管理经验,专注于互联网技术架构设计,对产品设计、敏捷开发、安全、OKRs、大数据等领域有深入研究。现推崇反应式编程(http://www.reactivemanifesto.org/),并在多个产品中成功应用。


下为正文:



微服务架构(Microservices Architecture)是一种架构风格和设计模式,提供将应用分割成一系列细小的服务,每个服务专注于单一业务功能,运行于独立的进程中,服务之间边界清晰,采用轻量级通信机制相互沟通、配合来实现完整的应用,满足业务和用户的需求。


微服务的优点:

  •     可独立部署、升级、替换、伸缩
  •     自由选择开发语言
  •     高效利用资源
  •     故障隔离


总结下来就是:灵活、稳定、省资源。

微服务的缺点:

  •     服务多,带来更多操作
  •     管理复杂度提升
  •     部署难度加大


总结就是:服务多,管理难度大。

仅管微服务存在着缺点,但它的优点也是非常吸引人的,目前很多企业也逐渐开始了微服务架构之旅,包括像Twitter,Netflix,Amazon,eBay等大厂商都在使用。如下图是Twitter微服务应用部分架构图。


ebcce4f5a869bb0e59940038b8e1a8a034f08db8

微服务的架构模式


1. 一体化架构模式

6740e4e6e9accb1cee4e0fd38e3207698674b4ba

传统mvc架构,也是一体化模式。


2. 聚合模式

680d0d2ed4d33c553deda95e1ff69b40ea4051ce

从多个服务的结果聚合到一个聚合服务,最常见的表现是聚合服务是Web服务,主要功能是页面表现,后端的服务都是纯业务功能服务,扩展业务只需要增加一个新的后端微服务就可以啦。

聚合服务也可以是一个更高层次的组合微服务,增加业务逻辑后进一步发布成一个新的微服务,这符合DRY原则。另外,每个服务都有自己的缓存和数据库。这个模式是最常用模式。

3. 代理模式

a075a91b4b0628602f13013ef8d4115ea6b6416d

4. 资源共享模式

aea2cbfd83ecf6e07d2f1e4e722b4992f36f9703

可实现部分业务的逻辑分离,数据共享。

用在一体化架构往微服务架构迁移过程中的过度状态。还可用在两个服务之前有数据一致性要求,通过统一的数据库事物来实现。

5. 异步消息模式

372e961f3073b40c6b18a361ee3a37b1d0e37af3

上面的其它模式都是同步的,会阻塞。异步消息模式适合不需要同步的场景,比如任务型服务。

主要的模式就这些,其它模式可以由这些模式演变。

大量微服务带来的挑战


1. 服务部署的挑战


每个服务都需要独立的代码管理、版本管理、编译构建、部署到测试环境,部署到生产环境,代码回滚等等事情,如果要有几十个服务要部署,人工管理几乎不可能完成。

2. 服务绅缩的挑战


无状态服务需要配置负载均衡和增加节点,有状态服务需要扩充单个服务的资源,如果需要减少资源浪费,需要监控每个服务,还需要减少节点和资源。

3. 服务高可用的挑战


每种服务的高可用策略都不一样,无状态服务相对简单,管理每个有状态服务都是难题。

4. 服务容错的挑战


任何一个服务的可用性都不是 100% 的。在分布式系统中,当我依赖的某个服务不可用的时候,我自身也将不能工作。如果是一个复杂的分布式系统,会依赖更多服务,任何一个服务不可用的时候,系统自身也将不能工作,再加上网络不稳定的因素,系统自身的可用性将大幅度下降。

5. 依赖关系的挑战


依赖配置文件,如果写在代码中,需要重新部署才能生效,而配置文件还会污染代码。

6. 服务监控的挑战


监控cpu?负载?大量微服务如何同时监控?


微服务在云端的解决方案

底层是通过docker实现的,只是用户感受不到docker。

内部封装,不用管理计算资源和网络资源,并把某些复杂特性包装在内部。整体对外,服务做为一个整体管理。

3704538f69485946bf1d398b975a5d34836cbdd2

开发语言支持Java、Python、PHP、Ruby、Golang,Node.JS等,代码支持Github,好雨托管仓库。

700e9e26d785add6e554c33ab518cb1b9d333c62

水平伸缩用于无状态的 Server和Worker 类的服务。

垂直伸缩用于有状态的服务。


部分有状态服务支持水平分区( sharding),用户只需要调整节点个数就可以了。


01d51e15e2bb3769743973142d1054776a41cc74

一般通过LB支持无状态服务高可用,支持有状态服务高可用。

8f7a71560e9f8dc9a8e716df0fe9a2c5eeed431d

类似Spring,参数通过环境变量实现。

实现微服务之间的连接和编排,以上微服务模式都可以通过这种方式动态配置实现。

4ddc3ff86bb05e052dc4367ce3c1e484cdaa5865

类似保险丝,当服务B变慢,达到断路器的阀值,服务B,将自动下线,不至于影响其他服务,当延迟变小,服务逐步恢复。容错还有一种方式是使用异步,可以参考CQRS模式。

915955bbf2ac003c1e77787190018c9f48439e9b

业务指标:平均响应时间,吞吐率 ,在线人数。

在实际场景中,使用业务监控可以替代技术监控,而且更加简单容易理解。


b5b8e2cff71b21ee64c8f4a46004a47d69a9fc760cf2a1a5df098fb0b34d7159f1afd41768bb6302

单个REST服务的实时性能分析,数据库性能分析,最慢的Sql语句不一定是对数据库影响最大的。实时性能分析通过CEP+log实现,以前工作一直使用,没有APM炫,但解决了很多实际问题。还在实现了Mongodb ,Redis等数据存储的实时性能分析。

至此,相信你也对微服务,微服务的构架模式以及微服务在现实场景中的应用有了一个大概的认识了。如果你还想要了解得更多,请继续查看下面的Q&A环节内容。



Q&A


Q1 99.95%的SLA是如何测量的,现在都有那些初始客户? 

刘凡: 我们自己实现了负载均衡组件,监控每个租户的服务可用性,后端服务不可用和错误返回码都会算到不可以用时间。我们现在的用户有工行,天津滨海新区管委会,章鱼网,51talk,学霸君,好贷宝等。

Q2 依赖调整配置就生效吗,背后是如何做到的? 

刘凡: 我们的服务发现是通过etcd实现的,之前实现了完全实时修改实时生效的方案,但是太复杂了,现在的实现方式是通过环境变量实现的,修改配置之后需要重启,无状态服务用户感知不到。 

Q3 SOA的时候重点谈到了美好的编排,不同粒度的层次,逐层编排,其实最考验设计能力和抽象能力,编排本身的美好得不到很好的利用,如何破?


刘凡: 这只能考验一个公司的技术架构师和业务架构师了,我以前身兼这两职,我没遇到过这些问题。我也没有其它思路。


Q4 监控部分对于内存泄漏,堆栈分析有没有好的支持? 

刘凡: 这个没有,但是如果由于内存泄漏导致服务死掉,我们平台会自动重启。

Q5 你们云平台本身有没有异地容灾的能力?  

刘凡: 我们能实现geo-master,现在设计如何对用户开放这类服务。

Q6 微服务这块在移动端有没有好的案例,一般像Android和 iOS这类移动应用上如何使用和借鉴微服务模式呢?

刘凡: 刚才分享的代理模式特别适合用户移动开发场景,微服务都是API。代理模式是一种特殊的聚合模式,对外是一个统一的包装,一般做内部接口的代理,对外统一一个接口,内部可以用多个微服务实现。

Q7 服务之间有没有调用链的设计,方便跟踪跨服务的问题,可以分享一下吗?

刘凡: 细化的跟踪没有,通过服务拓扑可以实现粗力度的。

Q8 工行上的是那些业务,好雨云擅长是高性能高PV的业务,还是对事务一致性要求都有很高要求的业务?

刘凡: 高PV场景我们特别适合,因为我们非常容易伸缩。事务一致性我们有两种方式,一种大家可以选择自己喜欢的存储服务,各类数据有存储自己的方式。第二种,我们通过akka实现一套高一致性,高性能的解决方案,单机能做到每秒100万的事务。

Q9 你提到了类似在线人数之类的业务监控,对于产品可以增强链路监控功能否,比A9如用户是在操作链路上那个环节流失得比较严重,做统计以便产品改进,这些监控本身需要调用平台API吗?

刘凡: 不太理解链路是什么意思,是指用户行为数据吗?现在我们没有,我们不擅长这块。

Q10 服务拓扑就是服务级依赖关系吧?

刘凡: 是的,每个微服务有自己的响应时间和吞吐率,表现在拓扑图里,可以粗力度分析出问题。

Q11 我们通过akka实现一套高一致性,高性能的解决方案,单机能做到每秒100万的事务,这块能不能具体说一下,比如一个第三方支付简单的A用户到B用户的转账场景,A和B在不同的sharding单元。

刘凡: akka的模式是使用CQRS模式,也就是事件溯源的方式,以前数据库的那些事务问题在这都不存在。

Q12 Akka的话是不走数据库直接在内存里做事务吗?

刘凡: 是的,通过事件溯源保证数据一致性。理论上它不是事务,但能实现事务的效果。

Q13 队列技术如何支持的呢?

刘凡: 我们平台支持任何开源的队列服务。

Q14 微服务之间如何通信,协议和数据格式是怎样的?

刘凡: 微服务会有多个节点,但我们会内置LB,对外统一一个服务接口,支持任意协议和格式。

Q15 工行,天津滨海新区管委会,章鱼网,51talk,学霸君,好贷宝主要应用场景,高PV支持,高事务支持,大数据分析,爬虫,devops,通过微服务架构把业务能拆分更小,便于重用和维护。 akka的方案就是联机交易。这些客户具体的应用场景是哪些呢?可以选择1-2个典型case介绍下微服务所产生的价值,如果有联机交易的Case更佳。

刘凡: 介绍下微服务所产生的价值,如果有联机交易的Case更佳主要应用场景,高PV支持,高事务支持,大数据分析,爬虫,devops,通过微服务架构把业务能拆分更小,便于重用和维护。 akka的方案就是联机交易。

Q16 实时性能分析用的是cep +log, 不是很理解cep?

刘凡: 复杂事件处理,实时流处理,通过strom也可以实现。

Q17 如何应对微服务的毛剌现象(某个服务瞬间出现较大延迟的现象,可能会导致某批请求超时等情况)?

刘凡: 不好意思,我没遇到过这种情况,我觉得应该跟实现方式有关。

Q18 akka的方案就是联机交易,akka原先架构体系是什么?遇到了什么样的瓶颈?微服务之后改进的是什么?联机交易规模怎样?

刘凡: 原先就是用传统数据库,交易的事务性能低下,做了sharding会引入新的问题,而且联机分析也有问题,用akka改造后能处理高峰业务每秒10万左右的事务。


                                                           

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
1天前
|
运维 监控 Docker
使用Docker进行微服务架构的部署
【5月更文挑战第18天】本文探讨了如何使用Docker进行微服务架构部署,介绍了Docker的基本概念,如容器化平台和核心组件,以及它与微服务的关系。通过Docker,每个微服务可独立运行在容器中,便于构建、测试和部署。文章详细阐述了使用Docker部署微服务的步骤,包括定义服务、编写Dockerfile、构建镜像、运行容器、配置服务通信、监控和日志管理以及扩展和更新。Docker为微服务提供了可移植、可扩展的解决方案,是现代微服务架构的理想选择。
|
1天前
|
敏捷开发 监控 API
构建高效微服务架构:从理论到实践
【5月更文挑战第18天】 在当今快速发展的软件开发领域,微服务架构已经成为一种流行的设计模式,它通过将大型应用程序分解为一系列小型、独立的服务来提高系统的可伸缩性、弹性和维护性。本文旨在探讨如何从理论走向实践,构建一个高效的微服务架构。文章首先介绍微服务的基本概念和优势,然后详细讨论了在设计和部署微服务时需要考虑的关键因素,包括服务划分、通信机制、数据一致性、容错处理和监控策略。最后,结合具体案例分析,展示如何在现实世界中应用这些原则,确保微服务架构的高效运行。
|
1天前
|
存储 弹性计算 运维
探索微服务架构下的服务治理
【5月更文挑战第18天】 在当今软件工程领域,微服务架构因其灵活性、可扩展性以及促进团队协作等优势而受到广泛青睐。然而,随着系统规模的增长和服务数量的膨胀,服务治理成为确保系统稳定性和高效性的关键因素。本文将深入探讨微服务环境下的服务治理实践,包括服务发现、配置管理、负载均衡、故障处理等关键方面,旨在为开发者提供一套行之有效的服务治理策略。
|
1天前
|
监控 持续交付 开发者
构建高效微服务架构:后端开发的新范式
【5月更文挑战第18天】 随着现代软件开发的复杂性日益增长,传统的单体应用架构已难以满足快速迭代和灵活部署的需求。本文聚焦于一种新兴的解决方案——微服务架构,探讨其如何为后端开发带来革命性的改变。我们将深入分析微服务的核心概念、优势与挑战,并通过具体案例来阐述如何在实际项目中实施微服务架构。文章旨在为开发者提供一种系统化的方法,帮助他们理解并应用微服务架构,以提升系统的可维护性、扩展性和技术敏捷性。
9 2
|
1天前
|
测试技术 持续交付 API
构建高效的微服务架构:后端开发的现代实践
【5月更文挑战第18天】在数字化转型的浪潮中,微服务架构已成为企业追求敏捷、可扩展和容错能力的关键解决方案。本文将深入探讨微服务的核心概念,包括其设计原则、技术栈选择以及实施过程中的挑战与对策。通过对微服务架构实践的详细剖析,旨在为后端开发人员提供一套构建和维护高效微服务系统的实用指南。
|
1天前
|
缓存 算法 Apache
微服务架构下的服务发现与注册机制
【5月更文挑战第18天】 随着现代软件系统向着分布式和微服务架构演进,服务发现与注册成为确保系统弹性和可伸缩性的关键因素。本文将探讨在微服务环境下实现服务发现与注册的模式,分析其必要性,并深入讨论常见的解决方案以及面临的挑战。文中不仅介绍了服务发现的基本原理和流程,还对流行的服务发现工具如Consul、Etcd和Zookeeper进行了比较,最后提出了一套优化策略以增强系统的鲁棒性和性能。
|
1天前
|
运维 负载均衡 监控
探索微服务架构下的服务网格
【5月更文挑战第17天】 在当代软件开发领域,微服务架构已成为构建可扩展、灵活且容错的系统的首选模式。然而,随之而来的复杂性问题也日益凸显,特别是在服务间的通信管理上。服务网格(Service Mesh)作为一种新兴的解决方案,专门处理服务到服务的通信问题,旨在提供一种更加智能和动态的方式来管理微服务环境中的流量和服务依赖。本文将深入探讨服务网格的概念、优势以及如何在微服务架构中实现高效通信。
|
1天前
|
Kubernetes API 数据库
构建高效微服务架构:后端开发的新趋势
【5月更文挑战第17天】 随着云计算的普及和容器化技术的成熟,微服务架构已成为企业软件开发的首选模式。该架构通过将大型应用程序拆分为一系列小型、自治的服务来提供灵活性和可扩展性。本文将探讨微服务架构的关键概念,包括服务的细粒度划分、独立部署、以及如何通过容器编排实现高可用性。同时,我们将讨论微服务实施的最佳实践和面临的挑战,为后端开发者提供构建和维护微服务系统的实用指南。
|
1天前
|
消息中间件 安全 数据库
构建高性能微服务架构的实践指南
【5月更文挑战第17天】 随着现代软件开发的复杂性增加,微服务架构已成为众多企业和开发团队的首选模式。本文旨在探讨如何构建一个高性能的微服务系统,涵盖从设计原则、技术选型到性能优化的关键步骤。我们将通过实际案例和最佳实践,展示如何在保证系统可扩展性、灵活性的同时,确保系统的响应速度和稳定性。
|
1天前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第17天】在当今云计算和微服务架构的大潮中,Docker容器化技术和Kubernetes容器编排系统成为了后端开发领域的热门技术栈。本文将探讨如何通过Docker和Kubernetes的结合使用来构建一个高效、可扩展且易于管理的微服务环境。我们将从基础概念出发,深入到实际操作层面,最后讨论这种组合对持续集成和持续部署(CI/CD)流程的影响,旨在为开发者和企业提供一种可靠的后端服务解决方案。
http://www.vxiaotou.com