深入浅出 -- 系统架构之微服务标准组件及职责

我们来认识一下微服务架构在Java体系中依托哪些组件实现的。

相对于单体架构的简单粗暴,微服务的核心是将应用打散,形成多个独立提供的微服务,虽然从管理与逻辑上更符合业务需要。但微服务架构也带来了很多急需解决的核心问题:

1、如何发现新节点以及检查各节点的运行状态?

2、如何发现服务及负载均衡如何实现?

3、服务间如何进行消息通信?

4、如何对使用者暴露服务API?

5、如何集中管理各节点配置文件?

6、如何收集各节点日志并统一管理?

7、如何直观的了解各节点间的调用链路?

8、如何对系统进行链路保护,避免服务雪崩?

可以发现,以上的各个问题,不是针对某种语言或某种技术的,任何要构建微服务架构的企业都需要面对这些问题,要么公司内部逐个研究各个问题的解决办法,要么就将已有的多种技术整合形成整体解决方案。好在经过互联网行业的多年发展,业内对于上述问题基本都有了标准的解决方案,下图清晰的说明了微服务架构需要的标准组件。

下面我们来逐个了解各个组件的职责:

1、注册中心(Service Registry)

注册中心是微服务架构最核心的组件。它起到的作用是对新节点的注册与状态维护,通过注册中心可解决上述第1个问题(1、如何发现新节点以及检查各节点的运行状态? )。

微服务节点在启动时会将自己的服务名称、IP、端口等信息在注册中心登记,注册中心会定时检查该节点的运行状态。注册中心通常会采用心跳机制最大程度保证已登记过的服务节点都是可用的

2、负载均衡(Load Balance)

负载均衡解决了第2个问题( 2、如何发现服务及负载均衡如何实现? )。通常微服务在互相调用时,并不是直接通过IP、端口进行访问调用。而是先通过服务名在注册中心查询该服务拥有哪些节点,注册中心将该服务可用节点列表返回给服务调用者,这个过程叫服务发现,因服务高可用的要求,服务调用者会接收到多个节点,必须要从中进行选择。因此服务调用者一端必须内置负载均衡器,通过负载均衡策略选择合适的节点发起实质性的通信请求。

3、服务通信(Communication)

服务通信组件解决了问题3(3、服务间如何进行消息通信? )。服务间通信采用轻量级协议,通常是HTTP RESTful风格。但因为RESTful风格过于灵活,必须加以约束,通常应用时对其封装。例如在SpringCloud中就提供了Feign和RestTemplate两种技术屏蔽底层的实现细节,所有开发者都是基于封装后统一的SDK进行开发,有利于团队间的相互合作。

4、API服务网关(API Gateway)

服务网关主要是解决问题4(4、如何对使用者暴露服务API? ),对于最终调用方来说,微服务的通信与各种实现细节应该是透明的,调用者只需关注他要使用的 API 接口即可。因此微服务架构引入的服务网关控制用户的访问权限。服务网关是外部环境访问内部微服务的唯一途径,在这个基础上还可以扩展出其他功能,例如:用户认证与授权、容错限流、动态路由、A/B测试、灰度发布等。

微服务API网关

5、配置中心(Config Management)

配置中心主要解决了问题5(5、如何集中管理各节点配置文件? ),在微服务架构下,所有的微服务节点都包含自己的各种配置文件,如jdbc配置、自定义配置、环境配置、运行参数配置等。要知道有的微服务可能可能有几十个节点,如果将这些配置文件分散存储在节点上,发生配置更改就需要逐个节点调整,将给运维人员带来巨大的压力。配置中心便由此而生,通过部署配置中心服务器,将各节点配置文件从服务中剥离,集中转存到配置中心。一般配置中心都有UI界面,方便实现大规模集群配置调整。

重复的配置文件

配置中心集中管理配置文件

6、集中式日志管理(Centralized Logging)

集中式日志主要是解决了问题6(6、如何收集各节点日志并统一管理? )。微服务架构默认将应用日志分别保存在部署节点上,当需要对日志数据和操作数据进行数据分析和数据统计时,必须收集所有节点的日志数据。那么怎么高效收集所有节点的日志数据呢?业内常见的方案有ELK、EFK。通过搭建独立的日志收集系统,定时抓取各节点增量日志形成有效的统计报表,为统计和分析提供数据支撑。

7、分布式链路追踪(Distributed Tracing)

很不舒服链路追踪解决了问题7(7、如何直观的了解各节点间的调用链路? )。系统中一个复杂的业务流程,可能会出现连续调用多个微服务,我们需要了解完整的业务逻辑涉及的每个微服务的运行状态,通过可视化链路图展现,可以帮助开发人员快速分析系统瓶颈及出错的服务。

服务调用链路图

8、服务保护(Service Protection)

服务保护主要是解决了问题8(8、如何对系统进行链路保护,避免服务雪崩? )。在业务运行时,微服务间互相调用支撑,如果某个微服务出现高延迟导致线程池满载,或是业务处理失败。这里就需要引入服务保护组件来实现高延迟服务的快速降级,避免系统崩溃。

以上就是微服务架构包含的组件以及各个组件在架构中承担的职责。下篇文章我们来聊一下:在Java中如何实现微服务架构的。

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

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

相关文章

Java项目中使用事务

事务的四大特性 事务特性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 原子性是指事务包含的所有操作要么全部成功&#x…

HarmonyOS 开发-实现Swiper高度可变化效果

介绍 在很多应用中,swiper组件每一个page的高度是不一致的,所以需要swiper组件下方页面的高度跟着一起变化。 效果图预览 使用说明 向左滑动swiper组件,上方swiper组件高度变高,下方页面随着swiper的变化而平滑的变化。 实现思…

第十三届蓝桥杯C/C++大学B组真题题解(一)

1、扫雷 #include <bits/stdc.h> using namespace std; int n,m; const int N110; int g[N][N]; int dx[8]{-1,-1,-1,0,1,1,1,0}; int dy[8]{-1,0,1,1,1,0,-1,-1}; int dfs(int x,int y){int ans0;for(int i0;i<8;i){int axdx[i],bydy[i];if(a<0||a>n-1||b<0…

【RHEL】redhat yum 报错: not registered to Red Hat Subscription Management.

【RHEL】redhat yum 报错: not registered to Red Hat Subscription Management. 问题描述解决方法参考博客&#xff1a; 问题描述 使用redhat7用yum install -y dos2unix命令时出现这个错误 This system is not registered to Red Hat Subscription Management. You can use …

39.Python从入门到精通—parseString 方法 Python 解析XML实例 使用xml.dom解析xml

39.Python从入门到精通—parseString 方法 Python 解析XML实例 使用xml.dom解析xml parseString 方法Python 解析XML实例使用xml.dom解析xml parseString 方法 parseString 方法是 Python 标准库中 xml.dom.minidom 模块中的一个函数&#xff0c;用于解析 XML 字符串并构建 DO…

乳腺癌诊断的集成自注意力Transformer编码器

ETECADx: Ensemble Self-Attention Transformer Encoder for Breast Cancer Diagnosis Using Full-Field Digital X-ray Breast Images 内科医生和放射科医生建议使用多种方法来发现乳腺癌&#xff0c;包括数字乳房x线摄影(DM)、超声(US)和磁共振成像(MRI)。 CAD系统与乳腺x线…

深度学习【向量化(array)】

为什么要向量化 在深度学习安全领域、深度学习练习中&#xff0c;你经常发现在训练大量数据时&#xff0c;深度学习算法表现才更加优越&#xff0c;所以你的代码运行的非常快至关重要&#xff0c;否则&#xff0c;你将要等待非常长的时间去得到结果。所以在深度学习领域向量化…

java中使用雪花算法(Snowflake)为分布式系统生成全局唯一ID

&#xff08;全局唯一ID的解决方案有很多种&#xff0c;这里主要是介绍和学习Snowflake算法&#xff09; 什么是雪花算法&#xff08;Snowflake&#xff09; 雪花算法&#xff08;Snowflake Algorithm&#xff09;是由Twitter公司在2010年左右提出的一种分布式ID生成算法&…

有没有寄快递省钱的方法啊,尤其是搬家寄大件?

从大学开始离家&#xff0c;到读研&#xff0c;工作&#xff0c;辗转换了四五个城市了&#xff0c;大大小小搬家十几次&#xff0c;最近才发现有一个宝藏寄快递方法。 个人寄件贵是为什么呢&#xff1f;据我做物流的朋友说一般我们寄快递因为单量少&#xff0c;所以单件价格都…

Windows下Docker安装Kafka3+集群

编写 docker-compose.yaml 主要参照&#xff1a;https://www.cnblogs.com/wangguishe/p/17563274.html version: "3"services:kafka1:image: bitnami/kafka:3.4.1container_name: kafka1environment:- KAFKA_HEAP_OPTS-Xmx1024m -Xms1024m- KAFKA_ENABLE_KRAFTyes- K…

【一】学习TDengine-总结新技术学习的思考

学习TDengine-总结新技术学习的思考 概要 因业务场景需要我们开始接触时序数据库&#xff0c;于是开始根据以往的学习经验着手熟悉这一项新技术&#xff0c;学习也是一种技能&#xff0c;成功的人越容易成功&#xff0c;因为他们掌握了一套成功的方法&#xff0c;这里提到学习经…

windows 线程同步的四种方式总结

一&#xff1a;内核态下的三种同步方式&#xff1a; 一、互斥变量&#xff08;Mutex&#xff09; 互斥对象包含一个使用数量&#xff0c;一个线程ID和一个计数器。其中线程ID用于标识系统中的哪个线程当前拥有互斥对象&#xff0c;计数器用于指明该线程拥有互斥对象的次数。 创…

Vue的学习之旅-part5

Vue的学习之旅-part5 虚拟DOM的原理用JS模拟DOM结构 vue的方法、计算属性、过滤器computed:{} 计算属性computed计算属性的完全体computed计算属性和methods方法的区别&#xff1a;过滤器&#xff1a;filters:{ 多个方法 } Vuex 状态管理模式 前几篇博客: Vue的学习之旅-part1 …

【算法】第二篇 大衍数列

导航 1. 简介2. 数列特征3. 代码演示 1. 简介 大衍数列&#xff0c;来源于《乾坤谱》中对易传“大衍之数五十”的推论。主要用于解释中国传统文化中的太极衍生原理。数列中的每一项&#xff0c;都代表太极衍生过程中&#xff0c;曾经经历过的两仪数量总和。是中华传统文化中隐…

shell免登陆脚本

#!/bin/bash ## 脚本接收的参数&#xff0c;也就是要互相配置 SSH 免密登录的服务器列表参数 BASE_HOST_LISTip ## 密码&#xff0c;默认用户是当前运行脚本的用户&#xff0c;比如 root 用户 ## 这里改成你的用户对应的密码 BASE_PASSWORD"password" ## shell 函…

A Study of Network Forensic Investgation in Docker Environments文章翻译

A Study of Network Forensic Investgation in Docker Environments Docker环境下的网络取证研究 摘要 网络罪犯利用越来越多的技术(如虚拟机或基于容器的基础设施)进行恶意活动。 这些虚拟环境的固有动态简化了恶意服务的快速创建,并隐藏了所涉及的系统,这是以前没有的技…

Mybatis一级、二级缓存

Mybatis一级缓存 是SqlSession级别 1. 不同的sqlSession的相同查询是没有走缓存的 2. 相同的sqlSession的查询如果查询条件不同或期间进行过写操作也是不走缓存的 Mybatis二级缓存 是SqlSessionFactory级别 1.同一个SqlSeesionFactory创建的SqlSession查询结果会被缓存&#x…

c++ 对象切片

C对象切片&#xff08;Object Slicing&#xff09;是一个概念&#xff0c;指的是当派生类对象被赋值给基类对象时&#xff0c;只会复制基类部分的成员变量&#xff0c;派生类特有的成员变量将被丢弃。这可能导致数据丢失或不正确的行为。这种情况通常发生在使用值传递或赋值操作…

【考研复试上机】C++ ACM输入输出总结

输入字符串数组 此类输入一般会先在第一行输入长度n&#xff0c;再在第二行输入长度为n的数组。 数组可能会用空格隔开&#xff0c;如 3 aaa bbb cccint n; cin >> n; // 读取数组长度nstring s; cin.ignore(); // 忽略前一个输入的换行符 getline(cin, s); // 读取整…

用AI作图,使用这个免费网站,快看我画的大鹏鸟和美女

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…