当前位置: 首页 > news >正文

微服务架构设计核心理论:掌握微服务设计精髓

文章目录

  • 一、微服务与服务治理
    • 1、概述
    • 2、Two Pizza原则和微服务团队
    • 3、主链路规划
    • 4、服务治理和微服务生命周期
    • 5、微服务架构的网络层搭建
    • 6、微服务架构的部署结构
    • 7、面试题
  • 二、配置中心
    • 1、为什么要配置中心
    • 2、配置中心高可用思考
  • 三、服务监控
    • 1、业务埋点的技术选型
    • 2、用户行为分析(用户画像)
    • 3、通用埋点手段
    • 4、离群点分析
  • 四、调用链梳理
    • 1、微服务链路梳理

一、微服务与服务治理

1、概述

单体应用时代,全都耦合在一起,牵一发而动全身。所有功能一起上线一起回滚。代码复杂度混乱。

微服务时代,业务模式糙快猛,敏捷编程。小步快跑,独立演进,独立部署,快速迭代。团队赋能(每个微服务有各自团队)。边界清晰,以大化小-服务拆分,三高应用-分治。

2、Two Pizza原则和微服务团队

Two Pizza原则:如果一个团队的成员,两个披萨都喂不饱他们,说明团队明显太大了 。

“大象不会跳舞” - 提倡小团队。
小团队:沟通成本低,小步快跑容易实现。(人数不会超过10个)

在微服务和敏捷的理念之下,通常是重沟通请问当,因此团队中的每个人都需要做到深度参与。

测试人员也是有很强的开发功底,会致力于测试框架的搭建。

3、主链路规划

要保障业务的最小可用性。(比如:电商的下单场景、社交的点对点消息)

主链路规划就是将有限的资源用在最核心的链路上。
根据应用的水位,进行弹性计算,确保主链路的可用性。自动/手动进行降级熔断、分段限流。

4、服务治理和微服务生命周期

远程RPC调用,A服务是如何知道B服务服务器地址的呢?B有多台服务器,A是如何从集群中选择B服务呢?B服务上下线是如何让A服务知道的呢?

总的来说,服务治理就是维护一个可用的服务列表(注册中心),并且体现服务的状态。
在这里插入图片描述

服务注册:每个微服务上线之后,会主动在注册中心上注册自己的IP、名称等信息。
服务发现:每个微服务都会从注册中心主动拉取所有在该注册中心上注册的服务信息。
服务续约(心跳):每个微服务与注册中心每隔几秒发送心跳包,确保自己处于正常状态。
服务剔除:注册中心每隔一段时间进行批处理,这段时间内没收到心跳包的微服务会从注册中心剔除。
服务下线:微服务主动从注册中心剔除掉。
在这里插入图片描述

5、微服务架构的网络层搭建

通常来说,Unsecure Zone是可以对用户暴露的,用户可以直接访问的;Secure Zone只内部访问。
而且每个小的微服务,还会做集群部署。
在这里插入图片描述

6、微服务架构的部署结构

将每个微服务打包成docker镜像,部署在同一个物理机上,使用kubernetes进行快速部署。
在这里插入图片描述

7、面试题

问:高并发系统、资源有限、如何来保障业务顺利进行?
答:主链路规划!由面到点。业务角度规划主链路 - 流量、转化率、变现场景;漏斗模型 - 越往下越重要。
答:具体技术点:限流降级,弹性计算。

问:谈谈服务治理
答:本质是维护可用服务列表,保持服务间调用的正确性。
答:服务治理的生命周期(服务注册、服务发现、服务剔除、服务续约、服务下线)。

二、配置中心

1、为什么要配置中心

配置中心可以将配置统一管理,有配置变化可以实时推送到相关的微服务。

实现:
配置业务隔离(将具体配置文件从业务代码中抽离,放在中心化的配置中心);
环境隔离(业务代码层并不需要关心当前部署的环境,在配置中心做配置隔离,业务代码启动时根据启动参数决定使用哪个环境的配置);
服务隔离(中心化的配置服务,有能力识别那些配置文件属于哪些服务)。

2、配置中心高可用思考

解决单点故障问题,就需要做集群(多副本、主从、集群)。
单点故障解决方案:通过注册中心,将配置中心注册为一个微服务。来实现高可用。

配置文件本地保存一个备份,确保远程配置数据读取不到导致宕机。

总而言之,高可用的原则就是认为任何一环都不可靠,通过各种方式来提高总体的可用性。

三、服务监控

1、业务埋点的技术选型

通过业务日志,进行业务买点的处理,用于内审、统计、线上预警。

内审:后台系统、商户关键操作(银行卡、关户、密码)的关键操作都记录下来,用于内部审计。(海量数据,可查找,长期保存)
记录下来之后,根据操作员/操作资源维度进行操作查找。查出问题进行追责。
也就是说,审计数据只需要根据key来查询想要的操作记录即可,可以考虑使用CouchBase或者MongoDB等文档数据库。

线上预警:基于文件业务日志记录的,通过日志关键信息来监控关键业务流程、关键指标。
技术选型:fileBeat(收集log文件),Kafka(日志收集及分发),Logstash(日志收集、转换)、elasticSearch(存储、查询)、Kibana(图形化界面)。

2、用户行为分析(用户画像)

从个人行为数据上,分析出个人特点,从而进行一些精准推送。
在这里插入图片描述
日志关键信息:操作时间;页面元素;匿名/登录用户;做了什么操作。(时间、地点、人物、事件,按需记录)

3、通用埋点手段

一般就是这三种手段:后端业务埋点、前端可视化埋点、无痕埋点。

后端业务埋点:在后端代码中,进行日志打印。
可以用侵入性比较高的,手动打印日志(代码侵入高、信息完整度高、精准度高)。也可以使用AOP注解,进行统一日志(代码侵入低,信息完整度较低,精准度较低)。

前端可视化埋点/声明式埋点:使用前端的一些控件/按钮进行埋点。
比如按钮点击,触发响应函数,判断埋点开关是否开启,若开启就执行埋点函数(异步)。
对比后端业务埋点:埋点前置,降低业务侵入,降低成本。
缺点:APP更改埋点逻辑就得重新发版更新,比较麻烦。

无痕埋点:无差别记录用户行为(所有行为),异步发送后台。
记录业务事件(控件事件),需要在前端框架层面,为每个控件定义一个业务事件(每个控件要对应好业务)。
还需要后端可配(比如说APP更改埋点逻辑,只需要读取后端配置即可)。
还需要注意数据传递,前后数据关联(获取前一步操作内容),所以说无痕埋点保存数据时,还需要携带前一个页面的相关数据。
特点:埋点成本低,但是数据清洗难度高。

通常来说使用无痕埋点+可视化埋点,进行数据分析。
后端业务埋点记录关键链路。
综合使用。

4、离群点分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、调用链梳理

1、微服务链路梳理

微服务调用链路长,出问题之后需要找到问题的根源点。

通过报错日志,找到全局的TraceID,然后定位整条调用链路。
在这里插入图片描述
常用解决方案:ZipKin、skywalking。

相关文章:

微服务架构设计核心理论:掌握微服务设计精髓

文章目录 一、微服务与服务治理1、概述2、Two Pizza原则和微服务团队3、主链路规划4、服务治理和微服务生命周期5、微服务架构的网络层搭建6、微服务架构的部署结构7、面试题 二、配置中心1、为什么要配置中心2、配置中心高可用思考 三、服务监控1、业务埋点的技术选型2、用户行…...

.net core 6 集成和使用 mongodb

1、安装包 MongoDB.Driver 2、定义顶层类 /// <summary> /// monggodb规范 /// </summary> public abstract class MongoDBToolBase { /// <summary> /// 客户端 /// </summary> protected MongoClient mongoClient { get; private …...

07-微服务getaway网关详解

一、初识网关 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话会产生很多问题&#xff0c;例…...

MS2660:L1 频段卫星导航射频前端低噪声放大器芯片

MS2660 是一款具有高增益、低噪声系数的低噪声放 大器&#xff08;LNA&#xff09;芯片&#xff0c;支持 L1 频段多模式全球卫星定位&#xff0c;可 以应用于 GPS、北斗二代、伽利略、Glonass 等 GNSS 导航 接收机中。芯片采用先进工艺制造&#xff0c;封装采用 2 mm 2 mm …...

微信小程序防止截屏录屏

一、使用css添加水印 使用微信小程序原生的view和css给屏幕添加水印这样可以防止用户将小程序内的隐私数据进行截图或者录屏分享导致信息泄露&#xff0c;给小程序添加一个水印浮层。这样即使被截图或者拍照&#xff0c;也能轻松地确定泄露的源头。效果图如下&#xff1a; 代码…...

126.(leaflet篇)leaflet松散型arcgis缓存切片加载

地图之家总目录(订阅之前必须详细了解该博客) arcgis缓存切片数据格式如下: 完整代码工程包下载,运行如有问题,可“私信”博主。效果如下所示: leaflet松散型arcgis缓存切片加载 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYP...

物联网介绍

阅读引言&#xff1a; 本文从多方面叙述物联网的定义以及在物联网当中的各种通信的介绍。 一、物联网的定义 1.1 通用的定义 物联网&#xff08;Internet of Things&#xff0c;IOT&#xff1b;也称为Web of Things&#xff09;是指通过各种信息传感设 备&#xff0c;如传感器、…...

Flume 之自定义Sink

1、简介 前文我们介绍了 Flume 如何自定义 Source&#xff0c; 并进行案例演示&#xff0c;本文将接着前文&#xff0c;自定义Sink&#xff0c;在这篇文章中&#xff0c;将使用自定义 Source 和 自定义的 Sink 实现数据传输&#xff0c;让大家快速掌握Flume这门技术。 2、自定…...

【1】SM4 CBC-MAC 机制

0x01 题目 MSG1: e55e3e24a3ae7797808fdca05a16ac15eb5fa2e6185c23a814a35ba32b4637c2 MAC1: 0712c867aa6ec7c1bb2b66312367b2c8 ----------------------------------------------------- MSG2: d8d94f33797e1f41cab9217793b2d0f02b93d46c2ead104dce4bfec453767719 MAC2: 4366…...

响应式编程Reactor API大全(下)

Reactor 是一个基于响应式编程的库&#xff0c;主要用于构建异步和事件驱动的应用程序。Reactor 提供了丰富的 API&#xff0c;包括创建、转换、过滤、组合等操作符&#xff0c;用于处理异步数据流。以下是一些 Reactor 的主要 API 示例&#xff1a; pom依赖 <dependencyMan…...

【STM32】HAL库的STOP低功耗模式UART串口唤醒,解决首字节出错的问题(全网第一解决方案)

【STM32】HAL库的STOP低功耗模式UART串口唤醒&#xff0c;解决首字节出错的问题&#xff08;全网第一解决方案&#xff09; 前文&#xff1a; 【STM32】HAL库的STOP低功耗模式UART串口唤醒&#xff0c;第一个接收字节出错的问题&#xff08;疑难杂症&#xff09; 目前已解决 …...

Python 语法糖

一、基本概念 语法糖&#xff0c;可以理解为&#xff1a;“甜蜜” 的便捷语法。 它是编程语言为程序提供的更简洁、更易读的语法实现的语法结构&#xff0c;它并不影响语言的功能&#xff0c;仅仅是一种更便捷的书写方式。 这就像你制作蛋糕时&#xff0c;使用现代烤箱而不是…...

一个小程序跳转到另一个小程序中如何实现

小程序 保证两个小程序是一样的主体才可以跳转。怎么知道是不是同样的主体呢&#xff1f; 小程序的后台管理-设置-基本设置-基本信息。查看主体信息。 跳转 <button clicktoOtherMini()>跳转到另一个小程序</button> function toOtherMini(){wx.navigateToMini…...

STM32+HAL库驱动ADXL345传感器(SPI协议)

STM32HAL库驱动ADXL345传感器&#xff08;SPI协议&#xff09; ADXL345传感器简介实物STM32CubeMX配置SPI配置片选引脚配置串口配置 特别注意&#xff08;重点部分&#xff09;核心代码效果展示 ADXL345传感器简介 ADXL345 是 ADI 公司推出的基于 iMEMS 技术的 3 轴、数字输出加…...

Redis实现全局唯一Id

一、全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显 受单表数据量的限制 场景分析&#xff1a;如果我们的…...

【J-Flash基本使用总结】

【J-Flash基本使用总结】 VX&#xff1a;hao541022348 ■ 烧录文件■ 创建新的工程■ 烧录模式-SWD模式■ J-Flash下载程序到单片机 ■ J-Flash拼接多个hex或bin文件■ J-Flash读单片机的option byte■ J-Flash读单片机Flash数据■ 将读出来的文件用jflash烧录到其他的芯片■ 设…...

宝塔发布网站问题汇总和记录

1、添加网站站点后打不开 解决办法&#xff0c;关闭防跨站攻击2 2、laravel项目部署到linux的时候出现The stream or file "/home/www/storage/logs/laravel.log" could not be opened in append mode 给目录加权限 chmod -R 777 storage 3、Class "Redis"…...

决战排序之巅(二)

决战排序之巅&#xff08;二&#xff09; 排序测试函数 void verify(int* arr, int n) 归并排序递归方案代码可行性测试 非递归方案代码可行性测试 特点分析 计数排序代码实现代码可行性测试 特点分析 归并排序 VS 计数排序&#xff08;Release版本&#xff09;说明1w rand( ) …...

自动化网络监控:每分钟自动检测网站可用性

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃诸葛妙计&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &…...

Asp .Net Core 系列:集成 Ocelot+Consul实现网关、服务注册、服务发现

什么是Ocelot? Ocelot是一个开源的ASP.NET Core微服务网关&#xff0c;它提供了API网关所需的所有功能&#xff0c;如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关&#xff0c;它可以与现有的服务集成&#xff0c;并帮助您保护、监控和扩展您的微…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...