【微服务】微服务架构设计

news2024/11/24 19:44:32

文章目录

  • 背景
  • 一、流量入口Nginx
  • 二、网关
  • 三、业务组件
  • 四、服务注册中心
  • 五、缓存和分布式锁
  • 六、数据持久层
  • 七、结构型数据存储
  • 八、消息中间件
  • 九、日志收集
  • 十、任务调度中心
  • 十一、分布式对象存储

背景

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

在这里插入图片描述

一、流量入口Nginx

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

二、网关

网关是在Nginx后的另外一个核心组件。它承担着请求鉴权,路由转发,协议转换,流量监控等一系列功能,上图中网关是采用spring Cloud Gateway来实现业务网关的功能,在网关选型中,我们还有其他的选择,比如Zuul1,Zuul2,Kong等等,这些方案都有自己的优势和局限性,我们可以根据自己他们的特点来抉择到底选用哪一个方案。对于网关的深入了解,可以参见之前的系列文章什么是网关/服务网关?网关/服务网关的作用是什么?,这里不做赘述。

上图中,Spring Cloud Gateway下面有jwt和OAuth2,其实这两个就是基于token的认证鉴权,一般互联网项目中,在登录模块都是支持微信或者qq登录,这就是用到OAuth2的授权登录。想深入了解Oauth2相关细节,可以参考之前的oAuth等系列文章。

三、业务组件

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

四、服务注册中心

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

五、缓存和分布式锁

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

为了保障Redis的高可用,可以采用哨兵部署,不是三个redis节点,一主二从,同时部署三个哨兵节点,来实现故障转移,避免单点问题,如果Redis存储的数据量很大,达到了单节点的Redis的性能瓶颈,我们也可以用Redis集群模式来实现分布式存储。Redis的哨兵详细信息可以参见之前的Redis哨兵(Sentinel)模式等系列文章。

六、数据持久层

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

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

七、结构型数据存储

上面说到的mysql存储数据都是非结构性数据存储,我们的项目中经常需要存储一些结构性数据,比如存储JSON字符串,这种场景通过mysql来存储显然事不合适的。

一般我们会采用Elasticsearch或者MangoDB来进行存储,如果业务中需要检索功能,更建议使用Elasticsearch。Elasticsearch支持DSL,有比较丰富查询检索功能,甚至能实现GIS空间检索功能。

八、消息中间件

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

九、日志收集

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

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

十、任务调度中心

项目中经常会用到定时功能,单体应用中,我们使用sping自带的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中业务逻辑。因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性。

十一、分布式对象存储

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01_Linux系统安装及使用

一、安装虚拟机软件 VMware16pro 安装链接:https://note.youdao.com/ynoteshare/index.html?id5fc5ad640596a0fbb41a21413ada4dad&typenote&_time1687172973066 二、安装Ubuntu 64 位 Linux系统 安装链接:https://note.youdao.com/ynoteshar…

【动态规划】简单多状态dp问题(1)打家劫舍问题

打家劫舍问题 文章目录 【动态规划】简单多状态dp问题(1)打家劫舍问题1. 按摩师(打家劫舍Ⅰ)1.1 题目解析1.2 算法原理1.2.1 状态表示1.2.2 状态转移方程1.2.3 初始化1.2.4 填表顺序1.2.5 返回值 1.3 编写代码 2. 打家劫舍Ⅱ2.1 题…

seaborn笔记:heatmap

绘制热力图 1 基本使用方法 seaborn.heatmap(data, *, vminNone, vmaxNone, cmapNone, centerNone, robustFalse, annotNone, fmt.2g, annot_kwsNone, linewidths0, linecolorwhite, cbarTrue, cbar_kwsNone, cbar_axNone, squareFalse, xticklabelsauto, yticklabelsauto, m…

C++ 教程(16)——字符串

C 字符串 C 提供了以下两种类型的字符串表示形式: C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾…

Mysql的学习笔记

目录 1、rc 级别的 mvcc 和 rr 级别的mvcc 有啥区别? 2、Innodb与MyIsam的文件结构? 3、Innodb 与MyIsam的简单对比? 4、innodb,Alter table 改字段类型,底层会经历什么过程? 5、Alter table 改字段类型…

Zebec Protocol 与 PGP 深度合作,将流支付更广泛的应用薪资支付领域

随着传统机构的入局,以及相关加密合规法规的落地,加密支付正在成为一种备受欢迎的全新支付方式。加密支付基于区块链底层,不受地域、时间等的限制,能够实时到账,具备去中心化、非许可等特性。 流支付是一种具备创新性的…

Jmeter和Postman做接口测试的区别你知道吗

区别1:用例组织方式 不同的目录结构与组织方式代表不同工具的测试思想,学习一个测试工具应该首先了解其组织方式。 Jmeter的组织方式相对比较扁平,它首先没有WorkSpace(工作空间)的概念,直接是TestPlan(测…

搜索旋转排序数组(leetcode 33)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路思路复杂度分析 5.实现示例参考文献 1.问题描述 整数数组按升序排列,数组中的值互不相同 。 假设数组在预先未知的某个点上进行了旋转。 如数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2]。 搜索一个给定的目…

如何安装Nginx服务

目录 一、Nginx服务 Nginx的并发能力受影响因素 二、Nginx与Apache的差异 Nginx相对于Apache的优点 Apache相对于Nginx的优点 三、阻塞/非阻塞 四、同步/异步 Nginx应用场景 五、编译安装Nginx服务 关闭防火墙和安全机制 安装依赖环境 将相关包导入/opt当中 进入指…

Linux分区的基本概念。

文章目录 前言 一、分区概念 1,书名,主引导纪录(MBR) 2,正文,就是硬盘中纪录的数据。 3,索引相当于硬盘中的分区表 3.1主分区(存放地址&#xff0…

React、Vue项目build打包编译后如何再修改后台请求地址

vue项目大家都了解,开发用 npm run dev/npm run serve。而要上线则必须是先将项目打包编译 npm run build 之后成为了普通的静态网页才可上线进行部署及发布。同样这时候我们也已经将代码全部写好了。如果说要改里面的某个值或者修改请求地址我们应该怎么办呢&#…

IDEA中创建编写JSP

一、安装Tmocat并配置环境 安装请参考:https://www.cnblogs.com/weixinyu98/p/9822048.html 安装请参考:https://www.cnblogs.com/zhanlifeng/p/14917777.html 注意:在安装成功Tomcat测试是否成功安装时,访问“http://localhost:8…

selenium自动化教程及使用java来爬取数据

目录 一、介绍二、下载浏览器驱动1.获取要下载的驱动版本号2.下载驱动 三、Maven如下四、简单使用五、定位器1.定位器2.说明(1) class name 定位器(2) css selector 定位器(3) id 定位器(4) name 定位器(5) link text 定位器(6) partial link text 定位器(7) tag 定位器(8) xpa…

Android 内存检测LeakCanary

在github上下载了一个项目:安装debug版本会产生两个apk,一个是apk本身,一个是Leaks release版本就正常 不会产生这个问题,百思不得其解,第一次遇到这个问题。 看到这篇博客豁然开朗:在build.gradle.kts 里…

3天爆肝整理,性能测试问题汇总+解决办法(重要)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 开始性能测试前需…

入门孪生网络3-------使用一维卷积神经网络1DCNN与孪生网络的组合模型来实现excel数据的分类

文章目录 前言入门孪生网络的第三小节,我尝试使用keras或tensorflow2框架来搭建一个数据分类的网络。大家可以参考的程序思路,我也是小白,可以评论区一起讨论。 一、孪生网络与1DCNN组合网络的搭建思路二、我编写的孪生网络与1DCNN组合网络程…

操作教程:EasyCVR视频融合平台如何配置平台级联?

EasyCVR视频融合平台基于云边端一体化架构,可支持多协议、多类型设备接入,在视频能力上,平台可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、智能分析以及平台级联等。平台可拓展性强、开放度高、部署轻快&…

干货讲解,财务报表结构分析

财务报表的构成是对企业财务状况、经营成果和现金流量的结构性表述。企业必须重视财务结构对经营业绩的影响,才能解决发展中的问题。 资产质量关注两个角度,一是资产结构,二是现金含量。 资产结构是什么意思呢?就是固定资产和无…

Linux 定时任务提权

Linux 定时任务提权 1.概述2.定时任务创建3.提权步骤 1.概述 定时任务(cron job)是Linux系统中的一个守护进程,用于调度重复任务,通过配置crontab可以让系统周期性地执行某些命令或者脚本。cron 是 Linux 系统中最为实用的工具之…

apple pencil二代平替笔哪个好用?苹果平板触控笔

随着互联网的快速发展,移动数码产品如手机、平板电脑、笔记本等正逐步进入人们的日常生活。同时电容笔的出现,也让这些产品的功能作用更上一层楼。由于苹果原装电容笔的价格非常贵,使得国内出现了越来越多的平替电容笔。总的来说,…