架构之路知多少,开篇只为你知晓


1.目前主流的远程通信机制:

 * 远程过程调用PRC

 * 消息队列

 * 远程共享数据


   RPC是比较普遍且使用率高的一种技术,过程实现比较复杂但是对于开发人员来讲,相对直观简单,因为远程调用和本地调用几乎一致(jar的依赖)。

   消息队列的好处是系统耦合性较低,而且消息中间件比较成熟,开发难度低,框架简单。

   远程共享数据的原理是将数据存入预定的某个节点,然后其他部分定时读取该节点的数据,这种方式的缺点是通信效率比较地下,目前已经被基于ZooKeeper的共享目录树的实时通信方式取代;

 

2.J2EE 经典架构图


          

  当前绝大多数企业级分布式应用架构仍然符合这一典型架构设计;Ejb被其他更加轻量级的技术代替;RMI远程调用(RPC)被多语言支持的高性能RPC(Dobbo)代替。JNDI被ZooKeeper开源中间件代替;JMS被RocketMQ 、Kafka、ZeroMQ。

 

   分布式系统目前呈现出的特点:

   1.强调实时性和松耦合性设计;

   2.各种基础中间件之间更加钟情于多语言的支持;

3. RPC

   RPC是所有分布式系统底层核心之一。

   发展:

   基于Socket二进制的传输协议----XML-baseeRPC ----SOAP-----高性能的二级制传输模式【谷歌的Protocol Buffers】。

 

   RPC框架工作原理:

   首先,服务端开启一个Sockt监听端口并等待客户端发送请求报文,当收到客户端发送过来的请求报文时,监听线程把报文放入请求队列中等待处理,此时有一个专门的线程池(Handler线程池)来负责处理队列,Handler线程处理完请求以后,以非阻塞模式方式发送应答报文到客户端连接,接着,客户端你这边调用线程收到应答报文,RPC调用结束;

4. RMI通信原理架构

   RMI使用java远程消息交换协议JPMP(java remotemessaging protocol)进行通信,缺点是针对java对象,不支持非java语言对象进行通信;

 

   RMI系统组成:

   远程服务接口定义;

   桩(Stub)和框架(Skeleton)文件;

   远程服务接口的具体实现;

   一个RMI命名服务,它允许客户端发现这个远程服务;

 

  RMI调用过程:

           

   如图,一个RMI调用从Client客户端开始,经过客户端的Sub代理程序,途径RRL和传输层,到达服务器的Skeleton代理,最终指向远程服务接口的具体实现;

 

5. JNDI

  JNDI是java的命名好目录接口,是一组在java应用中访问命名和目录服务的API。JNDI包括服务名称和对应的具体访问地址。我们现在常说的(Zookeeper)服务注册,其实就是在jndi的目录里增加一条某个服务和它的具体访问地址;服务发现就是用jndi的查询接口查询某个服务;

 

6. Ice

   ZeroC  Ice 甚至被誉为RPC框架之王,又被称为反叛之冰。

   Ice(Internet Communications Engine)是ZeroC公司的杰作,继承了CORBA的血统,是新一代的面向对象的分布式系统中间件。Ice是RPC通讯领域里最稳定、强大、高性能、跨平台、多语言支持的老牌开源中间件,特别适合于当前互联网领域中一个平台存在多种开发语言编程,以及网站和app应用并存的复杂大型项目。

   Ice 是一种面向对象的中间件平台。从根本上说,这意味着Ice 为构建面向对象的客户-服务器应用提供了工具、API 和库支持。Ice 应用适合在异种环境中使用:客户和服务器可以用不同的编程语言编写,可以运行在不同的操作系统和机器架构上,并且可以使用多种网络技术进行通信。无论部署环境如何,这些应用的源码都是可移植的。

           


7. Apache ZooKeeper

   ZooKeeper 提供了基础的目录、名字服务、配置管理服务,并且在此基础上提供分布式锁、Leader选举等高级功能。

   ZooKeeper分为两个部分,其中Server端(简称ZK)是一个java进程,通常部署在3个节点以上以确保服务的高可用性,ZK会自动选择一个Leader作为主节点并确保数据在3个节点上同步,客户端通过TCP连接ZK节点,进行目录和配置数据的创建、查询已经监听变化事件,并做出响应处理;如图:


            

   Zookeeper比jndi更加灵活、强大。允许开发人员自己组织任意的目录结构。适用多个场景:

   对一个分部署系统的各个进程节点的参数进行配置管理,各个阶段仅仅保留自身的ID信息,其他配置都可以通过ZK完成,并且集中化管理,实时生效;

   定义并管理分布式系统的多个进程节点的Topo关系,我们可以在ZK上利用目录树建立起这种Topo关系,然后每个进程节点启动后读取ZK目录树,根据目录树的定义,发起邻居节点的连接握手过程,当Topo结构被修改后,每个节点通过监听目录树的变化来获取这一消息,重新建立新邻居的连接过程。

   分布式系统中Leader节点的自动选举。

   分布式系统中集中锁和共享数据的功能。

 

8. Apache Kafka

   Kafka 是一个高吞吐量的分布式消息系统,kafka管理从各个应用程序汇聚到此的信息流,这些数据经过处理后再被分发的各处。

   Kafka的数据只会按照顺序append,数据的删除策略为积累到一定程度或者超过一定时间再删除,kafka的另一个独特之处在于消费者信息保存在客户端而不是MQ服务端,这样服务器就不用记录消息的投递过程。每个客户端都知道自己下一次应该从什么位置读取消息。消息的投递过程也是采用客户端主动pull的模型,这样大大减轻了服务器的负担。Kafka还强调减少数据的序列化的复制开销,他会将一些消息组织成Message Set做批量存储和发送,并且客户端在pull数据时,尽量以Zero-copy的方式进行传输,利用sendfile这样的io函数来减少复制开销,kafka是一个特殊的MQ系统;

   Kafka是近乎实时的方式处理流经过某个公司的所有数据。

   Kafka原理图:

                

   Kafka集群由多个Broker服务器组成,为topic消息模式,同一个topic内部的消息按照一定的key和算法被分区(partition)存储在不同的Broker上,消息生产者producer和消费者consumer可以在多个Broker上生产/消费topic。Kafka支持消息的replica机制,一个消息分区的多个replica分布在不同的Broker上,由leaderreplica负责日志读取,通过Zookeeper监督failover,不同分区的leader replica均衡负载到不同的Broker上,在这种情况下,produce可以选择不等待leader replica 的ACK,部分ACK或者完全备份完毕后ACK等不同的ACK机制。

 

9. Facebook Thrift

   Thrift是新一代高性能、跨语言的RPC通信框架。Thrift的出现表明互联网时代需要一个跨语言的高性能RPC来代替低效的Restful。当我们面对大量未知的开发者时,RestAPI或者是一个好选择,但是当我们的api针对非常明确的用户、时长、行业或者技术时,更加倾向不用RestFul;

   Thrift与ice相比仅仅是还不成熟,与之媲美的但是Haoop之父新作《Apahce Avro》。Thrift的缺点是没有一个完美的方案可以解决所有问题,因此尽量保持一个Neutral框架,插入不同的实现并相互交互;Avro偏向实用,主张建立一个标准的统一。


              

10. NFS (network file system)网络文件系统

  优势:

  1. 节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用。

  2. 用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用。

  3. 一些存储设备如软驱、CDROM和Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量。

 

  组成:

  一台NFS服务器和若干台客户机,如下图所示。

  客户机通过TCP/IP网络远程访问存放在NFS服务器上的数据。

  在NFS服务器正式启用前,需要根据实际环境和需求,配置一些NFS参数。


                   

11.ELK(ElasticSearch、Logstash和Kiabana)

   学习地址:http://www.tuicool.com/articles/YR7RRr

 

   ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成;

 

   Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

   Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。

Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

          

   如图:Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser。


   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值