微服务

简介: 【10月更文挑战第1天】微服务是一种将大型应用分解为小型、独立服务的设计理念,每个服务负责单一业务功能,独立部署、运行,通过轻量级通信机制(如HTTP API或RPC)互联。相比单体应用,微服务提高了部署效率、团队协作效能和系统可用性,但也增加了系统复杂性、通信开销和数据一致性管理的难度。实现微服务架构涉及服务拆分、服务发现、配置管理、服务治理、数据一致性、安全性、监控与日志、持续集成与部署等多个方面。

定义

微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用HTTP API通讯。同时,服务会使用最小规模的集中管理 (例如Docker)技术,服务可以用不同的编程语言与数据库等

单体应用的痛点

  1. 部署效率低下:当单体应用依赖的代码越来越多,依赖的资源越来越多的时候,应用编译打包、部署测试一次,需要的时间比较长,高达10分钟甚至更久
  2. 团队协作开发成本高:多个分支并行开发,合并需要处理的冲突也较多
  3. 系统高可用性差:某一功能的问题会影响到整个服务
  4. 线上发布慢

    服务化的思想

    把传统的单机应用中通过JAR依赖产生的本地调用,或是同一项目的函数调用,改造为通过RPC接口产生的远程方法调用。

    RPC:远程过程调用协议,允许程序调用另一个地址空间的函数或过程。

比如微博系统,包括内容模块、消息模块和用户模块,三个模块之间业务相同,代码互相耦合。
考虑把用户模块从单体应用中拆分出来,独立成一个服务部署,以RPC接口的形式对外提供服务。消息和内容模块调用用户接口,从进程内的调用变成远程RPC调用。这样用户模块可以独立开发、测试、上线和运维。

微服务 vs 服务化

  1. 服务拆分粒度更细:微服务可以看作更细粒度的服务化,小到一个子模块,只要该模块依赖的资源和其他模块无关,就可以拆分为一个微服务
  2. 服务独立部署:每个微服务都严格遵循独立打包部署的准则,互不影响。比如一台物理机上可以部署多个Docker实例,每个Docker实例可以部署一个微服务的代码
  3. 服务独立维护
  4. 服务治理能力要求高:拆分为微服务以后,服务数量变多,需要有统一的服务治理平台,对各个服务进行管理

    微服务缺点

  5. 复杂性增加:系统管理的复杂性增加,每个服务都需要独立的部署、配置和监控;服务间的依赖关系管理变得复杂,需要保证服务之间的兼容性和版本控制
  6. 通信开销:通过API通信,调用会产生网络延迟;需要额外的基础设施支持服务发现、负载均衡和容错
  7. 数据一致性问题:数据分散在不同的服务里
  8. 部署和测试难度

微服务之间通信

同步通信

客户端发送请求以后,等待服务端处理完毕并返回结果,实时性高,但是可能因为服务端处理时间过长而导致客户端阻塞,常见的同步通信协议有HTTP和RPC,RPC性能更高

  1. 网关:一般基于HTTP协议,使用RESTFUL风格,数据格式为JSON,HTTP方法有GET,POST,PUT,DELETE等,简单且易用
  2. RPC:远程过程调用协议,允许客户端像调用本地方法一样调用远程服务,通常使用二进制协议。和HTTP相比,有更高的性能和更低的网络开销。常见的RPC框架有gprc、dubbo、brpc、thrift等

    异步通信

    客户端发送请求后,无需等待服务端处理完毕即可继续执行其他任务,当服务端处理完毕之后,会通过某种方式通知客户端。这种通信方式可以降低系统的耦合度,提高并发度,但是系统的复杂性会增加。常见的异步通信方式有消息队列和事件驱动两种
  3. 消息队列:生产者将消息发送到队列,消费者从队列里接收消息并处理。常见的中间件有Kafka、RabbitMQ等。
  4. 事件驱动:一种基于事件的通信方式,允许服务之间通过发布和订阅交互。当某个事件发生时,相关服务会接收到通知并作出相应处理。

    消息队列(如RabbitMQ、Kafka) 例子: 在电商系统中,当一个订单被创建后,系统不会直接等待支付、库存扣减等操作完成,而是将这些操作作为消息发送到消息队列中。支付服务、库存服务作为消息的消费者,独立地处理这些消息,完成后更新状态。这种方式下,订单服务与支付、库存服务之间是异步通信的。
    事件驱动:例子: 在微服务架构中,当用户完成注册,系统触发一个“用户注册”事件。这个事件被多个服务监听,比如邮件服务接收到事件后发送欢迎邮件,数据分析服务则开始处理新用户的数据分析任务。每个服务根据事件独立工作,无需等待其他服务的响应,实现了服务间的解耦和异步处理。

RPC协议

grpc:

基于HTTP/2协议 使用Protocol Buffers作为接口定义语言合数据序列化格式,支持多种语言,内置身份验证,流式调用支持。.proto文件

dubbo:

阿里巴巴开源,主要面向Java,但是逐渐扩展到多语言支持。支持多种协议,包括Dubbo、HTTP、Triple(兼容grpc)

BRPC:

百度开发,支持HTTP/1.1、HTTP/2、BRPC协议。优化了网络通信和CPU使用,特别适合内部服务间的高效通信。高性能,对C++原生支持极佳,提供了丰富的特性如异步调用、超时控制、重试策略等。

Thrift:

Apache项目,支持多种语言和数据序列化方式,默认使用 TBinaryProtocol,允许定义服务接口和数据结构,生成客户端和服务端代码。.thrift文件

微服务架构的实现方式

微服务架构的实现方式涉及多个方面,以下是基于参考内容和一般实践的详细介绍:

服务拆分

● 业务领域驱动:根据业务功能将应用拆分成独立的服务,每个服务对应一个业务能力,如订单服务、用户服务等。
● 小而自治:每个服务应尽可能小且具有独立的生命周期,能够独立部署和扩展。

服务发现与注册

● 服务注册:服务启动时,向服务注册中心(如Zookeeper、Eureka、Consul)注册自己的地址和元数据。
● 服务发现:其他服务通过服务注册中心查找并调用目标服务,动态地发现和调用服务,支持服务的动态增减。

通信机制

● 同步通信
● 异步通信

配置管理

● 集中式配置:使用如Spring Cloud Config或Consul的配置中心,实现配置的集中管理和动态刷新。

服务治理

● 负载均衡:在服务调用中使用负载均衡策略,如Ribbon、Feign,分散请求到多个实例。
● 熔断与重试:引入如Hystrix进行熔断保护,防止服务雪崩,同时提供重试机制以应对暂时性失败。

数据一致性

● 分布式事务:面对微服务间的事务一致性问题,可采用两阶段提交、补偿事务(Saga)、事务消息等模式。
● 数据隔离:每个服务可能拥有自己的数据库,减少耦合,但需注意数据一致性问题。

安全性

● API Gateway:作为入口,统一处理认证、授权、加密等安全措施。
● 服务间安全通信:使用TLS/SSL加密通信,JWT(JSON Web Tokens)进行安全的身份验证。

监控与日志

● 分布式追踪:如Zipkin、Jaeger,帮助追踪请求在多个服务间的流转。
● 日志管理:集中式日志系统(如ELK Stack)收集、分析服务日志。

持续集成与部署

● CI/CD:自动化构建、测试和部署流程,确保服务快速迭代和稳定发布。

微服务框架

● Spring Cloud、Dubbo、Service Mesh(如Istio、Linkerd)等框架提供了实现微服务架构的工具集,简化了服务发现、配置管理、服务治理等复杂性。

实践建议
● 逐步迁移:从现有系统逐步迁移到微服务架构,避免一次性重构带来的风险。
● 团队结构匹配:微服务的实施往往需要组织结构的相应调整,每个服务应由小团队独立负责。
● 文化转变:强调团队间的沟通与协作,以及对自动化工具的依赖。
通过这些实现方式,微服务架构能够提供高度的灵活性、可扩展性和容错能力,但同时也带来了复杂性管理的挑战,需要团队有较强的DevOps能力和对分布式系统管理的经验。

目录
相关文章
|
2天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1519 4
|
29天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
5天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
503 19
|
2天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
179 1
|
8天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
21天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
9天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
457 5
|
7天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
314 2
|
23天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
25天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2608 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析