一种基于开源组件的微服务架构

文档序号:25444470发布日期:2021-06-15 09:10阅读:135来源:国知局
一种基于开源组件的微服务架构

本文涉及一种分布式微服务架构方法,具体来说,涉及一种基于nacos,springcloud,kubernetes,elk(elasticsearch+logstash+kibana)等组件的构建方法。



背景技术:

早期的系统大多都是单体应用,这种系统的优点是便于开发、测试和部署,但是也有很大的缺点。

第一,单体应用随着开发迭代,会越来越庞大,代码复杂度高,部署耗时长;

第二,一个小功能的崩溃会导致整个应用的崩溃;

第三,不同模块之间无法拆分;

第四,团队成员必须使用同一种技术栈等等。

使用微服务可以方便的拆分不同的模块,每个应用单独开发部署,使研发可以高效的进行。

每个应用还可以很方便的进行扩展,可以有效的应对高并发的场景。

某个服务的崩溃不会影响其他的服务正常运行。

现在主流的微服务都是使用的springcloud全套组件。



技术实现要素:

本发明设计了一种全新的微服务架构。

技术方案为:

一种基于开源组件的微服务架构,其特征在于,包括网关层、应用层、存储层、基础设施层,其中:

网关层面包括nginx反向代理集群;使用nginx进行反向代理和负载均衡,用户请求的域名通过dns轮询解析到不同的nginx服务器集群,然后再由nginx转发到系统内部应用。作为优选,实施例还可以将nginx作为静态服务器,将js,html,image等静态文件存储在上面。

网关层面包括springcloudgateway应用网关集群;本发明将api网关层面使用springcloudgateway,作为内部服务应用的入口。作为优选,实施例中gateway还可以用来进行网关鉴权、权限控制、限流控制、性能监控等等。

应用层面包括nacos注册中心配置中心集群;使用nacos作为注册中心,所有的服务实例在启动时都会注册到nacos上,服务消费者通过注册中心查询服务提供者的地址,使得两者解耦,过注册中心的动态监控,提高服务治理能力。应用层面使用nacos作为配置中心,集中管理所有服务的配置文件,使得服务的发布和配置的修改相互解耦,无需重新部署应用即可使相应配置信息生效,极大增强系统的运维能力。

应用层面包括openfeign服务调用组件;使用openfeign来统一管理所有的远程调用,相比传统使用ribbon+resttemplate,openfeign的封装性更好,让微服务之间的调用更加简单。

应用层面包括springsession分布式会话共享框架;使用springsession实现会话共享,在分布式系统中,用户的每次请求都可能分配到不后台服务器,session不能再交由具体的tomcat容器管理。使用springsession可以很方便的管理session信息,将信息储存到redis中,可以简单快速的实现分布式会话共享。

应用层面包括sentinel服务降级框架;使用sentinel服务熔断降级框架,在服务调用链路出现不稳定的时候,对某个异常的资源调用进行限制,让请求快速失败,避免影响到其他正常的服务。

存储层面包括mysql数据库集群;使用mysql作为后台数据库,mysql相比大型数据库,其成本低、开源、速度较快、历史悠久、社区用户活跃,可以持续使用不用担心其稳定性。

存储层面包括redis数据库集群;使用redis存储会话信息和缓存热数据。redis数据库运行在内存中,速度快,可以作为mysql数据库的缓存,分担mysql数据库的压力。

存储层面包括elasticsearch集群;使用elk(elasticsearch+logstash+kibana)+filebeat实现日志搜集、分析、监控。在大型的分布式系统中,每个用户的日志信息会分散到不同的机器,如果我们手动进到每个服务器去查询日志会很繁琐。想要对海量的日志数据进行归档、搜索、多维度分析、监控。建立一个集中式的日志系统可以有效的解决这个问题,使用filebeat在各个服务器中搜集日志,使用logtash+kafka进行日志传输和过滤,使用elasticsearch进行日志的存储。使用kibana展示web页面,可以对日志进行高效的搜索、可视化、分析等操作。

基础设施层面包括gitlab代码托管工具;github作为开源代码库,同时提供公共仓库和私有仓库,但如果使用私有仓库,是需要付费的。实施例使用gitlab解决了这个问题,可以在私人服务器中创建免费仓库。从代码的私有性上来看,gitlab是一个更好的选择。

基础设施层面包括docker容器;使用docker作为所有应用的容器,使得应用的打包和发布更加的简单快速。docker容器可以在任意的平台上运行,使得迁移更加的容易。docker容器具有兼容性和轻量性,可以让我们进行快速的扩容。

基础设施层面包括kubernetes容器编排引擎;使用kubernetes进行容器编排,kubernetes天生高可用,具有负载均衡、自动扩容缩容和全自动容灾机制等功能。引入kubernetes后,代码的发布、回滚变的非常简单。遇到集群中的某个宿主机宕机时,不需要人工去处理,kubernetes可以自动处理。

基础设施层面包括jenkins持续集成框架;使用jenkins进行自动化部署,在一个大型的项目中,所有的应用都要打包成docker镜像部署到宿主机中,如果人工操作将非常繁琐且容易出错。使用jenkins可以很方便的自动打包、部署、启动,在项目的迭代过程中也交由jenkins处理,极大提高运维能力。

本发明技术方案中:

网关层面采用nginx,springcloudgateway集群,作为服务的入口。应用层面采用nacos作为注册中心和配置中心,springsession实现会话共享,openfeign框架实现远程调用,sentinel框架实现服务熔断降级,filebeat实现日志搜集,kafka作为日志消息队列,logstash实现日志过滤,kibana实现日志可视化。存储层面采用mysql数据库进行数据持久化,redis存储会话信息和缓存热数据,elasticsearch进行日志存储。基础设施层采用gitlab进行代码托管,kubernetes、docker容器、jenkins进行应用部署。

用户网页中的请求数据先通过网关层面的nginx集群,转发到网关层面的gateway集群,gateway通过应用层面的注册中心nacos查询到具体的ip地址后,转发到应用层面的一个具体应用。这个应用查询存储层面的mysql数据库后将信息返回给用户。

附图说明

为了更清楚地说明本发明实例中的技术方案,下面将对实施例描述中所需要用的附图作简单的介绍。

图1为本发明的系统架构图。

图2为本发明的日志系统架构图。

图3为本发明的部署流程图。

具体实施方式

如图1所示,实施例基于开源组件的微服务架构,包括网关层、应用层、存储层、基础设施层,其中:

网关层面采用nginx,springcloudgateway集群,作为服务的入口。应用层面采用nacos作为注册中心和配置中心,springsession实现会话共享,openfeign框架实现远程调用,sentinel框架实现服务熔断降级,filebeat实现日志搜集,kafka作为日志消息队列,logstash实现日志过滤,kibana实现日志可视化。存储层面采用mysql数据库进行数据持久化,redis存储会话信息和缓存热数据,elasticsearch进行日志存储。基础设施层采用gitlab进行代码托管,kubernetes、docker容器、jenkins进行应用部署。

作为实施例具体说明:

网关层面至少配置两台nginx,一台提供服务,一台冗余,这两台分配相同的虚拟ip。使用keepalived进行状态监测,当正在提供服务的nginx宕机时,将流量自动迁移到冗余的nginx上。当流量增大需要更多的nginx集群时,使用dns轮询将流量分配到不同的nginx上。

网关层面至少配置两台springcloudgateway保证高可用,接收到nginx的请求后,根据服务名在注册中心nacos中查找到具体的ip,通过ribbon负载均衡的分发到后台应用中。

应用层面至少配置两台nacos保证高可用。作为注册中心,登记所有应用的ip信息,并实时进行心跳检测,当某个应用宕机时,自动实现流量转移。作为配置中心,集中管理所有应用的配置文件,每个应用不在单独集成配置文件,通过请求配置中心来动态获取配置。

应用层面在所有的应用中单独封装多个接口,使用openfeign来统一管理所有的远程调用,封装性更好。不再每次调用时自己实现resttemplate,造成繁琐且重复性高。

应用层面在有状态的前端应用中,使用springsession框架自动的管理session信息,将session信息存储到redis数据库中,不再由tomcat等容器管理会话信息。

应用层面在请求频繁可能发生崩溃的远程调用涉及到的应用中,引入sentinel框架进行熔断或降级,避免影响到上游的调用链。

存储层面至少配置两台redis,使用主从复制和哨兵机制实现高可用。redis中不仅可以存储session数据,还可以缓存请求比较频繁的业务数据。当数据量增大时,至少配置三主三从集群保证某个master节点宕机之后选举成功,此时使用一致性hash算法使得扩容对整个分布式缓存集群影响最小。

存储层面至少配置4台mysql,使用“主从同步,读写分离”实现数据库层的高可用。2台写库一个提供服务,一个冗余,采用keepalived探测,使用相同的虚拟ip。2台读库均衡的承担所有的读请求,当某台故障时,数据库连接池可以探测到,自动进行流量转移。

如图2所示,基础设施层面在所有会产生日志的应用,打包成docker容器时,先安装好filebeat和logtash,使用filebeat收集日志,logtash传输日志,kafka作为传输消息队列,logtash过滤日志,存储到elasticsearch中,最后展示到kibana的web页面。至少配置3台kafka,3台elasticsearch,2台kibana保证高可用。

如图3所示部署流程,基础设施层面所有的应用开发完成之后先提交到代码仓库gitlab,然后通过jenkins打包成docker镜像,推送到远程镜像仓库中去,kubernetes拉取远程镜像仓库中的镜像,然后启动服务。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1