服务概念知识
请求术语
JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript对象的表示法,并使用文本表示。JSON是一种流行的数据格式,因为它易于阅读和编写,并且可以表示各种类型的数据。
JSON数据由键值对组成,键是字符串,值可以是字符串、数字、布尔值、数组或对象。JSON数据可以使用任何文本编辑器创建和编辑,也可以使用各种编程语言解析和生成。
Content-Type
http常见的请求体类型有以下几种:
application/x-www-form-urlencoded
使用 URL 编码的表单数据,适用于 HTML 表单提交的数据格式。
multipart/form-data
用于上传文件或二进制数据,可包含多个部分,每个部分都有自己的类型和内容。
application/json
用于发送和接收 JSON 格式的数据,常用于 RESTful API 的请求和响应。
text/plain
纯文本数据,没有特定的格式要求。
application/xml
用于发送和接收 XML 格式的数据,常用于 SOAP 协议的请求和响应。
application/octet-stream
用于发送二进制数据,如图片、音频、视频等。
application/graphql
用于发送 GraphQL 查询或变异请求。
application/x-protobuf
用于发送和接收 Protocol Buffers 格式的数据。
application/x-msgpack
用于发送和接收 MessagePack 格式的数据,一种高效的二进制序列化格式。
application/x-www-form-urlencoded-stream
类似于 application/x-www-form-urlencoded,但支持流式处理大型数据。
token
服务接口的token是一种用于身份验证和授权的机制。它通常是一个字符串或编码信息,用于在客户端和服务器之间进行安全通信。
在Web服务和API中,token常用于以下情况:
- 身份验证(Authentication): 当用户登录时,系统可能会为该用户生成一个token,并将它返回给客户端。客户端在后续的请求中都会附带这个token,以证明其身份。
- 授权(Authorization): 一旦用户通过身份验证并获得token,这个token通常会包含一些权限信息,用于决定该用户可以访问哪些资源或执行哪些操作。
- 会话管理: 代替传统的会话ID,token也可以用于识别和管理用户会话。它的好处是可以更容易地在不同的服务器或服务间共享用户状态。
- 防止跨站请求伪造(CSRF): token可以作为一个额外的验证层,确保请求是从合法的来源发出的。
为了增强安全性,token通常都会有时效性,并且在一段时间后会自动过期。此外,使用HTTPS来传输token也是很重要的,以确保token在传输过程中不会被截获或篡改。
常见的token类型包括:
- JWT (JSON Web Token): 一种开放标准(RFC 7519)定义的token格式,它紧凑且包含了必要的信息,可以用于在各方之间安全地传输这些信息。
- OAuth Tokens: OAuth 2.0流程中使用的token,通常用于第三方应用访问用户的资源,而不需要用户直接共享其密码。
- Bearer Tokens: 一种简单的token类型,其安全性基于传输层的保密性(如HTTPS)。任何持有此token的实体都可以使用它,因此必须确保它不会被泄露。
使用token时,保护其安全性至关重要。不应该在客户端永久存储敏感信息,并且要确保使用安全的传输方式。
Session 和 Cookie
Session 和 Cookie 是 Web 开发中两种常见的用户状态管理方式。
- Cookie:Cookie是一种在浏览器中存储数据的机制,用于在不同请求之间传递和存储数据。Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它包含了用户的某些信息。当用户再次请求同一个网站时,浏览器会自动将这些信息发送回服务器。Cookie 主要用于跟踪用户的状态,如登录状态、购物车等。
- Session:Session 是一种在服务器端存储用户状态的技术。当用户登录后,服务器生成一个 Session ID,并将其发送给客户端(通常通过设置一个特殊的 Cookie)。之后,只要客户端在每次请求中都包含这个 Session ID,服务器就能识别出这是同一个用户。
Session 和 Cookie 是 Web 开发中两种常见的用户状态管理方式,Session数据存储在服务器上,而Cookie数据存储在客户端上。相比 Cookie,Session 在服务器端存储数据更安全,因为数据不会随着用户的每个请求在网络上传输。
基础术语
panic
服务panic通常指的是在软件开发中的问题,即服务程序在运行过程中出现了无法处理的异常情况,导致服务崩溃或无法正常工作。当服务panic时,它会中断当前的操作,并且通常会触发一些错误处理机制,比如记录错误日志、重启服务等。服务panic常常是由于代码bug、不可预料的输入数据等原因导致的,需要开发人员及时修复。
OOM
"服务OOM"指的是服务程序发生了Out of Memory(OOM)错误。OOM错误是指程序在尝试分配内存时,无法获取足够的内存空间,导致程序崩溃或异常终止。
解决服务OOM问题的方法包括:
- 增加服务器的内存:可以通过增加服务器的物理内存或虚拟内存来解决服务OOM问题。
- 优化代码:可以通过优化代码来减少内存的使用,例如使用更高效的算法、减少变量的使用等。
- 使用垃圾回收:可以使用垃圾回收机制来自动释放不再使用的内存,从而减少内存泄漏的风险。
- 调整应用程序配置:可以通过调整应用程序的配置参数来优化内存使用,例如调整缓存大小、调整连接池大小等。
- 监控系统资源:可以使用系统监控工具来监控服务器的内存使用情况,及时发现并解决内存问题。
DNS
DNS(Domain Name System):域名系统,是一种将域名映射到IP地址的系统。
LB
LB是指负载均衡(Load Balancer),它是一种用于将网络流量均匀分布到多个服务器上的技术。在服务部署中,LB可以用于将用户请求流量分发到多个应用服务器上,以实现负载均衡,提高系统的性能和可靠性。LB可以通过不同的算法来确定将请求分发给哪个服务器,例如轮询、最少连接、IP散列等。同时,LB还可以监控服务器的健康状况,并根据需要自动将请求流量从故障的服务器转移到正常运行的服务器上,从而提高系统的可用性。
RPC和GRPC
RPC(Remote Procedure Call)远程过程调用,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议,简单的理解是一个节点请求另一个节点提供的服务。RPC只是一套协议,基于这套协议规范来实现的框架都可以称为 RPC 框架,比较典型的有 Dubbo、Thrift 和 gRPC。
grpc是一个高性能、通用的开源RPC框架,可以让你轻松构建分布式应用和服务,用于在不同服务之间进行通信。它是由 Google 开发并开源的,基于 HTTP/2 协议进行通信。gRPC 的主要目标是提供一种简单、高效、可扩展的通信方式,让开发者能够更容易地构建分布式系统和微服务。
详细资料可参考:https://zhuanlan.zhihu.com/p/612901118
消息队列
服务的消息队列是一种异步通信机制,它允许不同的服务之间发送和接收消息。消息队列通常用于解耦服务,提高应用程序的可靠性和可扩展性。
以下是一个简单的服务的消息队列的实现:
- 首先,需要选择一个消息队列服务。有许多消息队列服务可供选择,例如 RabbitMQ、Kafka、RocketMQ 等。
- 然后,需要创建一个队列。队列是一个存储消息的地方,可以将其视为一个缓冲区,消息可以在其中等待处理。
- 接下来,需要创建一个生产者服务。生产者服务负责将消息发送到队列中。生产者将消息发送到队列,然后其他服务可以从队列中接收并处理这些消息。
- 最后,需要创建一个消费者服务。消费者服务负责从队列中接收消息并处理它们。当消费者从队列中接收消息时,它们可以进行处理,例如将消息转换为其他格式或将其存储在数据库中。
服务的消息队列是一种异步通信机制,可以用于解耦服务并提高应用程序的可靠性和可扩展性。通过创建队列、生产者服务和消费者服务,可以实现消息队列的简单实现。
协程和进程
协程和进程是两种不同的并发模型,进程是操作系统的基本执行单元,而协程是用户级线程。这意味着进程由操作系统内核管理,而协程由应用程序本身管理,它们都用于实现并发编程,但在调度和管理上有所不同。
- 协程(Coroutine):协程是一种用户态的轻量级线程,它的调度和管理由程序自身控制,而不是由操作系统内核完成。协程之间的切换不需要内核态和用户态之间的切换,因此开销较小。协程的主要优点是可以在单个线程中实现多任务的并发执行,从而提高程序的执行效率。协程的调度策略有多种,如 FCM、Lua 等。
- 进程(Process):进程是操作系统中资源分配的基本单位,它包括程序代码、数据、堆栈等资源。进程之间相互独立,由操作系统内核进行调度和管理。进程之间的切换需要经过内核态和用户态之间的切换,因此开销相对较大。进程的主要优点是可以在多个线程之间实现任务的分发和隔离,从而提高程序的稳定性和安全性。
总结:协程和进程都是用于实现并发编程的概念,但它们在调度和管理上有所不同。协程更轻量级,由程序自身控制调度,适用于需要高效执行的应用;而进程更重量级,由操作系统内核进行调度,适用于需要任务分发和隔离的应用。
容器和节点
服务容器
服务容器是一种轻量级的、可移植的、自包含的软件打包技术,它将应用程序及其依赖项打包在一起,从而实现应用程序的快速部署和运行。每个服务容器都包含应用程序及其所有依赖项,但它们共享主机操作系统的内核,因此比传统的虚拟机更高效。服务容器的主要优点是可以轻松地在不同环境中移植应用程序,因为所有的依赖项都被包含在容器中。
常见的服务容器技术Docker:Docker 是一种流行的开源容器技术,它使用轻量级的虚拟化技术来隔离应用程序的运行环境。Docker 容器可以在任何支持 Docker 的操作系统上运行,从而实现应用程序的跨平台部署。
服务节点
节点是指在分布式系统中的一个计算单元,它通常包括一个或多个处理器、内存和磁盘存储空间。节点可以是物理服务器、虚拟机或云服务提供商提供的计算资源。在分布式系统中,节点之间通过网络连接进行通信和协作,共同完成系统的任务。
服务容器和节点之间的关系是多对多的,这意味着一个服务容器可以运行在多个节点上,一个节点也可以运行多个服务容器。
跨域
跨域指的是浏览器的同源策略。同源策略是浏览器为了保护用户信息安全而设置的一项安全策略,它规定了浏览器的脚本(例如 JavaScript)只能访问来自同一源的资源。
常见的跨域策略有以下两种:
- 简单请求:浏览器将对简单请求的跨域请求进行预检请求,预检请求的响应头包括:
- Access-Control-Allow-Origin:允许的源
- Access-Control-Allow-Methods:允许的请求方法
- Access-Control-Allow-Headers:允许的请求头
- Access-Control-Max-Age:缓存此响应的时间(以秒为单位)
- Access-Control-Allow-Credentials:是否允许请求包含凭据(如 Cookies)
- 非简单请求:浏览器将在发起实际请求之前进行一次预检请求。预检请求的响应头包括:
- Access-Control-Allow-Origin:允许的源
- Access-Control-Allow-Methods:允许的请求方法
- Access-Control-Allow-Headers:允许的请求头
- Access-Control-Max-Age:缓存此响应的时间(以秒为单位)
- Access-Control-Allow-Credentials:是否允许请求包含凭据(如 Cookies)
通过这些跨域策略,可以实现在浏览器端和服务器端安全地进行跨域数据传输。
带宽
带宽是指在单位时间内传送数据的能力,通常用每秒传送的数据量来衡量。在计算机网络中,带宽通常以比特率(bit/s)来表示,也可以用字节率(byte/s)来表示。
带宽的大小决定了网络传输速度的限制,即可以传输的最大数据量。带宽越大,网络传输速度越快,可以传输的数据量也越大。
时间戳
时间戳(Timestamp)是一个表示某个特定时间的数字或字符串,通常是从某个特定的起点开始计算的秒数或毫秒数。它可以用于记录事件发生的顺序、计算时间间隔、生成唯一标识等。常见的时间戳格式包括Unix时间戳(以1970年1月1日00:00:00 UTC作为起点)和Windows文件时间戳(以1601年1月1日00:00:00 UTC作为起点)。
连接池
连接池是一个用于存储和管理数据库连接管理技术。在一个应用程序中,多次请求需要使用相同的数据库连接,连接池负责维护这些连接,确保在整个应用程序执行期间,每个请求都有一个已建立的连接。它可以提高应用程序的性能和效率,以减少建立和关闭数据库连接的开销,提高系统性能。
私有化
服务私有化是指将公共或共享的服务转变为由单一实体拥有和控制的过程。通常,这种转变涉及到将服务的运营、管理和财务责任转移给私人部门。服务私有化的目的是提高效率、降低成本和改善服务质量。
集群模式
服务集群模式是一种分布式系统架构模式,用于实现高可用性和可伸缩性。在这种模式中,一个服务被部署到多个服务器上,这些服务器共同组成一个集群。每个服务器都可以处理一部分或全部的请求负载,从而提高系统的性能和可靠性。
服务集群模式通常包括以下几种实现方式:
- 负载均衡器:用于将请求均匀地分配给不同的服务器,从而实现负载均衡。
- 服务注册与发现:服务在启动时向注册中心注册自己的信息,例如IP地址、端口和服务名称等,服务之间通过注册中心互相发现和通信。
- 健康检查:定期检查服务的健康状况,例如服务是否正常运行、是否响应请求等。如果服务出现故障,则会被标记为不可用,从而避免将请求发送到故障节点上。
- 数据分片:将数据分成多个部分,每个部分存储在不同的服务器上,从而实现数据的分布式管理和访问。
- 容错机制:当某个服务节点发生故障时,系统可以自动将请求转发到其他可用节点上,从而保证系统的可用性。
- 服务注册与发现:服务节点在启动时需要向注册中心注册自己的地址信息,其他节点可以通过注册中心查询到可用的服务节点列表。
- 配置管理:为了保证所有服务节点的配置一致,需要有一个专门的配置管理系统来集中管理和分发配置信息。
- 数据库复制:为了确保数据的可用性和一致性,集群中的数据库可以进行复制。当一个节点发生变化时,这些变化可以同步到其他节点,确保整个集群的数据是一致的。
- 分布式计算:通过将任务分解为多个子任务,并在集群中的多个节点上并行处理,可以实现分布式计算。这种方式可以提高计算速度,因为大量的计算任务可以在短时间内完成。
- 高可用性:通过配置冗余节点和自动故障切换,集群可以实现高可用性。当一个节点出现故障时,其他节点可以自动接管它的任务,确保服务不会中断。
链路追踪
链路追踪(distributed tracing)是分布式系统中跟踪和分析请求在系统中的运行情况和性能问题的技术。在分布式系统中,一次请求可能涉及多个微服务的协同工作,链路追踪能够帮助我们更好地了解整个请求的流程,诊断问题、优化性能。
链路追踪的核心思想是将请求的跟踪信息在整个请求链路中传递,这样可以将请求的调用过程串联起来,形成一个完整的请求链路,从而快速定位出问题所在。链路追踪的实现通常分为四个阶段:生成追踪信息、传递追踪信息、收集追踪信息、分析追踪信息。
降级策略
降级策略是在系统或服务面临压力或异常情况下,为了保障系统的稳定性和可用性,采取的一种降低系统负载、避免系统崩溃或延迟响应的措施。降级策略通常包括以下几种:
限流策略
通过对系统的访问量进行限制,避免系统承受不住大量请求而崩溃。限流可以通过令牌桶、漏桶等算法实现。
降级策略
当系统出现异常或压力过大时,降低部分功能或服务的运行级别,以减轻系统负担。降级可以是针对单个服务、模块或者整个系统,可以根据业务需求和优先级进行选择。
熔断策略
服务熔断是指在分布式系统中,当某个服务出现故障或者超负荷时,为了防止整个系统的崩溃,可以暂时停止对该服务的调用,并返回一个错误信息或默认值。这样可以让其他部分的服务正常运行,并且避免了因该服务的故障而影响到整个系统的稳定性和可靠性,可以很好地避免因某个服务出现故障导致整个系统崩溃的情况。
资源隔离
将系统中的不同部分进行隔离,避免故障传播和影响。例如,在分布式系统中,可以使用隔离策略将不同服务的数据和资源分开,以降低故障影响范围。
负载均衡
通过将系统负载分配到多个处理单元上,提高系统的处理能力和可用性。负载均衡可以采用硬件设备、软件实现或分布式系统架构等方式。
弹性伸缩
根据系统的实时运行状况,动态调整系统资源,以满足业务需求。弹性伸缩通常包括自动扩展和自动收缩两种策略,可以根据系统的负载、资源使用率等指标进行调整。
数据缓存
对于非实时性要求较高的数据,可以采用缓存的方式提高响应速度。
异步处理
对于一些耗时的操作,可以采用异步处理的方式,提高系统的响应速度。
忽略次要功能
在系统压力较大时,可以选择忽略一些次要的功能,关闭一些不重要的功能或服务,以减轻系统负担,保证主要功能的正常运行。
手动干预
在必要的情况下,可以通过手动干预的方式,如人工调整系统参数、重启服务等,来恢复系统的正常运行。
CDN基础知识
CDN
CDN的全称是Content Delivery Network,即内容分发网络。其实现是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",这些“边缘”一般称为“边缘节点”或“CDN节点”。利用这些节点,使用户可以就近取得所需的内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。从技术层面,解决了网络带宽小,用户访问量大,网点分布不均等原因所造成的用户访问网站响应速度慢的问题。
源站
源站就是“源头的站点“,也就是CDN上面的资源,最初来自哪里。对我们业务来说,源站一般是指KS3,服务器(不建议)等。
回源
服务的回源,一般是指在内容分发网络(CDN)或者代理服务器等场景下,当用户请求到达服务端时,如果服务端本身没有该请求的内容,那么就会向原始的数据源服务器发起请求获取数据,这个过程就叫做回源。回源的目的主要是为了保证用户能够获取到最新的、最准确的数据。
当用户访问CDN一个图片时,于是就跑到”源站“去找那张图片,找到后,就给用户返回,并在本地缓存住。下次再有访问请求过来,直接就返回缓存的图片。
这就是”源站“的作用了,上面的过程,就是”回源“。大致的流程是 “用户 --> CDN服务器 --> 源站”。
测试术语
断言
测试所说的断言是用于验证测试结果是否符合预期的一种技术或方法。在测试中,断言通常用于检查程序的输出、行为或状态是否满足预期的条件。断言可以通过比较实际结果与预期结果来判断测试是否通过。如果断言验证失败,即实际结果与预期结果不一致,测试将被标记为失败或错误。
枚举
在软件测试中,枚举通常指一种特定类型的测试数据。它是一种将所有可能的值列举出来并进行测试的方法。在枚举测试中,测试人员会尝试所有可能的输入值或状态,以确保软件系统能够正确地响应每个情况。
冥等
在软件工程中,冥等(Idempotent)是指一个操作无论执行多少次,结果都是一样的。换句话说,重复执行一个冥等操作不会产生任何额外的影响。在测试中,"冥等"(Idempotence)是指一个操作不论执行多少次,结果都是一样的。比如,如果你有一个删除用户的功能,如果这个用户已经不存在了,那么无论你尝试删除多少次,结果都是相同的:用户仍然不存在。
慢查
慢查是指在数据库查询中,查询速度较慢的情况。这可能是由于多种原因导致的,例如查询的数据量较大、查询语句复杂度高、数据库性能不足等,包括但不限于以下几点:
- 数据库索引问题:如果数据库表没有正确地创建索引,查询时需要遍历整个表来查找匹配的记录,导致查询速度变慢。
- 查询语句问题:查询语句的编写不合理,例如没有使用到索引、使用了过多的JOIN操作等,都会导致查询速度下降。
- 数据库表结构问题:如果数据库表的结构设计不合理,例如表中包含过多的冗余字段、字段类型选择不当等,都会导致查询速度降低。
- 数据库服务器负载问题:如果数据库服务器的负载过高,例如同时有大量的查询操作,会导致每个查询的响应时间变长。
解决慢查问题可以从以下几个方面入手:
- 优化查询语句:通过合理地编写查询语句,使用索引、避免不必要的JOIN操作等,提升查询效率。
- 优化数据库表结构:对于表结构不合理的情况,可以考虑重新设计表结构,减少冗余字段、选择适当的字段类型等。
- 创建合适的索引:根据查询需求,创建合适的索引,以加快查询速度。
- 升级硬件设备:如果数据库服务器的负载过高,可以考虑升级硬件设备,提升服务器的处理能力。
- 数据库性能监控:定期监控数据库性能,及时发现慢查询问题,并进行相应的优化处理。
灾备
服务灾备是指通过构建备份系统或备用服务设施,在主服务系统出现故障或网络故障、自然灾害等不可抗力因素导致服务不可用时,通过预先设定的备用方案,能够迅速切换到备份系统或备用服务设施,保证服务的连续性和稳定性。
热更
服务的热更新是指在不停止服务或中断服务的情况下,对正在运行的服务进行代码更新和功能升级。它可以提高服务的灵活性、可靠性和可维护性。
吞吐量
在性能测试中,吞吐量是指系统或应用程序在一定时间内能够处理的并发请求或事务数量。它是衡量系统性能的重要指标之一。
吞吐量可以用来评估系统的负载能力和处理能力。通过测试系统在不同负载下的吞吐量,可以确定系统的承载能力和性能瓶颈。在性能测试中,吞吐量通常以每秒钟(TPS)或每分钟(TPM)处理的事务数量来衡量。较高的吞吐量表示系统能够处理更多的请求或事务,即具有更高的处理能力。需要关注的指标包括最大吞吐量、平均吞吐量、响应时间、错误率等。其中,最大吞吐量是指系统在一定压力下能够处理的最大请求数量,平均吞吐量是指系统在一定时间内平均处理的请求数量。响应时间是指系统对请求的响应时间,包括请求到达系统到系统返回结果的时间。错误率是指系统处理请求时发生错误的比率。
单元测试
单元测试是对软件中的最小可测试单元进行检查和验证。对于函数、方法或类这样的程序组件,单元就是它们本身;而对于整个模块,单元可能就是多个相关的函数、方法或类。
录制回放
测试的录制回放是指将测试过程中的操作步骤和结果记录下来,以便在后续测试过程中重放这些操作,以验证应用程序或网站的功能和性能是否符合预期。
越权访问
如果需要授权访问的页面没有做会话合法判断和权限判断,一但被攻击者知道访问地址将可以直接访问,导致越权访问。
"对于每一个需要鉴权的接口,检查用户是否被授权执行该操作,是否存在越权校验了会话的合法性,并不能保证当前用户可以执行此操作,还需要确认用户的角色。
纵向越权
纵向越权指在安全测试中,攻击者通过利用系统中的漏洞或弱点,从一个权限级别跨越到更高的权限级别,获取未授权的访问权限或执行未授权的操作。这种攻击方式通常涉及跳过或绕过系统的访问控制机制,以获取对系统资源的未授权访问。
横向越权
横向越权指在安全测试中,攻击者通过利用系统中的漏洞或弱点,从一个用户或角色跨越到另一个用户或角色,获取未授权的访问权限或执行未授权的操作。这种攻击方式通常涉及绕过系统的身份验证和授权机制,以获取其他用户或角色的权限,从而访问其他用户的数据或执行其他用户的操作。横向越权攻击通常发生在多用户环境中,如企业内部网络或Web应用程序中的用户角色。
故障演练
服务故障演练是指在服务发生故障时,对故障进行模拟演练,以便在真实故障发生时,能够快速有效地应对。服务故障演练可以帮助企业发现服务故障的潜在风险,并制定相应的预案。
混沌测试
混沌测试是一种软件测试方法,旨在通过故意引入系统中的不确定性和混乱,来评估系统的稳定性和可靠性。这种测试方法的主要目的是在系统面临各种异常和故障情况时,观察系统的反应和行为,以便及早发现系统的潜在问题和薄弱环节。