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)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
20小时前
|
弹性计算 负载均衡 容灾
应用阿里云弹性计算:打造高可用性云服务器ECS架构
阿里云弹性计算助力构建高可用云服务器ECS架构,通过实例分布、负载均衡、弹性IP、数据备份及多可用区部署,确保业务连续稳定。自动容错和迁移功能进一步增强容灾能力,提供全方位高可用保障。
5 0
|
1天前
|
监控 持续交付 Docker
使用Docker进行微服务架构的最佳实践
【5月更文挑战第10天】本文探讨了使用Docker实施微服务架构的最佳实践。首先,理解微服务架构是拆分小型独立服务的模式,借助Docker实现快速部署、高可移植性和环境一致性。Docker的优势在于服务扩展、容器编排、自动化构建与部署。最佳实践包括:定义清晰服务边界,使用Dockerfile和Docker Compose自动化构建,利用Docker Swarm或Kubernetes编排,实施服务发现和负载均衡,监控与日志记录,以及持续集成和持续部署。Docker虽重要,但需与其他技术结合以确保系统整体稳定性。
|
1天前
|
缓存 负载均衡 API
微服务架构下的API网关性能优化实践
【5月更文挑战第10天】在微服务架构中,API网关作为前端和后端服务之间的关键枢纽,其性能直接影响到整个系统的响应速度和稳定性。本文将探讨在高并发场景下,如何通过缓存策略、负载均衡、异步处理等技术手段对API网关进行性能优化,以确保用户体验和服务的可靠性。
|
1天前
|
监控 持续交付 开发者
构建高效微服务架构:后端开发的新范式
【5月更文挑战第10天】在现代软件开发领域,微服务架构已经成为一种流行的设计模式,它通过将大型应用程序拆分为一组小型、独立和松散耦合的服务来提供更高的可伸缩性和灵活性。本文深入探讨了微服务架构的设计理念、实施步骤以及面临的挑战,并提出了一套实用的策略和最佳实践,帮助后端开发者构建和维护高效的微服务系统。
|
1天前
|
存储 监控 API
构建高效微服务架构:后端开发的现代实践
【5月更文挑战第9天】 在本文中,我们将深入探讨如何在后端开发中构建一个高效的微服务架构。通过分析不同的设计模式和最佳实践,我们将展示如何提升系统的可扩展性、弹性和维护性。我们还将讨论微服务架构在处理复杂业务逻辑和高并发场景下的优势。最后,我们将分享一些实用的工具和技术,以帮助开发者实现这一目标。
|
2天前
|
负载均衡 算法 NoSQL
探索微服务架构下的服务发现与治理
【5月更文挑战第9天】 在当今的软件开发领域,微服务架构已成为构建可伸缩、灵活且容错的系统的首选模式。随着服务的增多,如何有效地进行服务发现与治理成为了关键的挑战。本文将深入探讨微服务环境中服务发现的机制和治理策略,分析不同服务发现工具的优缺点,并提出一种基于一致性哈希和健康检查相结合的服务治理方案,旨在提高系统的可用性和性能。
|
2天前
|
运维 Cloud Native 持续交付
构建未来:云原生架构在现代企业中的应用与挑战
【5月更文挑战第9天】 随着数字化转型的浪潮席卷全球,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了云原生架构的关键组件,包括容器化、微服务、持续集成/持续部署(CI/CD)和DevOps文化,并分析了这些技术如何帮助企业加速产品上市时间,提高运营效率,并最终实现业务目标。同时,文章也识别了企业在采纳云原生实践中可能面临的挑战,如安全性考量、团队技能提升和复杂的网络管理,并提出了相应的解决方案和最佳实践。
|
2天前
|
监控 API 持续交付
构建高效可靠的微服务架构:策略与实践
【5月更文挑战第8天】在当今快速演进的软件开发领域,微服务架构已经成为实现敏捷开发、持续交付和系统弹性的关键模式。本文将探讨构建一个高效且可靠的微服务系统所必须的策略和最佳实践。我们将从服务的划分与设计原则出发,讨论如何通过容器化、服务发现、API网关以及断路器模式来优化系统的可伸缩性和鲁棒性。此外,我们还将涉及监控、日志管理以及CI/CD流程在确保微服务架构稳定运行中的作用。
|
2天前
|
消息中间件 Java 微服务
Java微服务架构实践指南
Java微服务架构实践指南
12 0
|
2天前
|
Kubernetes 持续交付 开发者
构建高效微服务架构:后端开发的新趋势
【5月更文挑战第8天】 随着现代软件开发的不断演进,微服务架构已成为众多企业解决复杂系统问题的首选方案。本文深入探讨了微服务架构的核心概念、设计原则以及实施策略,旨在为后端开发者提供一种清晰、高效的技术路径。通过分析微服务的优势与挑战,结合具体的应用实例,文章将展示如何通过容器化、服务网格和持续集成/持续部署(CI/CD)等先进技术手段,实现后端服务的高可用性、可扩展性和敏捷性。