【微服务】一张图搞懂微服务架构设计

news/2024/11/18 9:01:49/文章来源:https://www.cnblogs.com/datacenter/p/18435778

1.前言

当前,微服务架构在很多公司都已经落地实施了,下面用一张图简要概述下微服务架构设计中常用组件。不能说已经使用微服务好几年了,结果对微服务架构没有一个整体的认知,一个只懂搬砖的程序员不是一个好码农!

 

 

2.流量入口 Nginx

在上图中可以看到,Nginx 作为整个架构的流量入口,可以理解为一个外部的网关,它承担着请求的 路由转发、负载均衡、动静分离 等功能。作为一个核心入口点,Nginx 肯定要采用多节点部署,同时通过 keepalived 来实现高可用,从而保障整个平台的高可用。

3.网关

网关是在 Nginx 后的另外一个核心组件。它承担着 请求鉴权,路由转发,协议转换,流量监控 等一系列功能,上图中网关是采用 Spring Cloud Gateway 来实现业务网关的功能,在网关选型中,我们还有其他的选择,比如 Zuul1、Zuul2、Kong 等等,这些方案都有自己的优势和局限性,我们可以根据他们的特点来抉择到底选用哪一个方案。

上图中,Spring Cloud Gateway下面有 JWT 和 OAuth2,其实这两个就是基于 Token 的认证鉴权,一般互联网项目中,在登录模块都是支持微信或者 QQ 登录,这就是用到 OAuth2 的授权登录。

4.业务组件

从上面的架构图中可以看到,网关之后就是我们的业务组件了,可以理解就是拆分之后的微服务了,比如电商平台常见的 账号服务、订单服务、发票服务、收银台服务 等等。服务组件之间通过 Feign 来进行 http 调用,Feign 集成 Ribbon 来实现客户端侧负载均衡。具体的服务领域划分,服务限界上下文的设定,这就另外的知识了,如果想做好服务划分,DDD 领域驱动设计这块可以深入了解下。

5.服务注册中心

不管是基于 Dubbo 实现的 SOA,还是基于 Spring Cloud 拆分的微服务架构,服务注册中心都是必须的,我们把所有的服务组件都注册到注册中心,进而实现服务的动态调用。常见能实现注册中心功能的有 Zookeeper、Eureka、Nacos。Zookeeper 在 Dubbo 中使用比较多,目前公司服务微服务架构是基于 Eureka 的,Eureka 好像目前不维护了。一般新的平台建议直接集成 Nacos,Nacos 除了能做注册中心来使用,也可以作为分布式配置中心来使用,比 Sping Cloud Config 更好使。

6.缓存和分布式锁

在图中左下角,我们可以看到 Redis 组件,我们可以把 Redis 作为缓存来使用,把一些查询慢,使用率高的热点数据做缓存处理,能快速提高接口响应时间。同时 Redis 在微服务中的一大使用场景就是分布式锁,传统的 Sychronized 和显示 Lock 锁显然是不能解决分布式并发问题。

为了保障 Redis 的高可用,可以采用哨兵部署,不是三个 Redis节点,一主二从,同时部署三个哨兵节点,来实现故障转移,避免单点问题,如果 Redis 存储的数据量很大,达到了单节点的 Redis 的性能瓶颈,我们也可以用 Redis 集群模式来实现分布式存储。

7.数据持久层

不管单体服务,还是微服务,数据持久层都是必须的,我们是选用互联网项目经常使用的 MySQL 作为 DB,为了保证服务读写效率以及高可用性,我们 主从分离 模式,同时实现读写分离,来保障 MySQL 的读写性能。

随着业务量增长,单表的数据量达到性能瓶颈之后,我们就要采用分库分表来对数据库表进行水平拆分和垂直拆分了,具体如何进行合理的拆分,以及技术选型,这些和项目现有的表结构设计是息息相关的,要考虑后续的可拓展性,不能短期拆了一时爽,后续业务量增暴涨之后,服务器的性能不足以维持数据库的性能时,这时候要拆分服务器部署了。当然,一般企业的数据量级达不到那样的量级。

8.结构型数据存储

MySQL 比较擅长存储关系型数据,项目中有需要存储结构性数据的场景,比如存储 JSON 字符串,这种场景通过 MySQL 来存储显然事不合适的。一般我们会采用 Elasticsearch 或者 MongoDB 来进行存储,如果业务中需要检索功能,更建议使用 Elasticsearch。Elasticsearch 支持 DSL,有比较丰富查询检索功能,甚至能实现 GIS 空间检索功能。

9.消息中间件

前面说到,微服务架构中,服务之间同步调用是通过 Feign 来实现的,那服务间的异步解耦就要通过 MQ 来实现了。虽然我们可以通过多线程来实现异步调用,但是这种异步调用不支持持久化,可能会造成消息丢失,所以一般都集成 RabbitMQ 或者 RocketMQ。

10.日志收集

在微服务架构中,通过一个组件,比如说订单服务都是多节点分布式部署,每个节点的 Log 日志都是存储在节点本地,如果要查询日志,我们难道要登录到各个节点找到对应的日志信息?这种查看日志肯定是不行的。所以一般会引入 ELK 来做日志收集,和可视化展示查询。

Logstash 用来做日志收集工作,通常在 Logstash 前会加一个 Filebeat,由 Filebeat 来收集日志,Logstash 做数据转换工作。
Elasticsearch 做数据存储,以及生成索引数据,便于 Kibana 做检索。
Kibana 做数据的展示,以及查询检索功能,我们通过检索关键词就能快速的查询到想要日志信息。

11.任务调度中心

项目中经常会用到定时功能,单体应用中,我们使用 Spring 自带的 Schedule,或者使用 Quartz 即可,在分布式应用中,我们就要集成分布式定时器,比如 Quartz(Quartz 配合数据库表也是支持分布式定时任务的),还有 Elastic-Job、XXL-JOB 等等。

Elastic-Job 是当当网基于 Quartz 二次开发的 弹性分布式任务调度系统,功能丰富强大,采用 Zookeeper 实现分布式协调,实现任务高可用以及分片。Elastic-Job 是一个分布式调度的解决方案,由当当网开源,它由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成,使用 Elastic-Job 可以快速实现分布式任务调度。

XXL-JOB 是一个 分布式任务调度平台(XXL 是作者徐雪里姓名拼音的首字母),其核心设计目标是开发迅速、学习简单、轻量级、易扩展。将调度行为抽象形成 “调度中心” 公共平台,而平台自身并不承担业务逻辑,“调度中心” 负责发起调度请求。将任务抽象成分散的 JobHandler,交由 “执行器” 统一管理,“执行器” 负责接收调度请求并执行对应的 JobHandler 中业务逻辑。因此,“调度” 和 “任务” 两部分可以相互解耦,提高系统整体稳定性和扩展性。

12.分布式对象存储

项目中经常会有文件上传功能,比如图片,音频视频。在分布式架构中,我们将文件存储在节点服务器上显然是不行的,这时候,我们就需要引入分布式文件存储。常见方案有 MinIO、阿里的 OSS(收费),阿里 FastDFS 等等。

MinIO 是一款基于 Go 语言开发的高性能、分布式的 对象存储系统。客户端支持 Java、Net、Python、Javacript、Golang 语言。

FastDFS 是一个开源的 轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/804653.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【性能测试】关于性能测试的各种指标

本指标适用于使用性能测试进行性能测试项目技术质量评价依据,规范技术测试结果评价,统一性能测试技术测试质量度量。应用系统技术质量度量指标范围广泛,本文难以涵盖全部。 预期读者为测试管理人员、测试实施人员、技术支持人员、项目管理人员等系统技术质量相关人员。 1.系…

使用VSCode进行Qt开发插件QtSupport

使用VSCode进行Qt开发 插件Qt Support 使用VSCode进行Qt开发一般都是使用的官方插件Qt tools,使用起来并不是太方便,所以我选择Qt Support插件。 一、Qt Support功能可以创建项目 导入基于CMake的qt项目 可以添加Qt项目文件Designer Form Class Designer Form C++ class Tran…

给Java同仁单点的AI开胃菜--搭建一个自己的本地问答系统

这是我参与创作者计划的第1篇文章大家好,因为对AI大模型很感兴趣,相信很多兄弟们跟我一样,所以最近花时间了解了一些,有一些总结 分享给大家,希望对各位有所帮助;本文主要是目标是 讲解如何在本地 搭建一个简易的AI问答系统,主要用java来实现,也有一些简单的python知识…

MySQL 表的CRUD与复合查询

目录表的增删改查Create指定列插入单行数据+全列插入多行数据+全列插入插入否则更新替换 (replace)Retrieve标准语法SELECT列全列查询限制显示条目 limit (分页查询)基本语法:指定列查询select 查询字段为表达式表达式重命名去重WHERE 条件比较运算符逻辑运算符案例:结果排序 O…

PbootCMS提示:URL名称与模型URL名称冲突,请换一个名称!

解决办法找到模型管理,编辑对应模型把url名称修改为其他,例如:新闻栏目需要news,这里就可以修改成article或者news-model,然后栏目那边就可以使用news名称了。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Jav…

远程控制除了工作还能玩游戏陪伴家人?ToDesk也太方便了!

现如今的当代人已经离不开各种电子设备,打工人更是经常需要手机电脑ipad多种工具齐上阵。 但总是会有各种突发的工作,电脑又不能随时都带在身上,这时候就需要好用的远程控制软件ToDesk来帮你啦~ 经过小编对ToDesk的深度使用过后,总结了三种使用模式体验,可以完美解决我们的…

pbootcms网站目录安全防护设置的方法

针对PbootCMS网站目录的安全防护设置,以下是具体的步骤说明: 1. 更改Data文件夹名称进入网站根目录。 找到data文件夹,并将其重命名为一个新的名称(例如mydata)。 这样做可以避免攻击者直接通过默认路径访问敏感数据。2. 更改数据库DB文件的名称进入新的数据文件夹(假设为…

远程软件排名推荐

市面上的远程控制软件让人眼花缭乱,经过小社长的深度使用后,找到了几个人气度和口碑上还不错的软件👍,在使用体验感上也都各有千秋。 如果你还在寻觅一款适合你的远控软件,不如一起来看看吧✌ 🔵TeamViewer 支持中文版,可以实现远程办公,家庭办公和会议功能等等,在电…

【Java】【Idea】MyBatisPlusX 的使用

1.安装MybatisPlusX插件 2.连接数据库 3.右击,选择“MybatisX-Generator”。 4. 生成设置。 有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

通过MobaXterm操作远程服务器电脑的方法

本文介绍在Windows电脑中,下载、配置MobaXterm软件,从而连接、操作远程服务器的方法~本文介绍在Windows电脑中,下载、配置MobaXterm软件,从而连接、操作远程服务器的方法。因为是在Windows操作系统的电脑中连接服务器,所以建议使用MobaXterm、PuTTY等可视化的远程计算机管…

GaussDB内存过载分析

问题现象数据库进程内存占比较高长时间占比较高 观察监控平台内存占用的变化曲线,无论当前数据库是否有业务在运行,数据库进程内存占总机器内存的比例长时间处于较高状态,且不下降。 执行作业期间占比较高 数据库进程在没有业务执行时,内存使用持续处于较低的状态,当有业务…

通过公网连接GaussDB数据库实例

@目录1. 通过公网连接GaussDB1.1 实验介绍1.1.1 关于本实验1.1.2 实验目的1.2 购买GaussDB数据库(可选)1.3 公网IP绑定1.3.1 购买弹性公网IP1.3.2 绑定GaussDB数据库2 附录一:安装和配置JDK2.1 下载并安装JDK2.2 配置JDK环境变量 本实验概览图1. 通过公网连接GaussDB 1.1 实…