• .Net 分布式系统架构设计(转)


    一、设计目的

      基于window平台搭建的大型分布式系统不多,之前了解过myspace、stackoverflow等大型网站。搭建一个大型平台需要综合考虑很多方面,不单纯是软件架构,还包括网络和硬件设备等。由于现代大部分应用建设都面临用户多、高并发、高可用的需求,传统软件架构已不能满足需求,需要支持分布式软件架构,能支持横向扩展,具有高可用、伸缩性、稳定性等特点。搭建如下系统架构。


      二、系统软件结构

      

     系统软件结构示意图

      系统基于SOA架构设计,系统整体划分为不同组件或者应用服务,支持分布式的部署及扩展,并通过Nginx组件实现负载均衡。根据逻辑关联划分为:表现层、应用层和数据层。表现层负责系统与用户或者外部系统交互;应用层是服务于表现层,主要实现业务逻辑处理满足表现层的需求;数据层是负责系统数据的存储。

      (1)表现层

           主要负责与用户和外部系统交互,具体提供系统可操作WEB功能、数据交换程序或者数据接口。满足不同的场景使用。Web Layer主要用asp.net mvc5技术实现;Data Exchange根据需求实现数据交换程序;Data Interface主要基于http协议,用Web API技术实现。

      (2)应用层

           主要负责系统逻辑计算的实现,提供服务接口给展现层使用。此两层之间通信基于系统内部局域网tcp/ip协议,为了提高数据传输效率。根据应用服务职责不同,将分两大类,分别为业务应用服务和基础应用服务。业务应用服务实现业务需求的功能服务,比如用户订单、某类商品的管理功能等。基础应用服务实现系统基础公用的功能服务,比如:日志服务、缓存服务、用户认证服务功能等。本系统应用服务一般使用.NET平台的通信框架WCF技术实现,个别其他组件除外,比如MQ组件、Redis缓存组件。

          (3)数据层

           主要负责系统数据存储、同步、缓存和备份管理。本系统数据分为结构化数据和非结构化数据。对于结构化数据使用MSSQL2008以上数据库存储,基于MSSQL复制同步的机制,可以进行数据读写分离的实现,提升数据层面的优化。对于本系统业务日志数据的存储选型,由于考虑到业务日志数据结构多样化、数据量较大,所以选用MongoDB的NoSQL技术,同时系统面对着高并发的访问,采取了缓存的机制提升性能,选用Redis缓存组件实现数据缓存存储。对于非结构化数据存储,比如文档、图片等数据,本系统基于Windows平台NTFS文件系统实现文档存储和读写功能。


      三、系统物理结构

     

     系统物理结构示意图

      本系统网络分为:内部局域网和互联网。服务器位于内部局域网,通过反向代理服务器对互联网公布系统,用户通过互联网访问系统。从网络层面安全进行隔离。用户访问系统基于http协议,系统内部之间服务器通信基于tcp/ip协议。根据部署应用的划分,将服务器分为负载均衡服务器、Web服务器、应用服务器、数据服务器四大类。

      (1)负载均衡服务器

        基于Linux之CentOS平台搭建Nginx服务,作Load Balance。

      (2)Web服务器

        基于window平台下IIS web服务器。部署基于asp.net mvc、web api技术实现的程序。

      (3)应用服务器

        部署基于.net平台通信框架之WCF技术实现的服务接口,提供与展现层调用,其中部分公用组件,如MQ则根据组件的要求部署。

      (4)数据服务器

      本系统数据存储选用:mssql数据库、MongoDB、Redis缓存和文件存储。根据项目情况数据库可做读写分离,同时结合redis做缓存策略提高系统性能。

    本章节先大致介绍系统框架及物理结构情况,由于涉及几个技术点,比如:nginx负载均衡搭建、asp.netmvc与WCF服务之间调用、redis分布式缓存使用、MongoDB存储日志、MQ异步传输日志数据、文件服务实现。后续逐步介绍。

    Net分布式系统之二:CentOS系统搭建Nginx负载均衡

    一、关于CentOS系统介绍

      CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。基于Red Hat持续升级,和对已知BUG修复,所以CentOS更多用于搭建大型企业级服务器。目前较新版本为7.0,本文使用CentOS7 64bit进行搭建系统负载均衡。


    二、安装VMWare

      VMWare (Virtual Machine ware)是一个“虚拟PC”软件公司.它的产品可以使你在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,VMWare采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。本文使用VMWare WorkStation12安装CentOS操作系统。详细安装步骤参考:查看, 百度软件下载点击


    三、安装CentOS系统

      首先需要下载CentOS安装包,下载IOS格式,本文使用CentOS7 64bit 版本,下载

      详细安装步骤请点击查看

      注意事项:

      1、分区的时候,选择EXT4格式,boot分区为400m,/分区为8G,/home分区为7G,var分区为6G,swap分区为2G

      2、用户和组ID,都设为 1000

      3、安装完成重启后提示License的,输入:1、2、r、yes 完成进入成功进入系统

      4、ctrl+alt 鼠标切回本机电脑,不在虚拟机里


    四、安装Nginx和配置

      1、Nginx介绍

      Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的工程师Igor Sysoev研发,供俄国大型的入口网站Rambler使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

      2、安装部署  

      在CentOS7通过命令行安装Nginx服务器。

      (1)添加Nginx仓储,添加 epel repository

    sudo yum install epel-release

      (2)检查是否已安装过nginx 

    find -name nginx

      (3)如果有安装则删除

    yum remove nginx

      (4)安装nginx

    sudo yum install nginx

      (5)启动nginx

    sudo systemctl start nginx
    sudo systemctl enable nginx #可用

      (6)将nginx 设置为启动系统自动启动nginx

    echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local

      (7)查看本机IP,为了后续配置nginx.conf所用

    ifconfig

      (8)修改nginx.conf配置文件

    cd /etc/nginx/ #定位到nginx安装目录
    vim nginx.conf #通过vim打开nginx.conf配置文件进行配置

      (9)主要配置节点,192.168.119.1:8081 和 192.168.119.1:8082 分别部署在 IIS7的两个ASP.NET MVC 开发的站点(在另一台电脑),设计软件架构解决方案后续介绍。

    复制代码
    upstream 192.168.119.128{
        server 192.168.119.1:8081;
        server 192.168.119.1:8082;
    }
    
    
    server{
        listen   80;
        server_name  192.168.119.128;
        location /{
            proxy_pass   http://192.168.119.128;
        }
        
    }
    复制代码

      (10)重启nginx服务

    service nginx restart

    以上记录在CentOS7操作系统搭建Nginx负载均衡解决方案记录。后续简介通过Keepalived搭建Nginx负载高可用解决方案。

    Net分布式系统之二:CentOS系统搭建Nginx负载均衡(下)

      上一篇文章介绍了VMWare12虚拟机、Linux(CentOS7)系统安装、部署Nginx1.6.3代理服务做负载均衡。接下来介绍通过Nginx将请求分发到各web应用处理服务。

    一、Web应用开发

      1、asp.net mvc5开发

      (1)新建一个MVC5工程,新建一个Controller,在Index方法实现将当前时间保存到Session["mysession"],并写Cookies["mycookies"]存储主机名和当前时间。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public ActionResult Index()
            {
                if (this.HttpContext.Session["mysession"] == null)
                {
                    this.HttpContext.Session["mysession"] = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
                }
     
                this.HttpContext.Response.Cookies.Add(new HttpCookie("mycookies")
                    {
                        Expires = DateTime.Now.AddDays(1),
                        Value = HttpContext.Server.MachineName + "||" + DateTime.Now.ToString()
                    });
     
                return View();
            }

      (2)在Controller中新增第二个方法GetSession,显示Session和Cookies的值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public ActionResult GetSession()
            {
                if (this.HttpContext.Session["mysession"] != null)
                {
                    ViewBag.DD = this.HttpContext.Session["mysession"].ToString();
                    ViewBag.SCode = this.HttpContext.Session["mysession"].GetHashCode().ToString();
                    ViewBag.SID = this.HttpContext.Session.SessionID;
                }
     
                ViewBag.CVAL = System.Web.HttpContext.Current.Request.Cookies["mycookies"].Value;
                ViewBag.CID = System.Web.HttpContext.Current.Request.Cookies["mycookies"].Name;
                ViewBag.CDO = System.Web.HttpContext.Current.Request.Cookies["mycookies"].Domain;
     
                return View();
            }

      (3)将session和cookies信息在页面显示,GetSession视图代码如下:

    复制代码
    @{
        ViewBag.Title = "GetSession";
    }
    
    <h2>站点:A -- GetSession</h2>
    
    <span>站点:A</span>
    <br />
    <span>Session Value: @ViewBag.DD</span>
    <br/>
    <br />
    <span>Session SCode: @ViewBag.SCode</span>
    <br />
    <br />
    <span>Session ID: @ViewBag.SID</span>
    <br />
    <br />
    <span>Cookies ID: @ViewBag.CID</span>
    <br />
    <br />
    <span>Cookies Values: @ViewBag.CVAL</span>
    <br />
    <br />
    <span>Cookies Values: @ViewBag.CDO</span>
    复制代码

       以上实现session和cookies读写,为了验证负载均衡下,每次请求处理是否保持一致,接下来重要内容,做负载均衡如何如何保持session一致,对于asp.net技术session原理此处不做介绍,网上搜索下大把。

      2、Session共享技术

       .Net平台对支持几种session存储模式:

      (1)InProc 模式

        session存储于当前站点在同一个进程内,修改web.config或者bin中文件更新,会导致session丢失。此模式为默认模式。

      (2)aspnet state 模式 

        aspnet state是将session存储在状态服务中,需要启动ASP.NET State Service,能看到进程aspnet_state.exe。还需要在web.config配置此模式。

      (3)SQLServer 模式 

        此模式需要SQL Server配置相关信息,启动代理服务、数据库账号及表,并将web.config指向数据库。

      (4)第三方扩展 模式 

        本框架采用此模式,将session存储到其他存储,比如:Memcached、redis缓存中,达到共享session的目的。可以通过实现ASP.NET中的SessionStateStoreProviderBase这个抽象类扩展。本系统采用将session存储在redis缓存中,通过引入  RedisSessionStateProvider组件。

    Install-Package Microsoft.Web.RedisSessionStateProvider

      3、Nginx服务状态情况

      在centos终端输入命令service nginx status 查看情况,确保服务正常运行。

      4、Web站点部署

      部署两个站点分别为:

      站点A:端口为8081,

      站点B:端口为8082,

      

    二、功能效果展现

       (1)浏览器访问Index方法,http://192.168.119.128/demo,显示如下:

            

      (2)浏览器访问GetSession方法,http://192.168.119.128/demo/getsession,显示如下:

         

      通过以上验证,获取到的session和cookies都是一致。

    Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用

      上一篇写了nginx负载均衡,此篇实现高可用(HA)。系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常运行。针对系统架构设计的高可用要求,我们需要解决Nginx负载均衡出现单机故障时,系统正常运行的需求。所以系统架构引入Keepalived组件,实现系统高可用。

      一、Keepalived介绍

       Keepalived是分布式部署系统解决系统高可用的软件,结合LVS(Linux Virtual Server)使用,其功能类似于heartbeat,解决单机宕机的问题。


      二、Keepalived技术原理

       keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。通过VRRP协议结合LVS,对组群服务器监控情况,若master出现宕机情况,则将VIP漂移到backup机上。实现了分布式系统高可用。可以理解为:keepalived是LVS的管理软件,根据监控情况,将宕机服务器从ipvsadm移除掉。


      三、Keepalived+LVS+Nginx实现系统高可用

      

     
    服务器 IP地址 说明
    虚拟IP 192.168.1.120:80  
    主机 192.168.1.104:80  
    备机 192.168.1.103:80  
    Web站点A 192.168.1.101:8081 不同端口
    Web站点B 192.168.1.101:8082 不同端口

      

      1、安装ipvsadm,CentOS7自带安装包,通过yum进行安装。实现系统支持LVS

    1
    yum install ipvsadm

      2、安装Keepalived软件,并将keepalived设置开机启动

    1
    yum install Keepalived
     
    1
    systemctl enable keepalived

      

      3、进行Keepalived.conf配置,如果是MASTER机,将state BACKUP改为state MASTER。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    vim /etc/keepalived/keepalived.conf
    #配置的内容
    ! Configuration File for keepalived
     
    global_defs {
       notification_email {
         xxx@126.com #收到通知的邮件地址
       }
       notification_email_from XX@126.com
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }
     
    vrrp_script monitor_nginx{
       script "/usr/local/etc/keepalived/script/monitor_nginx.sh"
       interval 1
       weight -15
    }
     
    vrrp_instance VI_1 {
        state BACKUP
        interface eno16777736
        virtual_router_id 51
        priority 80
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.120
        }
        track_script {
            monitor_nginx
        }
    }
     
    virtual_server 192.168.1.120 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        persistence_timeout 50
        protocol TCP
     
        real_server 192.168.1.103 80 {
            weight 1
            TCP_CHECK {
                connect_timeout 10
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }
     
        real_server 192.168.1.104 80 {
            weight 5
            TCP_CHECK {
                connect_timeout 10
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }
    }

      4、配置监控shell脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (1)创建:vim /usr/local/etc/keepalived/script/monitor_nginx.sh<br><br>(2)SHELL文件内容<br>#!/bin/bash 
    if "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
    then 
        systemclt start nginx.service
        sleep 5   
      if "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" 
      then  
        killall keepalived 
      fi 
    fi

      以上完成相关配置,nginx和web服务以上一篇博客内容一致。如下对功能进行验证测试。


      四、实现测试展示

       1、访问系统情况:通过VIP(192.168.1.120)访问系统页面。因为设置了轮询调度,所以刷新页面访问不同站点。

            

      2、将 MASTER(192.168.1.104)关机前后,查看相关VLS情况:

      (1)关机前:

      (2)关机后:

      我们看到将104服务器从 LVS移除掉。此时则将后续请求转发到103服务器。

      3、关机后,BACKUP服务器 keepalived日志显示无法连接104,并移除掉

      

    Net分布式系统之四:RabbitMQ消息队列应用

       消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景。本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理;二是通过消息队列传输系统日志。目前业界使用较多的消息队列组件有RabbitMQ、ActiveMQ、MSMQ、kafka、zeroMQ等,本文对系统架构之MQ Component诠释,并采用RabbitMQ作为消息队列中间件。

     

    图1- 消息队列组件示意图


    一、RabbitMQ介绍

      RabbitMQ是一款基于AMQP(消息队列协议),由Erlang开发的开源消息队列组件。是一款优秀的消息队列组件,他由两部分组成:服务端和客户端,客户端支持多种语言的驱动,如:.Net、JAVA、Erlang等。RabbitMQ与其他消息队列组件性能比较,在此不作介绍,网上有大把的资料。


    二、RabbitMQ原理简介

     

    图2- RabbitMQ结构示意图

      RabbitMQ中间件分为服务端(RabbitMQ Server)和客户端(RabbitMQ Client),服务端可以理解为是一个消息的代理消费者,客户端又分为消息生产者(Producer)和消息消费者(Consumer)。

      1、消息生产者(Producer):主要生产消息并将消息基于TCP协议,通过建立Connection和Channel,将消息传输给RabbitMQ Server,对于Producer而言基本就完成了工作。

      2、服务端(RabbitMQ Server):主要负责处理消息路由、分发、入队列、缓存和出列。主要由三部分组成:Exchange、RoutingKey、Queue。

        (1)Exchange:用于接收消息生产者发送的消息,有三种类型的exchange:direct, fanout,topic,不同类型实现了不同的路由算法;

        A. direct exchange:将与routing key 比配的消息,直接推入相对应的队列,创建队列时,默认就创建同名的routing key。

        B. fanout exchange:是一种广播模式,忽略routingkey的规则。

        C. topic exchange:应用主题,根据key进行模式匹配路由,例如:若为abc*则推入到所有abc*相对应的queue;若为abc.#则推入到abc.xx.one ,abc.yy.two对应的queue。

        (2)RoutingKey:是RabbitMQ实现路由分发到各个队列的规则,并结合Binging提供于Exchange使用将消息推送入队列;

        (3)Queue:是消息队列,可以根据需要定义多个队列,设置队列的属性,比如:消息移除、消息缓存、回调机制等设置,实现与Consumer通信;

      3、消息消费者(Consumer):主要负责消费Queue的消息,同样基于TCP协议,通过建立Connection和Channel与Queue传输消息,一个消息可以给多个Consumer消费;

      4、关键名词说明:Connection、Channel、Binging等;

        (1)Connection:是建立客户端与服务端的连接。

        (2)Channel:是基于Connection之上建立通信通道,因为每次Connection建立TCP协议通信开销及性能消耗较大,所以一次建立Connection后,使用多个Channel通道通信减少开销和提高性能。

        (3)Binging:是一个捆绑定义,将exchange和queue捆绑,定义routingkey相关策略。


    三、RabbitMQ安装部署

       以上对RabbitMQ简介,接下来我们通过实际搭建消息队列服务实践。RabbitMQ服务端能运行于Window、Linux和Mac平台,客户端也支持多种技术的实现。本次我们将在Linux之CentOS7平台搭建。

      1、安装Erlang运行环境

        由于RabbitMQ使用Erlang技术开发,所以需要先安装Erlang运行环境后,才能安装消息队列服务。

        (1)配置系统能正常访问公网,设置默认网关

    1
    route add default gw 192.168.1.1

        (2)安装erlang

    1
    2
    su -c 'rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm'
    sudo yum install erlang

        (3)检查erlang是否安装成功

    1
    erl

        (4)安装成功

        

      2、安装RabbitMQ服务端

        (1)下载安装包

    1
    wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.0/rabbitmq-server-3.6.0-1.noarch.rpm

        (2)安装和配置RabbitMQ服务端,3.6.0版本:

    1
    2
    rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
    yum install rabbitmq-server-3.6.0-1.noarch.rpm

        (3)启用web管理插件

    1
    rabbitmq-plugins enable rabbitmq_management

        (4)启动RabbitMQ

    1
    2
    chkconfig rabbitmq-server on
    /sbin/service rabbitmq-server start

        (5)防火墙开通端口

    1
    2
    3
    # firewall-cmd --permanent --zone=public --add-port=5672/tcp
    # firewall-cmd --permanent --zone=public --add-port=15672/tcp
    # firewall-cmd --reload

        (6)rabbitmq默认会创建guest账号,只能用于localhost登录页面管理员,本机访问地址:http://localhost:15672/

    1
    2
    rabbitmqctl add_user test test
    rabbitmqctl set_user_tags test administrator<br>rabbitmqctl set_permissions -p / test ".*" ".*" ".*"

          

                   RabbitMQ 管理员页面。


    四、RabbitMQ应用

       本章节描述,web应用生产的日志,通过rabbitmq传输,然后日志服务接收消息队列的消息。

        

    图3- 功能结构示意图

      本系统采用官方的Client,通过nuget引用。

      

       1、Web应用生产业务日志

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [HttpPost]
            public ActionResult Create()
            {
                this.HttpContext.Session["mysession"] = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
                var txt = Request.Form["txtSite"].ToString();
                RabbitMQHelper helper = new RabbitMQHelper();
                helper.SendMsg(txt + ",操作日志,时间:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
     
                return RedirectToAction("Index");
            }

      页面效果图。

      2、日志服务接收日志消息

         基于window form开发一个日志处理服务,并将接收的消息打印出来。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    private void btnReceive_Click(object sender, EventArgs e)
            {
                isConnected = true;
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare("MyLog"falsefalsefalsenull);
     
                    var consumer = new QueueingBasicConsumer(channel);
                    channel.BasicConsume("MyLog"true, consumer);
     
                    while (isConnected)
                    {
                        var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
     
                        var body = ea.Body;
                        var message = Encoding.UTF8.GetString(body);
                        txtMsg.Text += message + " ";
     
                    }
                }
            }

      

       3、RabbitMQ页面监控情况

       RabbitMQ自带页面监控工具,通过此工具可以监控MQ的情况:

             

    五、总结

      此文大概介绍RabbitMQ搭建和应用于本系统,RabbitMQ还是较为简单,还提供界面监控工具方便运维人员监控。

    Net分布式系统之五:C#使用Redis集群缓存

      本文介绍系统缓存组件,采用NOSQL之Redis作为系统缓存层。

    一、背景

      系统考虑到高并发的使用场景。对于并发提交场景,通过上一章节介绍的RabbitMQ组件解决。对于系统高并发查询,为了提供性能减少数据库压力,我们加入缓存机制,可以不同层次加入缓存支持,本文主要介绍应用服务层和数据层之间加入缓存机制提升性能。业界缓存组件有Redis、Memcached、MemoryCache。本系统采用Redis缓存组件,有些系统将Redis当作MQ使用,此场景本系统用RabbitMQ,Redis主要用于系统缓存应用。


    二、Redis简介

      Redis是一个开源的Key-Value数据库,使用C语言编写、支持网络、可基于内存亦可持久化的NOSQL数据库,并提供多种语言的API,例如:Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等语言驱动。自Redis3.0开始支持集群方案。

       相关Redis Cluster 原理在此不多介绍,网络上有很多资料。


    三、Redis集群应用

      (一)环境介绍

        本系统基于Linux之CentOS搭建Redis3.0集群。将三个Instance部署于一台虚拟机,应用部署于windows平台。

    序号 服务IP 说明
    1 192.168.1.110

    Redis节点A端口:7000(M),7003(S)

    Redis节点B端口:7001(M),7004(S)

    Redis节点C端口:7002(M),7005(S)

      

      

      (二)安装Redis

      1、安装相关依赖工具

    1
    [root@andoncentos 桌面]# yum -y install gcc openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel gcc-c++ automake autoconf

      2、安装Redis 3.0.6

    1
    [root@andoncentos 桌面]# cd /usr/loacal
     
    1
    [root@andoncentos loacal]# wget http://download.redis.io/releases/redis-3.0.6.tar.gz
     
    1
    [root@andoncentos 桌面]# tar xvf redis-3.0.6.tar.gz
     
    1
    [root@andoncentos 桌面]# cd redis-3.0.6/
     
    1
    [root@andoncentos 桌面]# make MALLOC=libc
     
    1
    [root@andoncentos redis-3.0.6]# make install

      3、由于我们使用不同端口号区分,在两个服务各自建立以端口命名的文件夹。配置7000节点服务,将redis-server和redis.conf复制到/etc/redis/7000

    1
    [root@andoncentos 桌面]# mkdir /etc/redis/7000
     
    1
    [root@andoncentos 桌面]# mkdir /etc/redis/7001
     
    1
    [root@andoncentos 桌面]# mkdir /etc/redis/7002
     
    1
    [root@andoncentos 桌面]# mkdir /etc/redis/7003
     
    1
    [root@andoncentos 桌面]# mkdir /etc/redis/7004
     
    1
    [root@andoncentos 桌面]# mkdir /etc/redis/7005
     
    1
    [root@andoncentos redis-3.0.6]# cp /usr/local/redis-3.0.6/src/redis-server /usr/local/redis-3.0.6/redis.conf /etc/redis/7000
     
    1
    [root@andoncentos redis-3.0.6]# vim /etc/redis/7000/redis.conf

      port 7000
      daemonize yes 
      pidfile /var/run/redis_7000.pid
      cluster-enabled yes
      cluster-config-file nodes.conf
      logfile "/var/log/redisd7000.log"
      dir /etc/redis/7000/
      cluster-node-timeout 5000
      appendonly yes

      4、修改redis服务的启动脚本,修改内容,并复制相关其他的节点配置

    1
    2
    [root@andoncentos redis-3.0.6]# cp /usr/local/redis-3.0.6/utils/redis_init_script /etc/init.d/redis7000
    [root@andoncentos redis-3.0.6]# vim /etc/init.d/redis7000

    #!/bin/sh
    # chkconfig 2345 90 10
    # description:Redis is a persistent key-value database
    # Simple Redis init.d script conceived to work on Linux systems
    # as it does use of the /proc filesystem.

    REDISPORT=7000
    # EXEC=/usr/local/bin/redis-server
    EXEC=/etc/redis/${REDISPORT}/redis-server
    CLIEXEC=/usr/local/bin/redis-cli

    PIDFILE=/var/run/redis_${REDISPORT}.pid
    CONF="/etc/redis/${REDISPORT}/redis.conf"

    1
    2
    3
    [root@andoncentos redis-3.0.6]# cp /etc/init.d/redis7000 /etc/init.d/redis7001
    [root@andoncentos redis-3.0.6]# cp /etc/init.d/redis7000 /etc/init.d/redis7003
    [root@andoncentos redis-3.0.6]# cp /etc/init.d/redis7000 /etc/init.d/redis7004

      5、设置为开机自启动服务器

    1
    2
    3
    4
    [root@andoncentos redis-3.0.6]# chkconfig redis7000 on
    [root@andoncentos redis-3.0.6]# chkconfig redis7001 on
    [root@andoncentos redis-3.0.6]# chkconfig redis7003 on
    [root@andoncentos redis-3.0.6]# chkconfig redis7004 on

      6、重启系统,并检查redis7000,redis7001,redis7003,redis7004服务情况

    1
    [root@andoncentos redis-3.0.6]# reboot<br>[root@andoncentos 桌面]# systemctl status redis7004.service

     

      (三)配置Redis集群

      1、按照 ruby tree 工具,因为redis集群需要ruby

    1
    [root@andoncentos redis-3.0.6]# yum -y install tcl ruby tree<br>[root@andoncentos 桌面]# gem install redis --version 3.0.6

    Fetching: redis-3.0.6.gem (100%)
    Successfully installed redis-3.0.6
    Parsing documentation for redis-3.0.6
    Installing ri documentation for redis-3.0.6
    1 gem installed

      2、redis-trib.rb 配置集群

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    [root@andoncentos 桌面]# /usr/local/redis-3.0.6/src/redis-trib.rb create --replicas 1 192.168.1.110:7000 192.168.1.110:7001 192.168.1.110:7002 192.168.1.110:7003 192.168.1.110:7004 192.168.1.110:7005
    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    192.168.1.110:7000
    192.168.1.110:7001
    192.168.1.110:7002
    Adding replica 192.168.1.110:7003 to 192.168.1.110:7000
    Adding replica 192.168.1.110:7004 to 192.168.1.110:7001
    Adding replica 192.168.1.110:7005 to 192.168.1.110:7002
    M: b164701893bfbdc078e2f7e3b16f1216c1bf65ff 192.168.1.110:7000
       slots:0-5460 (5461 slots) master
    M: 4c2d36c55cff692a7bbeccb663197b555747d15d 192.168.1.110:7001
       slots:5461-10922 (5462 slots) master
    M: b147e4dfcd63c5ce059540db55a9d7cb9fa093eb 192.168.1.110:7002
       slots:10923-16383 (5461 slots) master
    S: 757381aa5cc5c8ba70f3798f6de6cb7b2e97f924 192.168.1.110:7003
       replicates b164701893bfbdc078e2f7e3b16f1216c1bf65ff
    S: fecc8edf32fc72cd4a5d8ae5306fe4083abfe8e9 192.168.1.110:7004
       replicates 4c2d36c55cff692a7bbeccb663197b555747d15d
    S: 98bd8e1aff631a3bee7f92a39764decea16ee955 192.168.1.110:7005
       replicates b147e4dfcd63c5ce059540db55a9d7cb9fa093eb
    Can I set the above configuration? (type 'yes' to accept): <strong>yes</strong>          
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    Waiting for the cluster to join....
    >>> Performing Cluster Check (using node 192.168.1.110:7000)
    M: b164701893bfbdc078e2f7e3b16f1216c1bf65ff 192.168.1.110:7000
       slots:0-5460 (5461 slots) master
    M: 4c2d36c55cff692a7bbeccb663197b555747d15d 192.168.1.110:7001
       slots:5461-10922 (5462 slots) master
    M: b147e4dfcd63c5ce059540db55a9d7cb9fa093eb 192.168.1.110:7002
       slots:10923-16383 (5461 slots) master
    M: 757381aa5cc5c8ba70f3798f6de6cb7b2e97f924 192.168.1.110:7003
       slots: (0 slots) master
       replicates b164701893bfbdc078e2f7e3b16f1216c1bf65ff
    M: fecc8edf32fc72cd4a5d8ae5306fe4083abfe8e9 192.168.1.110:7004
       slots: (0 slots) master
       replicates 4c2d36c55cff692a7bbeccb663197b555747d15d
    M: 98bd8e1aff631a3bee7f92a39764decea16ee955 192.168.1.110:7005
       slots: (0 slots) master
       replicates b147e4dfcd63c5ce059540db55a9d7cb9fa093eb
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.

      3、检查集群状态

    1
    [root@andoncentos 桌面]# /usr/local/redis-3.0.6/src/redis-trib.rb check  192.168.1.110:7000

      4、若出错的话,通过如下命令行修复

    1
    [root@andoncentos 桌面]# /usr/local/redis-3.0.6/src/redis-trib.rb fix 192.168.1.110:7000

      5、防火墙开放端口,并重启防火墙

    1
    2
    3
    4
    [root@andoncentos 桌面]# firewall-cmd --zone=public --add-port=7000-7005/tcp --permanent
    success
    [root@andoncentos 桌面]# firewall-cmd --reload
    success

      6、检查集群情况

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@andoncentos 桌面]# redis-cli -c -p 7000
    127.0.0.1:7000> cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:6
    cluster_my_epoch:1
    cluster_stats_messages_sent:2492
    cluster_stats_messages_received:2492

    四、使用说明

       (一)使用命令行测试缓存

      

      (二)通过C#代码测试缓存

      1、通过使用stackexchang.redis组件,将数据缓存到集群redis服务。

    1
    2
    3
    4
    5
    6
    7
    var cfg = RedisCachingSectionHandler.GetConfig();
    var serializer = new NewtonsoftSerializer();
    var redis = new StackExchangeRedisCacheClient(serializer, cfg);
     
    var cls = new Cls(){ ID = 1, Name = txt };
    string key = "tkey" new Random().Next(1000, 9999).ToString();
    redis.Add<Cls>(key, cls);

      2、通过key获取数据

    1
    2
    3
    4
    5
    var cfg = RedisCachingSectionHandler.GetConfig();
    var serializer = new NewtonsoftSerializer();
    var redis = new StackExchangeRedisCacheClient(serializer, cfg);
    var entity =  redis.Get<Cls>(key);
     ViewBag.KV = entity != null ? entity.Name : "";

      3、redis缓存情况

     

    Net分布式系统之五:微服务架构

       因工作较忙,抽时间将框架遇到的问题和框架升级设计进行记录。

    一、背景&问题

      之前框架是一个基于SOA思想设计的分布式框架。各应用通过服务方式提供使用,服务之间通信是RPC方式调用,具体实现基于.NET的WCF通信平台。框架存在如下2个问题:

      1、高并发处理能力不足。一当高并发请求,可能出现多个服务待定处理,导致整个系统出现瓶颈。

      2、随着移动端广泛应用,服务不能灵活支持APP应用。

      3、系统持续集成部署过于繁琐,遇到问题不好定位。

      基于以上存在问题升级框架,结合当前主流的架构思想,将系统进行服务化思维,就是“微服务架构”。


      

    二、微服务架构

      微服务架构(Microservices Architecture)是将系统拆分为多个服务,俗称为应用服务。应用服务实现单一、具体的业务应用功能,支持独立部署维护,多个应用服务构建成系统。应用服务之间通过轻量级通信框架进行,并且支持应用服务用不同技术或者平台实现。微服务架构是SOA架构设计思想另一种实现方式。微服务架构有如下特点:

     1、微服务架构好处

      (1)横向扩展应用服务提升系统并发处理能力

      (2)应用服务独立部署维护,有利于迭代开发升级持续部署

      (3)架构灵活支持多种技术实现

      (4)有利于应用服务实现高可用性

     2、微服务架构不足

      (1)对系统设计有一定要求,尤其是拆分技术应用服务接口

      (2)导致系统实现复杂度的提高

      (3)需要确保系统数据一致性机制

      (4)导致系统维护要求和成本提高

      系统是否需要采用微服务架构进行构建是由项目需求决定。采用微服务架构进行设计构建系统,对团队成员能力比传统要求高,尤其是设计能力。


      

    三、框架设计原则

      1、可扩展:支持不修改系统功能,按需扩展服务器资源。

      2、高可用:支持分布式部署双机热备机制,满足系统高可用性的要求。

      3、高并发:支持快捷扩张应用服务处理能力,提升系统处理能力,满足并发请求。

      4、安全性:访问安全通过统一认证访问;信息安全通过加解密、签名传输;网络安全通过网络隔离及防火墙;数据安全通过定时备份及高容错能力。

      5、一致性:采用数据最终一致性策略。


    四、框架总体设计

        

                                                                                    图1- 系统架构示意图

      如图所示,系统架构基于SOA架构设计思想,并且采用微服务架构方式进行设计和构建。将系统呈现和数据进行分离。系统呈现基于网页进行实现,支持多种前端UI框架整合及自定义开发;数据由应用服务提供,统一通过“网关API”提供使用。架构支持通过网络层、应用层的负载均衡中间件等,实现高可用和并发处理能力。架构将一些基础公共功能抽离构建成中间件。

      1、网关API:应用服务通过网关API统一对外提供服务。网关API基于http协议、以restful方式提供统一服务接口,约定接口通信协议,支持系统呈现的功能,以轻量级的通信方式,满足不同客户端。网关API实现统一数据访问权限控制、路由应用服务、限流等功能。

      2、消息平台:负责应用服务之间更新同步信息,将原有系统架构分布式事务调用更新信息的方式,调整为通过消息异步发布/订阅处理,保证数据最终一致性,应用服务之间降低耦合度和强依赖关系。高并发能力下,取得缓存作用。

      3、服务注册监控中心:负责应用服务注册发布登记,同时监控应用服务接口运行情况,支持动态控制应用服务接收请求,实现“去中心化”服务控制。组件实现服务注册登记、监控等功能。

      4、认证中心:负责架构访问统一身份认证。通过用户口令和权限进行控制访问。结合“网关API”实现安全访问、限流等功能,同时实现页面管理功能。

      5、日志管理系统:负责记录系统日志,提供服务接口和组件,业务代码通过异步方式将日志信息传输到“消息平台”,日志管理系统订阅“消息平台”的日志信息进行处理存储。同时提供日志管理功能

      6、缓存中心:基于Redis分布式内存数据库,搭建架构统一缓存中心,提供统一缓存服务。

       

    五、软件架构设计

            

                                                                                     图2- 软件架构示意图

      如图所示,系统架构以微服务架构方式进行开发,从切面观察每个应用服务进行垂直独立开发,根据职责划分层次,从上而下分为四个层次,分别为Web层、服务接口层、业务逻辑层及数据访问层。Web层主要负责系统功能呈现表达,直接面对用户;服务接口层主要负责提供标准化服务接口,与呈现层对接;业务逻辑层主要实现应用业务逻辑,是应用服务核心部分;数据访问层负责数据持久化,支持业务逻辑层。各层次之间通过接口进行隔离,有利于后续维护扩展,减低依赖和影响。

      应用服务完成开发后进行集成部署。Web层将根据约定集成到Web应用容器,其余层次构建为应用服务进行部署,并将服务接口进行注册登记发布使用。

    六、结语

      基础架构大致设计就这样,还需要考虑实施部署,可以考虑云平台弹性资源,再结合docker容器技术。

      后续再逐步介绍相关基础组件设计及实现原理。技术框架重于解决问题,设计依赖需求,需求来源实际业务场景。

    Net分布式系统之六:微服务之API网关

      本人建立了个人技术、工作经验的分享微信号,计划后续公众号同步更新分享,比在此更多具体。欢迎有兴趣的同学一起加入相互学习。基于上篇微服务架构分享,今天分享其中一个重要的基础组件“API网关”。

    一、引言

      随着互联网的快速发展,当前以步入移动互联、物联网时代。用户访问系统入口也变得多种方式,由原来单一的PC客户端,变化到PC客户端、各种浏览器、手机移动端及智能终端等。同时系统之间大部分都不是单独运行,经常会涉及与其他系统对接、共享数据的需求。所以系统需要升级框架满足日新月异需求变化,支持业务发展,并将框架升级为微服务架构。“API网关”核心组件是架构用于满足此些需求。

      很多互联网平台已基于网关的设计思路,构建自身平台的API网关,国内主要有京东、携程、唯品会等,国外主要有Netflix、Amazon等。


      

    二、业界相关网关框架

      业界为了满足这些需求,已有相关的网关框架。

      1、基于nginx平台实现的网关有:KONG、API Umbrella

      2、自研发的网关有:apigee、Zuul


    三、API网关设计

      API网关是微服务架构(Microservices Architecture)标准化服务的模式。API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理则是一样。API网关统一服务入口,可方便实现对平台众多服务接口进行管控,对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或者计费等等。组件设计如下:

        

                                                                                    图1- API网关功能结构示意图

      多种客户端程序,例如:移动APP、PC端和智能终端设备等。客户端程序通过互联网或者专网访问API网关,由API网关统一接收请求后,通过一系列模块定位具体处理的微服务机,并将其转发至目标服务处理,网关与微服务之间通信是内部局域网。API网关统一规范平台对外的服务,同时充当了平台的PaaS层。如上图所示,API网关功能结构基于管道模型和支持可插拔式的设计开发,提供统一基于http协议的WebAPI访问接口,内部每个模块各自实现功能,包括:黑白名单、日志、协议适配、身份认证、计流限流及路由。并且依赖“访问认证中心、服务发布管理中心”分别实现API网关访问权限控制和定位目标微服务。各模块功能说明如下:

      1、黑白名单:实现通过IP地址控制禁止访问网关功能,此功能是应用层面控制实现,再往前也可以通过网络传输方面进行控制访问。

      2、日志:实现访问日志的记录,可用于分析访问、处理性能指标,同时将分析结果支持其他模块功能应用。

      3、协议适配:实现通信协议校验、适配转换的功能。

      4、身份认证:负责网关访问身份认证验证,此模块与“访问认证中心”通信,实际认证业务逻辑交移“访问认证中心”处理。

      5、计流限流:实现微服务访问流量计算,基于流量计算分析进行限流,可以定义多种限流规则。

      6、路由:路由是API网关很核心的模块功能,此模块实现根据请求,锁定目标微服务并将请求进行转发。此模块需要与“服务发布管理中心”通信。“服务发布管理中心”实现微服务发布注册管理功能,与其通信获得目标微服务信息。


    四、API网关部署

      API网关是一个公共基础组件,无状态,可支持多套分布式部署。如下图所示:

               

                                                                          图2- API网关部署示意图


    五、API网关实现技术

      1、技术:框架整体基于.NET平台构建,所以API网关也暂定基于.NET4.6平台和ASP.NET WebAPI2.0框架实现。具体软件架构就用上一篇所介绍的。

      2、性能:部署于IIS7.0,1000个并发查询请求,平均响应90ms。

      可能在IIS7.0和.Net4.6平台,在大并发性能处理上会更不上,后续将考虑基于.net core进行升级开发,并部署于Linux平台。

      API网关主要原理是相通,不同平台结合本身平台整体框架设计,可选用不同的技术实现,目前有些基于Spring MVC、node.js、Erlang技术进行研发。


    六、结语

      以上是对API网关概要进行设计,还有其他方面的内容此篇文章未讨论,例如:安全性、高并发、扩展性等特性设计,同时作为平台其中一个组件,也涉及与其他组件一并协同运行。此块内容会后续分享。

    Net分布式系统之七:日志采集系统(1)

      日志对大型应用系统或者平台尤其重要,系统日志采集、分析是系统运维、维护及用户分析的基础。

    一、系统日志分类

      一般系统日志可分为三大类:

      1、用户行为日志:通过采集系统用户使用系统过程中,一系列的操作日志。

      2、业务变更日志:特定业务场景需要,采集某用户在某时使用某功能,对某业务(对象、数据)进行某操作,由A变成B。

      3、系统运行日志:系统运行服务器资源、网络及基础中间件的情况进行定时采集日志分析。

    二、常见日志分析应用场景

      日志采集分析是由需求驱动,根据某种场景的需要日志采集,采集的日志进行针对性的分析。一般常见的日志分析结果应用场景有:

      1、分析系统或者平台哪些功能是最受欢迎:什么时候使用最多用户使用,某个区域、某类用户使用最多。有利于功能推广;有利于提升服务器资源从而提高用户体验。

      2、内容推荐:根据用户平常阅读内容,采集相关日志,并通过分析后,将用户感兴趣的内容系统自动推荐给用户,从而提升用户站粘性。

      3、系统审计:对于应用系统,采集操作日志、业务变更日志,有利于备查及提供相关安全审计功能。

      4、自动化运维:场景微服务架构的系统或者平台,对运维投入的要求高,自动化部署和运维,可以减少运维的工作量和压力。系统运行环境日志采集、分析,可实现预警、服务器资源动态调配,有利于快速定位排查故障。

      不同系统的运行环境、功能应用场景及需要采集分析日志的需求也各不相同。日志内容、采集方式存在多样性,日志数据量大,所以需要设计一套日志采集系统,满足日志采集需求,支持便捷将分析结果反捕于应用功能。

    三、日志采集系统总体设计

      基于以上日志采集的初步分析,尤其微服务架构中,微服务治理能力、服务负载需要依赖服务日志的采集分析,所以日志采集子系统是微服务架构的基础支持功能。日志采集系统总体设计如下:

    图1- 日志采集系统总体框架示意图

      如上图所示,根据日志整个过程,系统由三部分组成:日志采集、日志存储&分析及结果应用。日志采集主要负责提供多种方式进行采集日志;日志存储&分析主要实现分析统一存储和定制的场景分析日志;结果应用实现将日志分析结果提供服务接口或者默认的管理功能,供应用功能使用。

      日志采集整体过程:日志采集后,通过在线或者离线传输到消息队列,由日志消费应用拉取后进行存储。根据分析需要定制自动作业任务实现日志数据抽取、转换、统计后,将结果数据写入关系型数据库。提供服务接口或者日志查询默认管理功能进行使用。

    1、日志采集

      日志采集实现三种方式进行采集日志:

      (1)WebAPI方式:实现基于http协议 restful方式采集日志数据,并发送至消息队列。主要用于提供移动端、微信公众号及小量日志采集使用,在NET分布式系统上可结合“API网关”使用。

      (2)Service Proxy方式:基于log4.net优秀的日志组件和消息队列客户端驱动,进行封装为日志记录服务代理,提供便捷、统一的接口供应用进行使用。支持将日志记录到应用本地和在线实时发送至消息队列,其中记录到应用本地,可结合第三种方式完成应用功能日志采集的功能。

      (3)LCClient方式:实现客户端批量抓取日志数据,发送至LCServer。LCClient客户端基于TCP协议与LCServer服务端进行通信,基于NIO框架构建,可支持高并发处理能力。LCServer再将日志数据写入消息队列。

      日志采集通过提供三种方式,满足不同的业务应用场景使用采集日志。

    2、日志存储&分析

      日志存储及分析由五部分构成:消息队列(MQ)、日志接收服务端(LCServer)、日志存储(Elasticsearch)、任务作业(Quartz.net)及关系型数据库(MySQL)。

      (1)消息队列(MQ):日志通过消息队列实现消息统一接收,做一道缓冲,满足日志数据并发接收能力。

      (2)日志接收服务端(LCServer):接收LCClient客户端批量发送日志数据,并将其发送至消息队列。

      (3)日志存储(Elasticsearch):选用ES做日志存储,主要考虑ES是一种文档化分布式搜索服务,支持PB级的数据存储,支持上百个节点的分布式集群能力,并且提供丰富的API使用,数据查询方面有着优越的性能。

      (4)任务作业(Quartz.net):通过定制化开发作业任务实现对ES日志数据抽取、转换、分析后,将结果存储于关系型数据库。Quartz.net中间件是业界公认的作业任务组件。

      (5)关系型数据库(MySQL):实现日志结果数据存储,供日志应用查询使用。MySQL有着优越的主从复制机制,可解决单节点查询性能瓶颈,同时提供传统SQL脚本操作数据的能力,提供开发效率。

      日志数据存储和分析后,最终目的就是提供与应用功能使用。

    3、分析结果应用

      分析结果应用主要提供服务接口和管理功能两种方式。

      (1)服务接口方式:基于http协议以restful方式提供接口,支持应用功能方便调用。

      (2)管理模块方式:默认提供一套日志查询管理功能,方便于应用直接集成使用。

    四、总结

      日志采集本身也是一个分布式系统,服务端每个节点都支持分布式集群部署,可实现高并发、高可用性。本文只是一种抛砖引玉,系统每个组件还需要深化详细,同时也包括实施部署。

    .Net微服务架构之运行日志分析系统

     

    一、引言

      .Net技术栈目前还没有像spring cloud相对完整一整微服务架构栈,随着业务发展系统架构演进,自行构建.Net技术体系的微服务架构,配套相关核心组件。因平台基于微服务架构方式研发,每个领域服务遵循平台统一标准,各自研发,独立部署运行,服务运行日志均通过记录本地文件方式进行记录。程序日志无法及时查阅,需登录服务器查看,同时不利于日志统一管理,因研发运行日志分析系统,进行日志统一分析管理,便于快速定位程序运行问题及时处理,保障平台运行稳定。虽然行业上也有一些日志架构,如较为有名的LEK(logstash, elasticsearch, kibana),因考虑到后续一些个性化的需求,还是自行研发运行日志分析系统。

    二、设计原则

      系统在总体微服务架构设计思想下,遵守平台标准,并结合实际解决问题的需要,进行设计和研发,系统严格按照如下设计原则设计:

      1、模块化:根据职责和归属明确,进行拆分模块,模块功能高度内聚。

      2、服务化:各模块通信,通过服务方式进行调用,服务之间通信,遵守平台的标准。

      3、松耦合:系统模块之间通信,基于行业通用标准,按照“约定优于配置”思想,充分体现系统模块之间松耦合的关系。

      4、高性能:采用异步的方式进行记录日志和分析,不影响平台总体性能。

      5、易扩展:日志采用统一的接入方式,支持灵活扩展。

      6、跨平台:支持不同技术语言、平台进行采集日志。

    三、总体架构

    图- 运行日志分析系统总体架构示意图


      如图所示,系统基于上述设计原则,主要由五部分组成:日志记录、日志采集、日志接入、日志分析及存储、日志管理服务。每部分职责定位明确,相互支持、相互协作,共同构成运行日志分析系统。日志记录到本地文件,通过日志采集器将本地日志文件抽取后,发送至Kafka,同时由日志分析服务进行消费、分析及存储于elasticsearch,日志管理服务提供于用户查阅&分析日志信息。在平台统一通信协议下,扩展运行日志的内容,沿用Json报文格式,记录内容包括:IP、端口、服务ID、记录时间、日志内容。

    1、日志报文

      

    2、日志记录

      日子记录,支持多种日志记录组件:Log4.net(本系统选用)、.Net core 自带的Nlog、微软企业库等,针对JAVA技术语言开发的服务,则选用log4j组件,只要按照约定规范进行打印日志即可。将日志信息记录到本地文件。

    3、日志采集

      日志采集,选用filebeat组件,filebeat是一个轻量级的日志传输组件,其可以通过提供一种轻量级的方式来转发和集中日志和文件,帮助你把简单采集和发送的事情简单化。本质上filebeat是一个日志信息搬运工,不进行日志过滤和分析工作。同时支持跨平台。

    4、日志接入

      日志接入,考虑日志量在某一故障情况,可能存在较大并发接入,所以选用Kafka组件作为日志信息接入分析的统一入口,kafka组件是一个高性能的MQ组件,具有高并发、高可用的特性。统一接入方案,为系统提供更为灵活的采集日志,不受限于某一平台、技术或者日志采集组件,均可将运行日志进行接入分析和存储。

    5、日志分析及储存

      日志分析,采用.Net Core研发,以后台服务的方式进行运行,订阅kafka的日志消息进行批量消费,分析程序支持横向扩展部署于多个程序,提升日志的消费能力,保障日志接收能力和分析能力相当。对日志分析后存储于Elasticsearch(以下简称:ES),ES是一个高可扩展的开源全文搜索和分析引擎,它允许存储、搜索和分析大量的数据。非常适合存储半结构化的日志数据,便于全文搜索日志信息。

    6、日志管理服务

       日志管理服务,实现查询ES中的运行日志数据,通过WebAPI方式提供界面功能调用。本系统采用“前后分离”应用开发技术,前端界面功能采用H5+JS,后端服务以restful方式提供API接口。


    四、总结

       根据不同应用场景和需求,选用不同的日志分析架构或者自行研发,最终目的就是为了快速、方便捕捉系统日志,有助于分析系统运行情况。尤其对于微服务架构大型平台,运行日志更为重要。本文主要是将系统设计原则、思想进行记录,同时对有需要的同学提供参考,可能再实际应用中,还有很多地方需要完善或者优化。

    作者:刘蔡涛
    出处:http://www.cnblogs.com/Andon_liu 
    关于作者:专注于微软平台项目架构、管理。熟悉设计模式、领域驱动、架构设计、敏捷开发和项目管理。现主要从事ASP.NET MVC、WCF/Web API、SOA、MSSQL、redis方面的项目开发、架构、管理工作。 如有问题或建议,请一起学习讨论! 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。 
    如有问题,可以邮件:568773262@qq.com 联系我,谢谢。
  • 相关阅读:
    SpringBoot整合ActiveMQ同时支持P2P和发布订阅模式(三)
    SpringBoot整合ActiveMQ的publish/subscribe发布订阅模式(二)
    Windows启动ActiveMQ报Wrapper Stopped错误
    IDEA从远程仓库克隆项目
    Git的安装
    IDEA上传项目到使用github上
    Mybaits的逆向工程
    posman测试接口需要登录验证的使用
    SSM整合SpringSecurity
    SpringBoot整合MongoDB的连接用户名和密码问题
  • 原文地址:https://www.cnblogs.com/jiyang2008/p/12787656.html
Copyright © 2020-2023  润新知