热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【笔记与博客收集】服务端相关知识点

服务端技术介绍(系统架构纬度):(1)服务端开发的技术栈(2)基础设施ÿ
  1. 服务端技术介绍(系统架构纬度):
    (1) 服务端开发的技术栈
    在这里插入图片描述

(2) 基础设施:

  • 操作系统
  • 网络设施
  • 机房机架

(3)支撑系统:

  • 日志系统
  • 监控报警
  • 运维系统

(4) 接入层:

  • 反向代理请求
  • Nginx
  • 负载均衡
  • 轮询/随机/权重
  • hash/一致性 hash
    在这里插入图片描述

(5) 逻辑层:

  • 根据业务逻辑,处理用户请求,得到返回结果
  • 单体式服务:所有业务逻辑集中在一个代码仓库,一个进程里
  • 简单,适合协作人数少,功能少
  • 维护/更新方便
  • 难以支持高复杂度系统
  • 微服务
  • 多人团队协作成本更低
  • 功能复用、系统解耦、故障隔离
  • 影响性能,系统复杂度指数性上升,对业务设计流程要求更高
    在这里插入图片描述

(6) 存储层:

  • 数据的 存储/转发/查询
  • SQL类关系型存储
  • NoSQL类Key-Value存储
  • 分布式文件系统
  • 队列存储

  1. 网络协议:HTTP/ HTTPS (以下内容来自HTTP与HTTPS的区别)
    (1) HTTP和HTTPS的基本概念
    HTTP(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。
    HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。
    HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
    HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
    HTTPS 默认工作在 TCP 协议443端口,它的工作流程一般如以下方式:

    1. TCP 三次同步握手
    2. 客户端验证服务器数字证书
    3. DH 算法协商对称加密算法的密钥、hash 算法的密钥
    4. SSL 安全加密隧道协商完成
    5. 网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改。

    (2) HTTP 与 HTTPS 区别

    • HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
    • 使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
    • HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
    • http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
    • HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。

    (3) HTTPS的工作原理
    在这里插入图片描述

    • 客户端发起 HTTPS 请求
      这个没什么好说的,就是用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。

    • 服务端的配置
      采用 HTTPS 协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl 就是个不错的选择,有 1 年的免费服务)。
      这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

    • 这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

    • 客户端解析证书
      部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。
      如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

    • 传送加密信息
      这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

    • 服务段解密信息
      服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。

    • 传输加密后的信息
      这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。

    • 客户端解密信息
      客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。

  2. 数据的封装和交换:JSON/ XML/ Protocol buffers
    (1) JSON
    JSON (Javascript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于Javascript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, Javascript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
    JSON建构于两种结构:
    o “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组(associative array)。
    o 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
    其中,值的基础类型一般为字符串(String),数值(Number),布尔值(Boolean)等。

    JSON规则相对简单:

    • 单一映射用”:”分隔,即”名称/值”对
    • 并列的映射/数据用”,”分隔
    • 有序列表用”[]”表示
    • 映射集合用”{}”表示

    理论上,所有的数据结构均可以使用该规则进行定义。

    实例:
    在这里插入图片描述
    (2) XML
    XML:可扩展标记语言(eXtensible Markup Language),被设计用来传输和存储数据。在大多数Web应用程序中,XML用于传输数据,而HTML用于格式化并显示数据。但XML不仅仅用于Web应用,由于XML能有效地表示结构化数据,使得XML已经成为计算机软件领域数据交换的标准技术模式之一。通过XML实现数据的标准化、结构化,解决了在不同平台、不同系统之间的数据结构/模式的差异,使得数据层在XML技术的支持下统一起来。

    实例:
    在这里插入图片描述

    (3) Protocol buffers
    Protocol buffers 为 Google 提出的一种跨平台、多语言支持且开源的序列化数据格式。相对于类似的 XML 和 JSON,Protocol buffers 更为小巧、快速和简单。其语法目前分为proto2和proto3两种格式,是目前冗余信息最少的一种格式,需要专门工具进行生成和解析,生成的内容不具备可读性,但其高性能的优势,使得该数据格式成为了一些特定领域的理想选择。。
    相对于传统的 XML 和 JSON, Protocol buffers 的优势主要在于:更加小、更加快。对于自定义的数据结构,Protobuf 可以通过生成器生成不同语言的源代码文件,读写操作都非常方便。
    假设现在有下面 JSON 格式的数据:
    在这里插入图片描述
    使用 JSON 进行编码,得出byte长度为43的的二进制数据:
    在这里插入图片描述
    如果使用 Protobuf 进行编码,得到的二进制数据仅有20个字节
    在这里插入图片描述
    (4) 其他
    HTML:是一种基于标签(TAG)的数据格式,但领域特定,是Web服务器和客户端浏览器之间的一种交互手段,很难用在其他应用中。
    YAML:与JSON类似,采用缩进格式,它进一步减少了冗余信息。不过,由于兼容性问题,目前使用领域还比较有限

  3. 远程过程调用:RPC
    在这里插入图片描述
    (1) 介绍
    远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用,例:Java RMI。
    (2) 基本原理
    从发起远程调用到接收到数据返回结果,大致过程是:
    1)服务消费方(client)调用以本地调用方式调用服务;
    2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
    3)client stub找到服务地址,并将消息发送到服务端;
    4)server stub收到消息后进行解码;
    5)server stub根据解码结果调用本地的服务;
    6)本地服务执行并将结果返回给server stub;
    7)server stub将返回结果打包成消息并发送至消费方;
    8)client stub接收到消息,并进行解码;
    9)服务消费方得到最终结果。

    那么rpc就相当于将step2-step8的步骤进行了封装。
    在这里插入图片描述
    (3) 实现一个简单的RPC

  4. 非关系型数据库:Redis/ Memcached/ MongoDB
    Nosql的全称是Not Only Sql,这个概念早起就有人提出,在09年的时候比较火。Nosql指的是非关系型数据库,而我们常用的都是关系型数据库。就像我们常用的mysql,oralce、sqlserver等一样,这些数据库一般用来存储重要信息,应对普通的业务是没有问题的。但是,随着互联网的高速发展,传统的关系型数据库在应付超大规模,超大流量以及高并发的时候力不从心。而就在这个时候,Nosql应运而生。
    关系型数据库通常有SQL Server,Mysql,Oracle等。主流的Nosql数据库有Redis,Memcache,MongoDb。大多数的关系型数据库都是付费的并且价格昂贵,成本较大,而Nosql数据库通常都是开源的。
    (1) Redis
    支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)
    支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
    支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。
    单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
    支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。
    Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。
    (2) Memcached
    Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。支持直接配置为session handle。
    只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。
    无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。
    无法进行数据同步,不能将MC中的数据迁移到其他MC实例中。
    Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。
    (3) MongoDB
    更高的写负载,MongoDB拥有更高的插入速度。
    处理很大的规模的单表,当数据表太大的时候可以很容易的分割表。
    高可用性,设置M-S不仅方便而且很快,MongoDB还可以快速、安全及自动化的实现节点(数据中心)故障转移。
    快速的查询,MongoDB支持二维空间索引,比如管道,因此可以快速及精确的从指定位置获取数据。MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内存资源相当丰富的话,这将极大地提高数据库的查询速度。
    非结构化数据的爆发增长,增加列在有些情况下可能锁定整个数据库,或者增加负载从而导致性能下降,由于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响,整个过程会非常快速。
    不支持事务。MongoDB占用空间过大 。
    MongoDB没有成熟的维护工具。
    (4) 比较
    三者的性能都比较高,总的来讲:Memcache和Redis差不多,要高于MongoDB。
    memcache数据结构单一。redis丰富一些,数据操作方面,redis更好一些,较少的网络IO次数。mongodb支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
    redis:数据量较小的更性能操作和运算上。
    memcache:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)。
    MongoDB:主要解决海量数据的访问效率问题。

  5. 关系型数据库:Mysql
    MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
    (由于专业课程数据库原理中已经学习过,这里不做进一步描述)

  6. 消息队列: Kafka/ RabbitMQ/ ZeroMQ
    消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:

    当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。

    消息队列主要解决了应用耦合、异步处理、流量削锋等问题。
    当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。
    (1) Kafka
    Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),,之后成为Apache项目的一部分。Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。

    主要特性:

    1. 快速持久化,可以在O(1)的系统开销下进行消息持久化;
    2. 高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;
    3. .完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡;
    4. 支持同步和异步复制两种HA;
    5. 支持数据批量发送和拉取;
    6. zero-copy:减少IO操作步骤;
    7. 数据迁移、扩容对用户透明;
    8. 无需停机即可扩展机器;
    9. 其他特性:严格的消息顺序、丰富的消息拉取模型、高效订阅者水平扩展、实时的消息订阅、亿级的消息堆积能力、定期删除机制;

    (2) RabbitMQ
    RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。

    主要特性:

    1. 可靠性: 提供了多种技术可以让你在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、发布者证实和高可用性机制;
    2. 灵活的路由: 消息在到达队列前是通过交换机进行路由的。RabbitMQ为典型的路由逻辑提供了多种内置交换机类型。如果你有更复杂的路由需求,可以将这些交换机组合起来使用,你甚至可以实现自己的交换机类型,并且当做RabbitMQ的插件来使用;
    3. 消息集群:在相同局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个独立的逻辑代理来使用;
    4. 队列高可用:队列可以在集群中的机器上进行镜像,以确保在硬件问题下还保证消息安全;
    5. 多种协议的支持:支持多种消息队列协议;
    6. 服务器端用Erlang语言编写,支持只要是你能想到的所有编程语言;
    7. 管理界面: RabbitMQ有一个易用的用户界面,使得用户可以监控和管理消息Broker的许多方面;
    8. 跟踪机制:如果消息异常,RabbitMQ提供消息跟踪机制,使用者可以找出发生了什么;
    9. 插件机制:提供了许多插件,来从多方面进行扩展,也可以编写自己的插件;

    (3) ZeroMQ
    ZeroMQ(也称为 ØMQ,0MQ 或 zmq)是一个可嵌入的网络通讯库(对 Socket 进行了封装)。 它提供了携带跨越多种传输协议(如:进程内,进程间,TCP 和多播)的原子消息的 sockets 。 有了ZeroMQ,我们可以通过发布-订阅、任务分发、和请求-回复等模式来建立 N-N 的 socket 连接。 ZeroMQ 的异步 I / O 模型为我们提供可扩展的基于异步消息处理任务的多核应用程序。 它有一系列语言API(几乎囊括所有编程语言),并能够在大多数操作系统上运行。

    传统的 TCP Socket 的连接是1对1的,可以认为“1个 socket = 1个连接”,每一个线程独立维护一个 socket 。但是 ZMQ 摒弃了这种1对1的模式,ZMQ的 Socket 可以很轻松地实现1对N和N对N的连接模式,一个 ZMQ 的 socket 可以自动地维护一组连接,用户无法操作这些连接,用户只能操作套接字而不是连接本身。所以说在 ZMQ 的世界里,连接是私有的。

    主要特性:

    1. 支持高并发的异步 Socket 框架
    2. 协议比 TCP 更快、适用于大型集群和分布式计算
    3. 提供多种消息传递机制,如 inproc/IPC/TCP/multicast 等
    4. 内置丰富的组合模式,可用于简化大型分步式计算架构
    5. 提供异步 I/O 模式,适用于可扩展的多核应用开发
    6. 拥有活跃的开发者社区提供技术支持,发展相当迅速
    7. 支持超过 30 种的编程语言,如 C/C++/Java/.NET/Python/PHP 等
    8. 良好的跨平台性,支持多种 OS,如 Linux/Windows/OS X 等
    9. 拥有 iMatix 公司的商业级别支持,却是完全免费的

推荐阅读
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • PHP自学必备:从零开始的准备工作与工具选择 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 本文探讨了使用Python进行微服务架构设计的合理性和适用性。首先,介绍了微服务的基本概念及其在现代软件开发中的重要性。接着,通过具体的业务场景,详细分析了Python在微服务架构设计中的优势和挑战。文章还讨论了在实际应用中可能遇到的问题,并提出了相应的解决方案。希望本文能够为从事Python微服务开发的技术人员提供有价值的参考和指导。 ... [详细]
  • 在腾讯云服务器上部署Nginx的详细指南中,首先需要确保安装必要的依赖包。如果这些依赖包已安装,可直接跳过此步骤。具体命令包括 `yum -y install gcc gcc-c++ wget net-tools pcre-devel zlib-devel`。接下来,本文将详细介绍如何下载、编译和配置Nginx,以确保其在腾讯云服务器上顺利运行。此外,还将提供一些优化建议,帮助用户提升Nginx的性能和安全性。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
author-avatar
手机用户2502875333
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有