zoukankan      html  css  js  c++  java
  • 分布式后台架构

    集群、负载均衡、分布式、微服务

    转载于:https://www.cnblogs.com/howtobuildjenkins/p/8999441.html

    后台系统框架,分为以下几种:

    1、单机架构

    这种架构,很常见,比如有一个很小的系统,不用处理很多东西,只需要一台服务器,在上面搭建出自己需要的服务,就可以开始工作。

    这种架构优点显而易见,方便维护,出了问题解决起来很方便。

    缺点也很明显,如果处理变多,资源也就不够用了。

     集群是个物理形态,分布式是个工作方式。

    只要是一堆机器,就可以叫集群,他们是不是一起协作着干活,这个谁也不知道;一个程序或系统,只要运行在不同的机器上,就可以叫分布式;

    2、集群架构(每台服务器上的代码及服务一样)

    单机架构无法满足要求,集群架构就可以提供更好更快的处理,简单来说,集群架构就是把单机架构上面运行的服务,摘出来,然后复制,在多个服务器上面进行部署,这样可以提高工作效率。在集群中,每个服务器都称为节点,每个节点提供不同的服务,比如Database、Web、日志工具。

    集群搭建出来后,有这样一个角色,负责调度客户端来的请求究竟要到哪一台服务器上去,然后在进行接下来的工作流,这个角色叫做——“负载均衡器”

    集群也分为高可用集群,负载均衡集群(可能高并发架构就是负载均衡架构的升级版)。

    高可用集群工具常见的有:heartbeat,pacemaker,keepalived

    负载均衡器工具常见的有:nginx,lvs,HAproxy

    集群架构优点:可扩展性,服务器资源不够用,就可以加一台继续进行工作

    缺点:维护起来困难,trouble shoot的时候需要花费时间较多

    3、负载均衡

    负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,从而共同完成工作任务;

    按软硬件分:

    软件负载均衡解决方案是指在一台或多台服务器相应的操作系统上安装一个或多个附加软件来实现负载均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的优点是基于特定环境,配置简单,使用灵活,成本低廉,可以满足一般的负载均衡需求;

    硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求;

    按本地全局分:

    本地负载均衡是指对本地的服务器群做负载均衡,全局负载均衡是指对分别放置在不同的地理位置、有不同网络结构的服务器群间作负载均衡;

    负载均衡有三种部署方式:路由模式、桥接模式、服务直接返回模式。路由模式部署灵活,约60%的用户采用这种方式部署;桥接模式不改变现有的网络架构;服务直接返回(DSR)比较适合吞吐量大特别是内容分发的网络应用。约30%的用户采用这种模式;

    采用负载均衡模式时候,要实时检查多台服务器的存活状态:

    默认的健康检查方式是Ping检查服务器的存活状态。只有服务器状态为Up时,负载均衡器才会把会话分发给该服务器处理,从而最大可能性的保障用户的请求得到服务器的正常应答,这也是负载均衡器的基本功能之一;

    4、分布式系统(由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统)

    分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据;

    我的理解就是 1+1 > 2 ;

    只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统;

    因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构(拓扑结构是指网络中各个站点相互连接的形式),会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题;

    分布式和微服务区别:

    分布式部署的应用不一定是微服务架构的,比如集群部署,它是把相同应用复制到不同服务器上,但是逻辑功能上还是单体应用。

    即分布式系统可以是集群部署也可以是微服务架构;

    5、微服务架构(每个高内聚的业务模块为一个服务,单独部署一个子系统)

    先来对前面的知识点做个总结。 从单机结构到集群结构,你的代码基本无需要作任何修改,你要做的仅仅是多部署几台服务器,(集群)每台服务器上运行相同的代码就行了。但是,当你要从集群结构演进到微服务结构的时候,之前的那套代码就需要发生较大的改动了。所以对于新系统我们建议,系统设计之初就采用微服务架构,这样后期运维的成本更低。但如果一套老系统需要升级成微服务结构的话,那就得对代码大动干戈了。所以,对于老系统而言,究竟是继续保持集群模式,还是升级成微服务架构,这需要你们的架构师深思熟虑、权衡投入产出比。

    下面开始介绍所谓的微服务。 微服务就是将一个完整的系统,按照业务功能,拆分成一个个独立的子系统,在微服务结构中,每个子系统就被称为“服务”。这些子系统能够独立运行在web容器中,它们之间通过RPC方式通信

    简单来说微服务就是很小的服务,小到一个服务只对应一个单一的功能,只做一件事。这个服务可以单独部署运行,服务之间可以通过RPC来相互交互,每个微服务都是由独立的小团队开发,测试,部署,上线,负责它的整个生命周期。

    微服务架构优点:

    耦合度大大降低,可以独立开发、独立部署、独立测试,效率高;

    耦合度降低,系统更易于扩展;

    某些公用的服务的复用性更高:

    6、RPC通信是什么?

      RPC(Remote Procedure Call Procotol)远程过程调用协议,通俗的解释就是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。阿里巴巴的Dubbo框架,就是运用RPC协议比较好的框架;

    举个例子,假设需要开发一个在线商城。按照微服务的思想,我们需要按照功能模块拆分成多个独立的服务,如:用户服务、产品服务、订单服务、后台管理服务、数据分析服务等等。这一个个服务都是一个个独立的项目,可以独立运行。如果服务之间有依赖关系,那么通过RPC方式调用

    7、Dubbo

    Dubbo是一套微服务系统的协调者,在它这套体系中,一共有三种角色,分别是:服务提供者(下面简称提供者)、服务消费者(下面简称消费者)、注册中心。

    Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现;可以和 Spring框架无缝集成

    你在使用的时候需要将Dubbo的jar包引入到你的项目中,也就是每个服务都要引入Dubbo的jar包。然后当这些服务初始化的时候,Dubbo就会将当前系统需要发布的服务、以及当前系统的IP和端口号发送给注册中心,注册中心便会将其记录下来。这就是服务发布的过程。与此同时,也是在系统初始化的时候,Dubbo还会扫描一下当前系统所需要引用的服务,然后向注册中心请求这些服务所在的IP和端口号。接下来系统就可以正常运行了。当系统A需要调用系统B的服务的时候,A就会与B建立起一条RPC信道,然后再调用B系统上相应的服务。

    这,就是Dubbo的作用。

    8、微服务具体部署

    当我们使用了微服务架构后,我们将一个原本完整的系统,按照业务逻辑拆分成一个个可独立运行的子系统。为了降低系统间的耦合度,我们希望这些子系统能够运行在独立的环境中,这些环境之间能够相互隔离。

    在Docker出现之前,若使用虚拟机来实现运行环境的相互隔离的话成本较高,虚拟机会消耗较多的计算机硬件/软件资源。Docker不仅能够实现运行环境的隔离,而且能极大程度的节约计算机资源,它成为一种轻量级的“虚拟机”。

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

    当我们使用微服务架构后,随着业务的逐渐发展,系统之间的依赖关系会日益复杂,而且各个模块的构建顺序都有所讲究。对于一个小型系统来说,也许只有几个模块,那么你每次采用人肉构建的方式也许并不感觉麻烦。但随着系统业务的发展,你的系统之间的依赖关系日益复杂,子系统也逐渐增多,每次构建一下你都要非常小心谨慎,稍有不慎整个服务都无法正常启动。而且这些构建的工作很low,但却需要消耗大量的精力,这无疑降低了开发的效率。不过没关系,Jenkins就是来帮助你解决这个问题的。

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能;

    Jenkins功能包括:
    1、持续的软件版本发布/测试项目。
    2、监控外部调用执行的工作。
     
    持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件;
     

    我们只需在Jenkins中配置好代码仓库、各个模块的构建顺序和构建命令,在以后的构建中,只需要点击“立即构建”按钮,Jenkins就会自动到你的代码仓库中拉取最新的代码,然后根据你事先配置的构建命令进行构建,最后发布到指定的容器中运行。你也可以让Jenkins定时检查代码仓库版本的变化,一旦发现变动就自动地开始构建过程,并且让Jenkins在构建成功后给你发一封邮件。这样你连“立即构建”的按钮也不需要按,就能全自动地完成这一切构建过程。

    行动——岸上的人永远学不会游泳
  • 相关阅读:
    Scala(二)——基础语法(与Java的区分)和函数式编程
    LeetCode3.无重复字符的最大子串
    LeetCode2.两数相加
    LeetCode1.两数之和
    Scala(一)——基本类型
    图论算法总结(一)——图的遍历
    Hutool强大的工具类
    Jdk8新特性之接口新增方法
    mybatis的xml配置中if text判断
    Jdk8新特性目录
  • 原文地址:https://www.cnblogs.com/liugrwit/p/12897792.html
Copyright © 2011-2022 走看看