搭建一个大型平台需要综合考虑很多方面,不单纯是软件架构,还包括网络和硬件设备等。由于现代大部分应用建设都面临用户多、高并发、高可用的需求,传统软件架构已不能满足需求,需要支持分布式软件架构,能支持横向扩展,具有高可用、伸缩性、稳定性等特点。搭建如下系统架构。
二、系统软件结构
系统软件结构示意图
系统基于SOA架构设计,系统整体划分为不同组件或者应用服务,支持分布式的部署及扩展,并通过Nginx组件实现负载均衡。根据逻辑关联划分为:表现层、应用层和数据层。表现层负责系统与用户或者外部系统交互;应用层是服务于表现层,主要实现业务逻辑处理满足表现层的需求;数据层是负责系统数据的存储。
2.1、表现层
2.2、应用层
主要负责系统逻辑计算的实现,提供服务接口给展现层使用。此两层之间通信基于系统内部局域网tcp/ip协议,为了提高数据传输效率。根据应用服务职责不同,将分两大类,分别为业务应用服务和基础应用服务。业务应用服务实现业务需求的功能服务,比如用户
订单、某类商品的管理功能等。基础应用服务实现系统基础公用的功能服务,比如:日志服务、缓存服务、用户认证服务功能等。本系统应用服务一般使用.NET平台的通信框架WCF技术实现,个别其他组件除外,比如MQ组件、Redis缓存组件。
2.3、数据层
主要负责系统数据存储、同步、缓存和备份管理。本系统数据分为结构化数据和非结构化数据。对于结构化数据使用MSSQL2008以上数据库存储,基于MSSQL复制同步的机制,可以进行数据读写分离的实现,提升数据层面的优化。对于本系统业务日志数据的存
储选型,由于考虑到业务日志数据结构多样化、数据量较大,所以选用MongoDB的NoSQL技术,同时系统面对着高并发的访问,采取了缓存的机制提升性能,选用Redis缓存组件实现数据缓存存储。对于非结构化数据存储,比如文档、图片等数据,本系统基于
Windows平台NTFS文件系统实现文档存储和读写功能。
三、系统物理结构
系统物理结构示意图
为负载均衡服务器、Web服务器、应用服务器、数据服务器四大类。
(1)负载均衡服务器
基于Linux之CentOS平台搭建Nginx服务,作LoadBalance。
(2)Web服务器
基于window平台下IISweb服务器。部署基于asp.netmvc、webapi技术实现的程序。
(3)应用服务器
部署基于.net平台通信框架之WCF技术实现的服务接口,提供与展现层调用,其中部分公用组件,如MQ则根据组件的要求部署。
(4)数据服务器
本系统数据存储选用:mssql数据库、MongoDB、Redis缓存和文件存储。根据项目情况数据库可做读写分离,同时结合redis做缓存策略提高系统性能。
本章节先大致介绍系统框架及物理结构情况,由于涉及几个技术点,比如:nginx负载均衡搭建、asp.netmvc与WCF服务之间调用、redis分布式缓存使用、MongoDB存储日志、MQ异步传输日志数据、文件服务实现。后续逐步介绍。
3.1.1、关于CentOS系统介绍
CentOS(CommunityEnterpriseOperatingSystem,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于RedHatEnterpriseLinux依照开放源代码规定释出的源代码所编译而成。基于RedHat持续升级,和对已知BUG修复,所以CentOS更多
用于搭建大型企业级服务器。目前较新版本为7.0,本文使用CentOS764bit进行搭建系统负载均衡。
3.1.2、安装VMWare
VMWare(VirtualMachineware)是一个“虚拟PC”软件公司.它的产品可以使你在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,VMWare采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时
3.1.3、安装CentOS系统
注意事项:
1、分区的时候,选择EXT4格式,boot分区为400m,/分区为8G,/home分区为7G,var分区为6G,swap分区为2G
2、用户和组ID,都设为1000
3、安装完成重启后提示License的,输入:1、2、r、yes完成进入成功进入系统
4、ctrlalt鼠标切回本机电脑,不在虚拟机里
3.1.4、安装Nginx和配置
1、Nginx介绍
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。由俄罗斯的工程师IgorSysoev研发,供俄国大型的入口网站Rambler使用。其特点是占有内存少,并发能力强,事实上nginx的并
发能力确实在同类型的网页服务器中表现较好。
2、安装部署
(1)添加Nginx仓储,添加epelrepository
sudoyuminstallepel-release(2)检查是否已安装过nginx
find-namenginx(3)如果有安装则删除
yumremovenginx(4)安装nginx
sudoyuminstallnginx(5)启动nginx
sudosystemctlstartnginxsudosystemctlenablenginx#可用(6)将nginx设置为启动系统自动启动nginx
echo'/usr/local/nginx/sbin/nginx'>>/etc/rc.local(7)查看本机IP,为了后续配置nginx.conf所用
ifconfig(8)修改nginx.conf配置文件
cd/etc/nginx/#定位到nginx安装目录vimnginx.conf#通过vim打开nginx.conf配置文件进行配置(9)主要配置节点,192.168.119.1:8081和192.168.119.1:8082分别部署在IIS7的两个ASP.NETMVC开发的站点(在另一台电脑),设计软件架构解决方案后续介绍。
servicenginxrestart以上记录在CentOS7操作系统搭建Nginx负载均衡解决方案记录。后续简介通过Keepalived搭建Nginx负载高可用解决方案。
3.2.1、Web应用开发
1、asp.netmvc5开发
1publicActionResultIndex()2{3if(this.HttpContext.Session['mysession']==null)4{5this.HttpContext.Session['mysession']=DateTime.Now.ToString('yyyy-MM-ddhh:mm:ss');6}78this.HttpContext.Response.Cookies.Add(newHttpCookie('mycookies')9{10Expires=DateTime.Now.AddDays(1),11Value=HttpContext.Server.MachineName'||'DateTime.Now.ToString()12});13returnView();14}ViewCode(2)在Controller中新增第二个方法GetSession,显示Session和Cookies的值。
1publicActionResultGetSession()2{3if(this.HttpContext.Session['mysession']!=null)4{5ViewBag.DD=this.HttpContext.Session['mysession'].ToString();6ViewBag.SCode=this.HttpContext.Session['mysession'].GetHashCode().ToString();7ViewBag.SID=this.HttpContext.Session.SessionID;8}910ViewBag.CVAL=System.Web.HttpContext.Current.Request.Cookies['mycookies'].Value;11ViewBag.CID=System.Web.HttpContext.Current.Request.Cookies['mycookies'].Name;12ViewBag.CDO=System.Web.HttpContext.Current.Request.Cookies['mycookies'].Domain;13returnView();14}ViewCode(3)将session和cookies信息在页面显示,GetSession视图代码如下:
1@{2ViewBag.Title='GetSession';3}45
站点:A--GetSession
6站点:A78SessionValue:@ViewBag.DD9
10
11SessionSCode:@ViewBag.SCode12
13
14SessionID:@ViewBag.SID15
16
17CookiesID:@ViewBag.CID18
19
20CookiesValues:@ViewBag.CVAL21
22
23CookiesValues:@ViewBag.CDOViewCode以上实现session和cookies读写,为了验证负载均衡下,每次请求处理是否保持一致,接下来重要内容,做负载均衡如何如何保持session一致,对于asp.net技术session原理此处不做介绍,网上搜索下大把。
2、Session共享技术
(1)InProc模式
session存储于当前站点在同一个进程内,修改web.config或者bin中文件更新,会导致session丢失。此模式为默认模式。
(2)aspnetstate模式
aspnetstate是将session存储在状态服务中,需要启动ASP.NETStateService,能看到进程aspnet_state.exe。还需要在web.config配置此模式。
(3)SQLServer模式
(4)第三方扩展模式
本框架采用此模式,将session存储到其他存储,比如:Memcached、redis缓存中,达到共享session的目的。可以通过实现ASP.NET中的SessionStateStoreProviderBase这个抽象类扩展。本系统采用将session存储在redis缓存中,通过引入
RedisSessionStateProvider组件。
Install-PackageMicrosoft.Web.RedisSessionStateProvider3、Nginx服务状态情况在centos终端输入命令servicenginxstatus查看情况,确保服务正常运行。4、Web站点部署部署两个站点分别为:
站点A:端口为8081,
站点B:端口为8082,
二、功能效果展现
直接开启两个URL链接,确认两个网页的获取到的session和cookies都是一致。
上一篇写了nginx负载均衡,此篇实现高可用(HA)。系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常运行。针对系统架构设计的高可用要求,我们需要解决Nginx负载均衡出现单机故障时,系统正常运行的需求。所以系统架构引入Keepalived组件,实现系统高可用。
一、Keepalived介绍
Keepalived是分布式部署系统解决系统高可用的软件,结合LVS(LinuxVirtualServer)使用,其功能类似于heartbeat,解决单机宕机的问题。
二、Keepalived技术原理
keepalived是以VRRP协议为实现基础的,VRRP全称VirtualRouterRedundancyProtocol,即虚拟路由冗余协议。通过VRRP协议结合LVS,对组群服务器监控情况,若master出现宕机情况,则将VIP漂移到backup机上。实现了分布式系统高可用。可以理解
为:keepalived是LVS的管理软件,根据监控情况,将宕机服务器从ipvsadm移除掉。
三、KeepalivedLVSNginx实现系统高可用
消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景。本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理;二是通过消息队列传输系统日志。目前业界使用较多的消息队列组件有
RabbitMQ、ActiveMQ、MSMQ、kafka、zeroMQ等,本文对系统架构之MQComponent诠释,并采用RabbitMQ作为消息队列中间件。
一、RabbitMQ介绍
RabbitMQ是一款基于AMQP(消息队列协议),由Erlang开发的开源消息队列组件。是一款优秀的消息队列组件,他由两部分组成:服务端和客户端,客户端支持多种语言的驱动,如:.Net、JAVA、Erlang等。RabbitMQ与其他消息队列组件性能比较,在此
不作介绍,网上有大把的资料。
二、RabbitMQ原理简介
RabbitMQ中间件分为服务端(RabbitMQServer)和客户端(RabbitMQClient),服务端可以理解为是一个消息的代理消费者,客户端又分为消息生产者(Producer)和消息消费者(Consumer)。
1、消息生产者(Producer):主要生产消息并将消息基于TCP协议,通过建立Connection和Channel,将消息传输给RabbitMQServer,对于Producer而言基本就完成了工作。
2、服务端(RabbitMQServer):主要负责处理消息路由、分发、入队列、缓存和出列。主要由三部分组成:Exchange、RoutingKey、Queue。
(1)Exchange:用于接收消息生产者发送的消息,有三种类型的exchange:direct,fanout,topic,不同类型实现了不同的路由算法;
A.directexchange:将与routingkey比配的消息,直接推入相对应的队列,创建队列时,默认就创建同名的routingkey。
B.fanoutexchange:是一种广播模式,忽略routingkey的规则。
C.topicexchange:应用主题,根据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通道通信减少开销和提高性能。
三、RabbitMQ应用
本章节描述,web应用生产的日志,通过rabbitmq传输,然后日志服务接收消息队列的消息。
具体乐意产考网络,此处略过。
本文介绍系统缓存组件,采用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集群应用
(一)环境介绍
本系统基于Linux之CentOS搭建Redis3.0集群。将三个Instance部署于一台虚拟机,应用部署于windows平台。
(二)安装Redis
(三)配置Redis集群
一、背景&问题
之前框架是一个基于SOA思想设计的分布式框架。各应用通过服务方式提供使用,服务之间通信是RPC方式调用,具体实现基于.NET的WCF通信平台。框架存在如下2个问题:
1、高并发处理能力不足。一旦高并发请求,可能出现多个服务待定处理,导致整个系统出现瓶颈。
2、随着移动端广泛应用,服务不能灵活支持APP应用。
3、系统持续集成部署过于繁琐,遇到问题不好定位。
基于以上存在问题升级框架,结合当前主流的架构思想,将系统进行服务化思维,就是“微服务架构”。
二、微服务架构
微服务架构(MicroservicesArchitecture)是将系统拆分为多个服务,俗称为应用服务。应用服务实现单一、具体的业务应用功能,支持独立部署维护,多个应用服务构建成系统。应用服务之间通过轻量级通信框架进行,并且支持应用服务用不同技术或者平台实
现。微服务架构是SOA架构设计思想另一种实现方式。微服务架构有如下特点:
1、微服务架构好处
(1)横向扩展应用服务提升系统并发处理能力
(2)应用服务独立部署维护,有利于迭代开发升级持续部署
(3)架构灵活支持多种技术实现
(4)有利于应用服务实现高可用性
2、微服务架构不足
(1)对系统设计有一定要求,尤其是拆分技术应用服务接口
(2)导致系统实现复杂度的提高
(3)需要确保系统数据一致性机制
(4)导致系统维护要求和成本提高
系统是否需要采用微服务架构进行构建是由项目需求决定。采用微服务架构进行设计构建系统,对团队成员能力比传统要求高,尤其是设计能力。
三、框架设计原则
1、可扩展:支持不修改系统功能,按需扩展服务器资源。
2、高可用:支持分布式部署双机热备机制,满足系统高可用性的要求。
3、高并发:支持快捷扩张应用服务处理能力,提升系统处理能力,满足并发请求。
4、安全性:访问安全通过统一认证访问;信息安全通过加解密、签名传输;网络安全通过网络隔离及防火墙;数据安全通过定时备份及高容错能力。
5、一致性:采用数据最终一致性策略。
四、框架总体设计
如图所示,系统架构基于SOA架构设计思想,并且采用微服务架构方式进行设计和构建。将系统呈现和数据进行分离。系统呈现基于网页进行实现,支持多种前端UI框架整合及自定义开发;数据由应用服务提供,统一通过“网关API”提供使用。架构支持通过网络层、应用层的负载均衡中间件等,实现高可用和并发处理能力。架构将一些基础公共功能抽离构建成中间件。
2、消息平台:负责应用服务之间更新同步信息,将原有系统架构分布式事务调用更新信息的方式,调整为通过消息异步发布/订阅处理,保证数据最终一致性,应用服务之间降低耦合度和强依赖关系。高并发能力下,取得缓存作用。
3、服务注册监控中心:负责应用服务注册发布登记,同时监控应用服务接口运行情况,支持动态控制应用服务接收请求,实现“去中心化”服务控制。组件实现服务注册登记、监控等功能。
4、认证中心:负责架构访问统一身份认证。通过用户口令和权限进行控制访问。结合“网关API”实现安全访问、限流等功能,同时实现页面管理功能。
5、日志管理系统:负责记录系统日志,提供服务接口和组件,业务代码通过异步方式将日志信息传输到“消息平台”,日志管理系统订阅“消息平台”的日志信息进行处理存储。同时提供日志管理功能
6、缓存中心:基于Redis分布式内存数据库,搭建架构统一缓存中心,提供统一缓存服务。
五、软件架构设计
如图所示,系统架构以微服务架构方式进行开发,从切面观察每个应用服务进行垂直独立开发,根据职责划分层次,从上而下分为四个层次,分别为Web层、服务接口层、业务逻辑层及数据访问层。Web层主要负责系统功能呈现表达,直接面对用户;服务接口层
主要负责提供标准化服务接口,与呈现层对接;业务逻辑层主要实现应用业务逻辑,是应用服务核心部分;数据访问层负责数据持久化,支持业务逻辑层。各层次之间通过接口进行隔离,有利于后续维护扩展,减低依赖和影响。
应用服务完成开发后进行集成部署。Web层将根据约定集成到Web应用容器,其余层次构建为应用服务进行部署,并将服务接口进行注册登记发布使用。
六、结语
基础架构大致设计就这样,还需要考虑实施部署,可以考虑云平台弹性资源,再结合docker容器技术。
一、引言
随着互联网的快速发展,当前以步入移动互联、物联网时代。用户访问系统入口也变得多种方式,由原来单一的PC客户端,变化到PC客户端、各种浏览器、手机移动端及智能终端等。同时系统之间大部分都不是单独运行,经常会涉及与其他系统对接、共享数据的需求。所以系统需要升级框架满足日新月异需求变化,支持业务发展,并将框架升级为微服务架构。“API网关”核心组件是架构用于满足此些需求。
很多互联网平台已基于网关的设计思路,构建自身平台的API网关,国内主要有京东、携程、唯品会等,国外主要有Netflix、Amazon等。
1、基于nginx平台实现的网关有:KONG、APIUmbrella
2、自研发的网关有:apigee、Zuul
三、API网关设计
API网关是微服务架构(MicroservicesArchitecture)标准化服务的模式。API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理则是一样。API网关统一服务入口,可方便实现对平台众多服务接口进行管控,对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或者计费等等。组件设计如下:
1、黑白名单:实现通过IP地址控制禁止访问网关功能,此功能是应用层面控制实现,再往前也可以通过网络传输方面进行控制访问。
2、日志:实现访问日志的记录,可用于分析访问、处理性能指标,同时将分析结果支持其他模块功能应用。
3、协议适配:实现通信协议校验、适配转换的功能。
4、身份认证:负责网关访问身份认证验证,此模块与“访问认证中心”通信,实际认证业务逻辑交移“访问认证中心”处理。
5、计流限流:实现微服务访问流量计算,基于流量计算分析进行限流,可以定义多种限流规则。
6、路由:路由是API网关很核心的模块功能,此模块实现根据请求,锁定目标微服务并将请求进行转发。此模块需要与“服务发布管理中心”通信。“服务发布管理中心”实现微服务发布注册管理功能,与其通信获得目标微服务信息。
四、API网关部署
API网关是一个公共基础组件,无状态,可支持多套分布式部署。如下图所示:
五、API网关实现技术
1、技术:框架整体基于.NET平台构建,所以API网关也暂定基于.NET4.6平台和ASP.NETWebAPI2.0框架实现。具体软件架构就用上一篇所介绍的。
2、性能:部署于IIS7.0,1000个并发查询请求,平均响应90ms。
可能在IIS7.0和.Net4.6平台,在大并发性能处理上会更不上,后续将考虑基于.netcore进行升级开发,并部署于Linux平台。
API网关主要原理是相通,不同平台结合本身平台整体框架设计,可选用不同的技术实现,目前有些基于SpringMVC、node.js、Erlang技术进行研发。
日志对大型应用系统或者平台尤其重要,系统日志采集、分析是系统运维、维护及用户分析的基础。
一、系统日志分类
一般系统日志可分为三大类:
1、用户行为日志:通过采集系统用户使用系统过程中,一系列的操作日志。
2、业务变更日志:特定业务场景需要,采集某用户在某时使用某功能,对某业务(对象、数据)进行某操作,由A变成B。
3、系统运行日志:系统运行服务器资源、网络及基础中间件的情况进行定时采集日志分析。
二、常见日志分析应用场景
日志采集分析是由需求驱动,根据某种场景的需要日志采集,采集的日志进行针对性的分析。一般常见的日志分析结果应用场景有:
1、分析系统或者平台哪些功能是最受欢迎:什么时候使用最多用户使用,某个区域、某类用户使用最多。有利于功能推广;有利于提升服务器资源从而提高用户体验。
4、自动化运维:场景微服务架构的系统或者平台,对运维投入的要求高,自动化部署和运维,可以减少运维的工作量和压力。系统运行环境日志采集、分析,可实现预警、服务器资源动态调配,有利于快速定位排查故障。
不同系统的运行环境、功能应用场景及需要采集分析日志的需求也各不相同。日志内容、采集方式存在多样性,日志数据量大,所以需要设计一套日志采集系统,满足日志采集需求,支持便捷将分析结果反捕于应用功能。
三、日志采集系统总体设计
基于以上日志采集的初步分析,尤其微服务架构中,微服务治理能力、服务负载需要依赖服务日志的采集分析,所以日志采集子系统是微服务架构的基础支持功能。日志采集系统总体设计如下:
如上图所示,根据日志整个过程,系统由三部分组成:日志采集、日志存储&分析及结果应用。日志采集主要负责提供多种方式进行采集日志;日志存储&分析主要实现分析统一存储和定制的场景分析日志;结果应用实现将日志分析结果提供服务接口或者默认的管理功能,供应用功能使用。
日志采集整体过程:日志采集后,通过在线或者离线传输到消息队列,由日志消费应用拉取后进行存储。根据分析需要定制自动作业任务实现日志数据抽取、转换、统计后,将结果数据写入关系型数据库。提供服务接口或者日志查询默认管理功能进行使用。
1、日志采集
日志采集实现三种方式进行采集日志:
(2)ServiceProxy方式:基于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、分析结果应用
分析结果应用主要提供服务接口和管理功能两种方式。
(2)管理模块方式:默认提供一套日志查询管理功能,方便于应用直接集成使用。
四、总结
日志采集本身也是一个分布式系统,服务端每个节点都支持分布式集群部署,可实现高并发、高可用性。本文只是一种抛砖引玉,系统每个组件还需要深化详细,同时也包括实施部署。
二、设计原则
系统在总体微服务架构设计思想下,遵守平台标准,并结合实际解决问题的需要,进行设计和研发,系统严格按照如下设计原则设计:
1、模块化:根据职责和归属明确,进行拆分模块,模块功能高度内聚。
2、服务化:各模块通信,通过服务方式进行调用,服务之间通信,遵守平台的标准。
3、松耦合:系统模块之间通信,基于行业通用标准,按照“约定优于配置”思想,充分体现系统模块之间松耦合的关系。
4、高性能:采用异步的方式进行记录日志和分析,不影响平台总体性能。
5、易扩展:日志采用统一的接入方式,支持灵活扩展。
6、跨平台:支持不同技术语言、平台进行采集日志。
三、总体架构
1、日志报文
2、日志记录
日子记录,支持多种日志记录组件:Log4.net(本系统选用)、.Netcore自带的Nlog、微软企业库等,针对JAVA技术语言开发的服务,则选用log4j组件,只要按照约定规范进行打印日志即可。将日志信息记录到本地文件。
3、日志采集
日志采集,选用filebeat组件,filebeat是一个轻量级的日志传输组件,其可以通过提供一种轻量级的方式来转发和集中日志和文件,帮助你把简单采集和发送的事情简单化。本质上filebeat是一个日志信息搬运工,不进行日志过滤和分析工作。同时支持跨平台。
4、日志接入
日志接入,考虑日志量在某一故障情况,可能存在较大并发接入,所以选用Kafka组件作为日志信息接入分析的统一入口,kafka组件是一个高性能的MQ组件,具有高并发、高可用的特性。统一接入方案,为系统提供更为灵活的采集日志,不受限于某一平台、技术或者日志采集组件,均可将运行日志进行接入分析和存储。
5、日志分析及储存
日志分析,采用.NetCore研发,以后台服务的方式进行运行,订阅kafka的日志消息进行批量消费,分析程序支持横向扩展部署于多个程序,提升日志的消费能力,保障日志接收能力和分析能力相当。对日志分析后存储于Elasticsearch(以下简称:ES),ES是一个高可扩展的开源全文搜索和分析引擎,它允许存储、搜索和分析大量的数据。非常适合存储半结构化的日志数据,便于全文搜索日志信息。
6、日志管理服务
日志管理服务,实现查询ES中的运行日志数据,通过WebAPI方式提供界面功能调用。本系统采用“前后分离”应用开发技术,前端界面功能采用H5JS,后端服务以restful方式提供API接口。
根据不同应用场景和需求,选用不同的日志分析架构或者自行研发,最终目的就是为了快速、方便捕捉系统日志,有助于分析系统运行情况。尤其对于微服务架构大型平台,运行日志更为重要。本文主要是将系统设计原则、思想进行记录,同时对有需要的同学提供参考,可能再实际应用中,还有很多地方需要完善或者优化。