【系统设计系列】 应用层与微服务

news2024/9/20 8:38:41

系统设计系列初衷

System Design Primer: 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.

中文版: https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md

初衷主要还是为了学习系统设计,但是这个中文版看起来就像机器翻译的一样,所以还是手动做一些简单的笔记,并且在难以理解的地方对照英文版,根据自己的理解在AI的帮助下进行翻译和知识扩展。

应用层

资料来源:可缩放系统构架介绍

首先需要了解下服务层和应用层的概念:

服务层

        主要负责处理系统的业务逻辑。服务层为应用层提供功能性的支持,包括数据验证、数据处理、业务流程控制等。服务层通过将底层数据处理和逻辑封装起来,为应用层提供了更高层次的抽象,使应用层可以更方便地使用这些服务。

应用层

        是软件系统的最高层次,直接为用户提供功能和服务。应用层包括各种应用程序、客户端和服务器等。应用层通过调用服务层提供的功能,实现了对用户需求的响应和满足。应用层需要关注用户交互、用户体验以及各种应用程序的实现。

关系

        服务层和应用层的关系主要体现在以下几个方面:

        服务层为应用层提供服务:服务层通过封装底层数据处理和逻辑,为应用层提供了更高层次的抽象。应用层通过调用服务层提供的功能,实现了对用户需求的响应和满足。

        应用层依赖服务层:应用层需要实现各种功能和服务,而这些功能和服务很大程度上依赖于服务层提供的支持。服务层设计的好坏直接影响应用层的性能、稳定性和可维护性。

        服务层和应用层相互隔离:服务层和应用层在功能上相互独立,它们之间的接口清晰明确。这样,当需求发生变化时,可以灵活地进行调整和修改。服务层和应用层相互隔离的设计有助于提高系统的可维护性和可扩展性。

        早期的服务层基于应用层存在,共同部署在同一个平台,共同运维。

        而微服务的提出将 Web 服务层与应用层(也被称作平台层)分离,可以独立缩放和配置这两层。添加新的 API 只需要添加应用服务器,而不必添加额外的 web 服务器。

        单一职责原则提倡小型的,自治的服务共同合作。小团队通过提供小型的服务,可以更激进地计划增长。

        应用层中的工作进程也有可以实现异步化。

微服务

         微服务,可以被描述为一系列可以独立部署的小型的,模块化服务。每个服务运行在一个独立的线程中,通过明确定义的轻量级机制通讯,共同实现业务目标。

例如,Pinterest 可能有这些微服务: 用户资料、关注者、Feed 流、搜索、照片上传等。

优点

微服务的主要优势包括:

灵活性:微服务可以独立进行开发、测试和部署,从而加快软件开发的迭代速度。同时,每个服务都可以根据实际需求选择合适的技术栈,使得开发者能够更加灵活地应对不同的业务场景。

可扩展性:通过将复杂的应用程序拆分成多个简单的微服务,系统可以在需要时更容易地进行水平扩展。这使得系统能够根据业务需求的变化快速调整资源,提高系统的整体性能。

高可用性:由于每个微服务都是独立的,因此一个服务的故障不会直接导致整个系统崩溃。此外,微服务架构通常采用去中心化的设计,进一步提高了系统的容错能力。

松耦合:微服务之间的通信采用轻量级的 HTTP API,使得服务之间的依赖关系更加松散。这有助于降低系统间的耦合度,使得系统在面对需求变更时更加灵活。

缺点

微服务的缺点:

复杂性:微服务架构通常比单体架构更加复杂。开发者需要掌握多种技术栈,理解不同服务之间的协作方式,并处理服务之间的通信和数据一致性等问题。

部署和运维成本:由于微服务需要运行在多个进程中,因此它们的部署和运维成本可能会更高。此外,分布式系统的监控、日志管理和故障排查也具有一定的挑战性。

通信开销:微服务之间的通信通常基于 HTTP API,这可能会导致一定的网络开销和延迟。在高并发场景下,通信开销可能成为性能瓶颈。

数据一致性:在微服务架构中,不同服务之间的数据一致性需要特别关注。由于服务之间的数据交互是通过 API 进行的,可能会存在数据同步和事务处理的问题。

安全性:微服务架构中的多个服务可能使得系统更容易受到攻击。开发者需要充分考虑服务的安全防护,以及在分布式环境中应对安全问题的方法。

适用于小型项目:微服务架构在某些小型项目中可能过于复杂,浪费资源和时间。因此,开发者需要根据项目的实际需求和规模来选择合适的架构。

服务发现

像 Consul,Etcd 和 Zookeeper 这样的系统可以通过追踪注册名、地址、端口等信息来帮助服务互相发现对方。Health checks 可以帮助确认服务的完整性和是否经常使用一个 HTTP 路径。Consul 和 Etcd 都有一个内建的 key-value 存储 用来存储配置信息和其他的共享信息。

主要流程

服务发现的主要流程如下:

  1. 服务注册:当一个微服务启动时,它会将自己的地址、协议和相关的元数据注册到服务注册中心。服务注册中心负责维护一份可用的服务清单,以便其他服务可以查找到它。
  2. 服务发现:当一个微服务需要调用另一个微服务时,它会从服务注册中心获取可用的服务清单。根据清单中的信息,调用方服务可以找到被调用方的服务地址和端口,从而进行远程调用。
  3. 服务健康检查:服务发现过程中,还需要对服务进行健康检查,以确保调用的服务是正常运行的。服务注册中心可以定期接收服务提供的健康信息,从而实现对服务状态的监控。
  4. 服务注销:当一个微服务停止运行时,它会将自己的信息从服务注册中心注销。这样,其他服务在调用该服务时,会发现该服务已不存在,从而避免调用失败的情况。

服务发现在微服务架构中起到了关键作用,它解决了服务之间的定位和通信问题。通过服务发现,微服务可以更加灵活、高效地进行通信和协作,从而提高整个系统的性能和可扩展性。

应用使用微服务

应用层调用具体微服务时,需要经历以下几个步骤:

  1. 服务注册:当一个微服务启动时,它会将自己的地址、协议和相关的元数据注册到服务注册中心。服务注册中心负责维护一份可用的服务清单,以便其他服务可以查找到它。
  2. 服务发现:当应用需要调用一个微服务时,它会从服务注册中心获取可用的服务清单。根据清单中的信息,应用可以找到需要调用的服务的地址和端口,从而进行远程调用。
  3. 服务调用:应用通过 HTTP 或其他协议向微服务发送请求,并将请求的数据传递给微服务。微服务接收到请求后,处理数据并生成响应,然后将响应返回给应用。
  4. 响应处理:应用接收到微服务返回的响应,并对响应数据进行处理。如果响应中包含错误信息,应用可以根据错误信息进行相应的处理,例如进行重试或者报错。
  5. 异常处理:在服务调用过程中,如果出现网络异常、超时或者其他异常情况,应用需要进行相应的异常处理,以确保系统的稳定性和可靠性。
  6. 负载均衡与熔断:为了提高系统的可用性和性能,可以采用负载均衡技术对微服务进行分发。此外,当微服务出现故障时,可以采用熔断机制将其从服务注册中心移除,以避免其他应用调用失败的情况。

通过以上流程,应用可以实现对微服务的调用,从而充分利用微服务架构的优势,提高系统的灵活性、可扩展性和高可用性。同时,在调用过程中,还需要关注服务安全、数据一致性等问题,以确保微服务架构的稳定和可靠。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/987828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超全60000多字详解 14 种设计模式 (多图+代码+总结+Demo)

超全60000多字详解 14 种设计模式 (多图代码总结Demo) 之前读耗子叔文章时,看到过有句话没有实践,再多的理论都是扯淡,个人很赞同。你觉得自己学会了,但实践与学会之间有着很大差别。 单例模式 (Singleton Pattern) 定义或概念 …

水滴图 echarts lable失真显示很多9 水滴图 显示99999999

解决办法: 添加一个 seriesName lable用seriesName <template><div ref"EchartLiquidfill" class"EchartLiquidfill" :style"{ width: width }" /> </template><script> export default {name: "EchartLiquidfil…

第8章 驱动模块编译进内核实验(iTOP-RK3568开发板驱动开发指南 )

通过上一章的学习&#xff0c;我们学会了使用menuconfig图形化配置工具&#xff0c;以及了解了menuconfig相关的文件&#xff1a;Kconfig .config XXXdefconfig。本章节学习将helloworld驱动编译进内核。 输入“cd drivers/char”进入到 drivers/char 目录下&#xff0c;然后输…

2023工博会,正运动超高速PCIe实时运动控制卡应用预览(一)

展会倒计时&#xff1a;11天 本次的中国国际工业博览会正运动技术将携超高速PCIe实时运动控制卡亮相。 •为智能装备提供高速高精运动控制解决方案&#xff1b; •内部搭载运动控制实时内核MotionRT7; •提供多路高速IO输入输出&#xff0c;具备多种实时运动控制功能&#x…

Maven安装(超详解)

下载地址:Maven – Download Apache Maven 在提供的资料中,已经提供了下载好的安装包。如下 1、解压 apache-maven-3.9.4-bin.zip(解压即安装) bin目录 : 存放的是可执行命令。(mvn 命令重点关注) conf目录 :存放Maven的配置文件。(settings.xml配置文件后期需要修改)…

Unity中的场景加载

1、同步场景 2、异步加载 3、保留物体到下个场景中

vue 前端 问题整理

列表显示字典数据 template里面的vue代码 <el-table-column label"性别" align"center" prop"sex"><template #default"scope"> <!-- <dict-tag :optionssysUserSex :value"scope.row.sex&quo…

HTTP代理与代理IP的区别

HTTP代理和代理IP是网络安全和隐私保护中常用的两种工具。HTTP代理是一种代理服务器&#xff0c;它使用HTTP协议来转发客户端请求和响应目标服务器的响应。代理IP是一种匿名代理服务器&#xff0c;它隐藏了用户的真实IP地址&#xff0c;以保护用户的隐私和安全。本文将介绍HTTP…

从“13天”到“0天”延时,揭秘幸福里离线SLA保障最佳实践

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 “幸福里”是抖音集团旗下集内容、社区、工具于一体的房产媒体综合信息平台&#xff0c;致力于提供多样化房产资讯、定制找房需求。随着幸福里业务发展&#xff0c;…

注塑机数据采集的数据类型 物理量种类

1.状态数据&#xff1a;运行、停机、故障、待机等机台状态数据&#xff1b; 2.产量数据&#xff1a;模次、产量数据&#xff1b; 3.效率数据&#xff1a;稼动率、节拍、运行时间、停机时间、故障时间、待机时间等数据&#xff1b; 4.工艺数据&#xff1a;工艺数据保存、调机…

驱动开发--day2(内核不同模块的相互访问、字符设备驱动、led控制实验代码及现象)

实现三盏灯的控制&#xff0c;编写应用程序测试 head.h #ifndef __HEAD_H__ #define __HEAD_H__#define LED1_MODER 0X50006000 #define LED1_ODR 0X50006014 #define LED1_RCC 0X50000A28#define LED2_MODER 0X50007000 #define LED2_ODR 0X50007014#endif mychrdev.c #inc…

关于andriod App开发---查看与导出logcat日志内容

adb rootadb remountadb logcat&#xff08;开始打印指令&#xff09;按住 CtrlC&#xff08;终止打印指令&#xff09;保存日志指令&#xff1a;adb logcat -v time >D:\log\logcat.txt日志导出完成&#xff08;如下图&#xff09; 抓包工具&#xff1a; Charles(IOS 基础…

长春泛域名证书和通配符证书有什么区别

通配符SSL证书是一种数字证书&#xff0c;只是因为数字证书保护的域名数量或者类型不一样&#xff0c;将数字证书分为了单域名SSL证书、多域名SSL证书和通配符SSL证书三种。今天就随SSL盾小编了解通配符SSL证书和泛域名SSL证书的关系。 1.根据保护的域名类型&#xff0c;通配符…

传感器融合带来多重好处

传感器融合是一个热门话题&#xff0c;正好与物联网的增长趋势相吻合&#xff0c;尤其是与自动驾驶汽车和先进的驾驶员辅助系统&#xff08;ADAS&#xff09;相连。这个概念本身并不是什么新鲜事物。在Google Scholar上进行的搜索确定了可追溯到1960年代或更早的概念。但是如今…

云服务器下如何部署Flask项目详细操作步骤

参考网上各种方案&#xff0c;再结合之前学过的Django部署方案&#xff0c;最后确定Flask总体部署是基于&#xff1a;centos7nginxuwsgipython3Flask之上做的。 本地windows开发测试好了我的OCR项目&#xff0c;现在要部署我的OCR项目到云服务器上验证下。 第一步&#xff1a…

调用API接口的一些注意技巧

在实践中我们经常发现&#xff0c;很多同学都是直接请求调用和读取接口数据&#xff0c;而没有做状态码的判断&#xff0c;这在设计角度是非常不合理的。 另外&#xff0c;对于一些实时性要求不高的接口&#xff0c;更合理的做法应该是先把数据拉到本地缓存&#xff0c;再从缓存…

sql server 设置字段自增

1.将字段设置为主键&#xff1b; 2.将“标识规范”设置为是&#xff0c;这里注意切勿将默认值设置为0&#xff0c;否则无法选择“标识规范”

mybatis初体验(细节满满)

1.创建数据表&#xff08;库名为&#xff1a;mayikt&#xff09; CREATE TABLE mayikt_user (id int NOT NULL AUTO_INCREMENT,username varchar(20) DEFAULT NULL,userpwd varchar(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT9 DEFAULT CHARSETutf8mb3…

QT for andriod

QT for andriod 开发 apk软件&#xff0c;因为一些特殊的原因&#xff0c;在这里简单的记录一哈自己开发apk的流程和心得。 首先说明我采用的环境有哪些&#xff1f; 1、QT的版本&#xff0c;个人建议5.15.2的版本及以上&#xff0c;我是用的5.15.2。 2、andriod studio 可以…

日期--data与String的相互转换

首先我们要明确 yyyy-MM-dd HH:mm:ss 其中y:年份 MM:月份 dd:天 HH:小时 mm&#xff1a;分 ss&#xff1a;秒 date转String // 获取当前时间LocalDateTime dateLocalDateTime.now(); // 设置日期格式DateTimeFormatter formatterDateTimeFormatter.ofPattern("yyyy-MM-dd…