面试总结之微服务篇
一、概览
1、微服务常用组件
- 微服务给系统开发带来了诸多问题和挑战,如服务间通信和调用的复杂性、数据一致性和事务管理、服务治理和版本管理等,为解决应对这些问题和挑战,各种微服务组件应运而生
- 微服务的常见组件和实现:


1)注册中心:用于服务的注册和发现,管理微服务的地址信息,常见实现有:
- SpringCloud Netflix:Eureka、Consul
- SpringCloud Alibaba:Nacos
2)配置中心:用于集中管理微服务的配置信息,可动态修改配置而不需要重启服务,常见的实现有: - SpringCloud Netflix:SpringCloud Config
- SpringCloud Alibaba:Nacos Config
3)远程调用:用于在不同的微服务之间进行通信和协作,常见的实现有: - RESTful API:RestTemplate、OpenFeign、Feign
- RPC(远程过程调用):Dubbo、gRPC
4)API网关:作为微服务架构的入口,统一暴露服务,并提高路由、负载均衡、安全认证等功能,常见的实现有: - Spring Cloud Netflix:Zuul、Gateway
- Spring Cloud Alibaba:Gateway、Apisix等
5)分布式事务:保证跨多个微服务的一致性和原子性操作,常见的实现有 Spring Cloud Alibaba的Seata
6)熔断器:用于防止微服务之间的故障扩散,提高系统的容错能力,常见的实现有: - Spring Cloud Netflix:Hystrix
- Spring Cloud Alibaba:Sentinel、Resilience4j
7)限流和降级:用于防止微服务过载,对请求进行限制和降级处理,常见的实现有: - Spring Cloud Netflix:Hystrix
- Spring Cloud Alibaba:Sentinel
8)分布式追踪和监控:用于跟踪和监控微服务的请求流程和性能指标,常见的实现有: - Spring Cloud Netflix:Spring Cloud Sleuth + Zipkin
- Spring Cloud Alibaba:SkyWalking、Sentinel Dashboard
二、注册中心
1、注册中心的作用
- 注册中心是用来管理和维护分布式系统中各个服务的地址和元数据的组件,主要用于实现服务的发现和注册功能

注册中心的作用: - 服务注册:各个服务在启动时向注册中心注册自己的网络地址、服务实例信息和其他相关的元数据,如此,其他服务就可以通过注册中心获取到当前可用的服务列表
- 服务发现:客户端通过向注册中心查询特定服务的注册信息,获得可用的服务实例列表,如此客户端即可根据需要选择合适的服务进行调用,实现了服务间的解耦
- 负载均衡:注册中心可以对同一服务的多个实例进行负载均衡,将请求分发到不同的实例上,提高整体的系统性能和可用性
- 故障恢复:注册中心能够监测和检测服务的状态,当服务实例发生故障或下线时,可以及时地更新注册信息,从而保证服务能够正常工作
- 服务治理:通过注册中心可以进行服务的配置管理、动态扩容/ 缩容,服务路由、灰度发布等操作,实现对服务的动态管理和控制
2、注册中心的实现方案
SpringCloud可以和多种注册中心进行集成,常见的注册中心有Eureka、Consul、Zookeeper、Nacos
- Eureka:Netflix开源的服务发现组件,具有高可用、弹性、可扩展等特点,与Spring Cloud集成良好
- Consul:分布式服务发现和配置管理系统,提供了服务的注册和发现、健康检查、键值存储等功能,并支持多数据源中心部署
- Nacos:阿里开源的动态服务发现、配置管理和服务管理组件,提供了服务注册和发现、配置管理、动态DNS服务等功能
- Zookeeper:Apache开源的分布式协调服务,可用作服务注册中心,具有高可用、一致性、可靠性等特点
3、Eureka、Zookeeper和Nacos的区别

三者最大的区别在于Eureka支持AP,Zookeeper支持CP,而Nacos既支持AP,也支持CP
4、Eureka实现原理

Eureka的实现原理,大致可以从服务的注册与发现、服务的健康检查、服务负载均衡三个三面来看:
- 1)服务注册与发现:当一个服务实例启动时,会向Eureka Server发送注册请求,将其信息登记到注册中心,Eureka Server会将这些信息保存到内存中,并提供REST接口以供其他服务查询,服务消费者可以通过查询服务实例列表来获取可用的服务提供者实例,从而实现服务的发现
- 2)服务健康检查:Eureka通过心跳机制来检测服务实例的健康状态,服务实例会定期向Eureka Server发送心跳,即续约,以表明自己的存货状态,如果Eureka Server在一定时间内没有收到某个服务实例的心跳,则会将其标记为不可用,并从服务列表中移除,下线实例
- 3)服务负载均衡:Eureka客户端在调用其他服务时,会从本地缓存中获取服务的注册信息,如果缓存中没有对应的信息,则会向Eureka Server发送查询请求,Eureka Server会返回一个可用的服务实例列表给客户端,客户端可以使用负载均衡算法选择其中的服务实例进行调用
其他的注册中心,如Nacos、Consul等,在服务注册和发现上,实现原理都大同小异
5、Eureka如何保证高可用
- Eureka Server保证高可用,主要通过如下三个方面来实现:
1)多实例部署:将多个Eureka Server实例部署在不同的节点上,实现其高可用性,当其中某个实例发生故障时,其他实例仍然可以提供服务,并保存注册信息的一致性
2)服务注册信息的复制:当一个服务实例向Eureka Server注册时,每个Eureka Server实例都会复制其他实例的注册信息,以保证数据的一致性,当某个Eureka Server实例发生故障时,其他实例可以接管其工作,保证整个系统的正常运行
3)自我保护机制:当Eureka Server节点在一定时间内没有接收到心跳时,会进入自我保护模式,即Eureka不再剔除注册列表中的服务实例,以保护现有服务实例的注册信息,如此,可以防止由于网路抖动或其他原因导致的误删除
三、配置中心
1、微服务为什么需要配置中心
微服务架构中的每个服务通常都需要一些配置信息,如数据库连接地址、服务端口、日志级别等,这些配置可能因为不同环境、不同部署实例或动态运行时需要进行调整和管理
微服务的实例一般较多,如果每个都逐个去配置,就会造成较大的运维成本,因此,就需要集中化地管理这些配置
2、Nacos配置中心的原理
-
配置中心需要完成配置信息的增删改查

-
Nacos作为配置中心,其具体的实现大概可以分为如下几个部分:
1)配置信息存储:Nacos默认使用内嵌数据库 Derby来存储配置信息(也可以采用MySQL等关系型数据库)
2)注册配置信息:服务启动时,Nacos Client会向Nacos Server注册自己的配置信息(即将配置信息写入存储,并生成版本号)
3)获取配置信息:服务运行期间,Nacos Client通过API从Nacos Server获取配置信息,Server根据键查找对应的配置信息,并返回给client
4)监听配置变化:Nacos Client可以通过注册监听器的方式,实现对配置信息的监听,当配置信息发生变化时,Nacos Server会通知已注册的监听器,并触发相应的回调方法
3、Nacos配置中心长轮询机制
- 一般来说,客户端和服务端的交互分为两种:推(Push)和 拉(Pull),Nacos在Pull的基础上,采用了长轮询来进行配置的动态刷新
- 在长轮询模式下,客户端定时向服务端发起请求,检查配置信息是否发生变更,如果没有变更,服务端会hold住该请求,即暂时不返回结果,直到配置发生变化或达到一定的超时时间 ==> 通过长轮询的方式,Nacos客户端能够实时感知配置的变化,并及时获取最新的配置信息,同时,此种方式也降低了服务端的压力,避免了大量的长连接占用内存资源

具体的实现过程如下:
1)客户端发起Pull请求,服务端检查配置是否有变更,如果没有变更,则设置定时任务,在一段时间后执行,并将当前的客户端连接加入到等待队列中
2)在等待期间,如果配置发生变化,服务端会立即返回结果给客户端,完成一次"推送"操作
3)如果在等待期间没有配置变更,等到时间达到预设的超时时间后,服务端会自动返回结果给客户端
4)如果在等待期间,通过Nacos Dashboard或API对配置进行了修改,会触发事件机制,服务端会遍历等待队列,找到发生变更的配置项对应的客户端连接,并将变更的数据通过连接返回,完成一次"推送"操作
四、远程调用
1、HTTP和RPC的区别
- HTTP(Hypertext Transfer Protocol):一种应用层协议,强调的是网络通信
- RPC(Remote Producer Call):一种用于分布式系统之间通信的协议,强调的是服务之间的远程调用
在微服务体系中,基于HTTP风格的远程调用通常使用Feign来实现,基于RPC的远程调用通常使用Dubbo来实现,其他区别如下:
| HTTP | RPC |
|---|---|
| 用于传输超文本的协议 | 用于实现分布式系统中不同节点之间通信的协议 |
| 基于请求-响应模式,客户端发送请求,服务端返回响应 | 基于方法调用模型,客户端调用远程方法并等待结果 |
| 基于TCP协议,可使用其他传输层协议如TLS/SSL进行安全加密 | 可使用多种传输协议,如TCP、UDP等 |
| 基于文本,常见的数据格式有JSON、XML等 | 可使用二进制、JSON、Protocol、Buffers等数据格式 |
| 使用RESTful风格的接口进行定义,常见的方法有GET、POST、PUT、DELETE等 | 使用IDL(接口定义语言)进行接口定义,如Protocol Buffers、Thrift等 |
| 支持跨语言通信,可使用HTTP作为通信协议实现不同语言之间的通信 | 支持跨语言通信,可使用IDL生成不同语言的客户端和服务端代码 |
| 较灵活,适用于不同类型的应用场景,如Web开发、API调用等 | 较高效,适用于需要高性能和低延迟的分布式系统 |
负载均衡算法
常见的负载均衡算法:
- 轮询算法(Round Robin):按照顺序将请求依次分配给每个后端服务器,循环往复,当请求到达时,负载均衡器按照事先定义的顺序选择下一个服务器,轮询算法适用于后端服务器具有相同的处理能力和性能的场景
- 加权轮询算法(Weighted Round Robin):在轮询算法的基础上增加了权重的概念,每个后端服务器都被赋予一个权重值,权重值越高,被选中的概率就越大,如此就可以根据服务器的处理能力和性能调整请求的分配比例,使性能较高的服务器能够处理更多的请求
- 随机算法(Random):将请求随机分配给后端服务器,每个后端服务器具有相等的、被选中的概率,该算法简单且快速,但不能考虑服务器实际的负载情况,适用于后端服务器性能相近但无需考虑请求处理能力的场景
- 加权随机算法(Weighted Random):在随机算法的基础上引入权重,每个后端服务器被赋予一个权重值,权重值越高,被选中的概率就越大,如此就可以根据服务器的处理能力和性能来调整请求的分配比例
- 最少连接算法(Least Connection):根据后端服务器当前的连接数来决定请求的分配,负载均衡器会选择当前连接数最少的服务器进行请求分配,以保证后端服务器的负载均衡,此种算法适用于后端服务器的处理能力不同或请求的处理时间不同的场景
- 哈希算法(Hash):根据请求的某个特定属性(如客户端IP地址、请求URL等)计算哈希值,然后根据哈希值选择相应的后端服务器
相关文章:
面试总结之微服务篇
一、概览 1、微服务常用组件 微服务给系统开发带来了诸多问题和挑战,如服务间通信和调用的复杂性、数据一致性和事务管理、服务治理和版本管理等,为解决应对这些问题和挑战,各种微服务组件应运而生微服务的常见组件和实现: 1…...
ElementUI之登陆+注册
一.什么是ElementUI 二.ElementUI完成用户注册登录界面搭建 使用命令npm install element-ui -S,添加Element-UI模块 导依赖 建立登录和注册页面 编辑 配置样式 编写登录页面(Login) 编写注册页面(reginter) …...
新版kafka可视化界面组件
二、安装kafka可视化客户端工具(kafka tool 2) 1、下载安装 在官网中找到对应自己电脑系统的版本: kafka Tool2官网下载地址: Offset Explorer 这个方案是为Kafka依赖zookeeper提供的可视化解决方案。 前言 在早期使用kafka的…...
P1102 A-B 数对 【双指针(尺取法)】
P1102 A-B 数对 【双指针(尺取法)】 题目描述 给出一串正整数数列以及一个正整数 C,要求计算出所有满足 A−BC 的数对的个数(不同位置的数字一样的数对算不同的数对)。 输入格式 输入共两行。 第一行,两个…...
Flutter绘制拖尾效果
演示: 代码: import dart:ui;import package:flutter/material.dart; import package:kq_flutter_widgets/widgets/chart/ex/extension.dart;class TrailingView extends StatelessWidget {const TrailingView({super.key});overrideWidget build(Build…...
【Newman+Jenkins】实施接口自动化测试
一、是什么Newman Newman就是纽曼手机这个经典牌子,哈哈,开玩笑啦。。。别当真,简单地说Newman就是命令行版的Postman,查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行,把Postman界面化运…...
kr 第三阶段(六)C++ 逆向
结构体 结构体对齐 设置结构体对齐值 方法1:在 Visual Studio 中可以在 项目属性 -> 配置属性 -> C/C -> 所有选项 -> 结构体成员对齐 中设置结构体对齐大小。方法2:使用 #pragma pack(对齐值) 来设置,不过要想单独设置一个结…...
医药行业安全生产信息化建设分享
随着科技的快速发展和全球化进程的推进,医药行业作为人类健康和安全的重要组成部分,面临着日益严峻的安全生产挑战。近年来,医药企业对于安全生产的需求越来越强烈,安全生产信息化建设成为了医药行业发展的重要趋势。本文将探讨医…...
C 语言简单入门
C 语言发展历史|标准 1972年,丹尼斯里奇(Dennis Ritch)和肯汤普逊(Ken Tompson)在贝尔实验室开发 UNIX 操作系统时基于 B 语言设计出 C 语言。 1987年,布莱恩柯林汉(Brian Kernighanÿ…...
Levels - UE5中的建模相关
一些日常的笔记; 可以使用Shapes面板建立基础模型: 可以在PolyModel中继续细分模型: UE5中的建模有PolyGroups概念,可以在Attributes面板中直接编辑: 使用GrpPnt方式可以直接用笔刷设定新的PolyGroups,这样…...
数据中心与数据仓库的区别
在数字化时代,数据已经成为企业竞争的核心资源,数据处理和数据管理也变得越来越重要。在数据处理方面,数据中台和数据仓库是两种常见的数据处理方式,它们有着不同的特点和适用场景。本文将从技术角度对数据中台和数据仓库的区别进…...
[2023.09.18]: Rust中类型转换在错误处理中的应用解析
随着项目的进展,关于Rust的故事又翻开了新的一页,今天来到了服务器端的开发场景,发现错误处理中的错误类型转换有必要分享一下。 Rust抽象出来了Result<T,E>,T是返回值的类型,E是错误类型。只要函数的返回值的类…...
前端工作日常
机缘 记录和遇到的问题作为记录 收获 收获代码提高和认知 日常 使用js去操作数组或者对象 空闲时间可以多学学基础算法 比如(冒泡,倒序,去重,笛卡尔积算法,各种各样的排序方法等等等) 正确良好的使用循环…...
C++:C++哪些时候用到const
声明常量:使用const关键字定义一个常量,不允许对其进行更改。例如: const int PI 3.1415926;修饰函数参数:加上const限定符可以确保函数不会修改传入的参数值。例如: void print(const int num) {// num不能在函数内…...
OpenCV之九宫格图像
将一张图像均等分成九份,然后将这九个小块按一定间隔(九宫格效果)拷贝到新画布上。效果如下图所示: 源码: #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv;i…...
OpenGLES:绘制一个颜色渐变的圆
一.概述 今天使用OpenGLES实现一个圆心是玫红色,向圆周渐变成蓝色的圆。 本篇博文的内容也是后续绘制3D图形的基础。 实现过程中,需要重点关注的点是:如何使用数学公式求得图形的顶点,以及加载颜色值。 废话不多说,…...
javascript数据类型错误造成的前端分页不准的问题
有个react项目是自己写的mock后端api,使用的是json文件模拟DB, slice函数模拟分页,但是在实际分页时,发现了分页不准的问题,现象如下: 当pageSize为5的时候(共16条数据),总共分4页&…...
[Qt]QListView 重绘实例之二:列表项覆盖的问题处理
0 环境 Windows 11Qt 5.15.2 MinGW x64 1 系列文章 简介:本系列文章,是以纯代码方式实现 Qt 控件的重构,尽量不使用 Qss 方式。 《[Qt]QListView 重绘实例之一:背景重绘》 《[Qt]QListView 重绘实例之二:列表项覆…...
Java 函数式编程思考 —— 授人以渔
引言 最近在使用函数式编程时,突然有了一点心得体会,简单说,用好了函数式编程,可以极大的实现方法调用的解耦,业务逻辑高度内聚,同时减少不必要的分支语句(if-else)。 一、函数式编…...
操作系统权限提升(二十八)之数据库提权-SQL Server 数据库安装
SQL Server 数据库安装 SQL Server介绍 SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
