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

“分布式”与“集群”初学者的技术总结

一、“分布式”与“集群”的解释:

        分布式:把一个囊肿的系统分成无数个单独可运行的功能模块
        集群: 把相同的项目复制进行多次部署(可以是一台服务器多次部署,例如使用8080部署一个,8081部署一个,也可以是a服务器部署一个,b服务器上部署一个,使用nginx类似的软件做负载均衡并轮询转发)

二、为什么要用分布式?

        首先是项目工程无节制的变得臃肿庞大,今天增加一个业务,明天扩展一个模块,系统复杂度增加,大几十万行代码,几十个开发人员,service层,dao层代码大量被copy使用,经常有各种代码合并冲突要处理,非常耗时间。经常是我改动了自己的代码,但别人调用了我的接口,导致他的代码也出现问题,需要重新测试,很麻烦。
        每次发布都是几十万行代码的系统一起发布,大家都提心吊胆准备上线,几十万行代码的上线每次要做很多检查,需要处理很多异常问题,每个人都高度紧张,被搞得几乎崩溃。
        而且我现在有个新业务,打算把相关依赖升级一下,比如升级到最新的spring版本,还不行,因为可能会导致别人的代码报错,不敢随便改技术。并且一个web工程每次启动都需要好几分钟时间,本地IDE里面调试一次代码都很痛苦。
        其次随着用户访问流量的增加,系统负载压力加大,变得不堪重负,通过增加实例数,增加硬件扩容能够带来的效果已经微乎其微,故障频发,效率低下。系统质量也越来越难以保证,测试周期也变得越来越长,无法满足公司业务的发展需要。

三、主流分布式框架的现状与选择

1. 为什么要用Dubbo或springcloud
        1.1 目前国内主流的分布式框架是Dubbo和spring cloud,国外Spring Cloud 基本已经统一国外的微服务体系,国内老的系统使用 Dubbo 较多,新的系统使用 Spring Cloud 较多。不用Dubbo和spring cloud等服务框架当然也是可以的,但是这就需要自己处理很多事情了。比如,各个子系统走restful接口调用,那么就是http调用,这时比如传送过去一个对象,就要自己搞成一个json,然后一次调用失败后重试怎么做?
    另外,一般来说都是集群部署,目标系统有多个实例,那么自己还要写一个负载均衡算法,如何每次随机从多个目标机器中挑选一个来调用?
    还有,目标系统扩容新部署一个实例, 或者服务器故障下线了一个实例,如何动态让调用方感知到呢?诸如此类很多问题,如果不用服务框架的话,自己这么瞎搞,会遇到各种各样的问题。
    俗话说的好站在巨人的肩膀上才能看的更远,有现成的技术不用白不用
2. Dubbo的由来以及现状
       2.1 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现,可以和Spring框架无缝集成。
        2.2 交给Apache开源社区维护后,维护版本叫springcloud Alibaba,Spring Cloud Alibaba的出现,将Dubbo生态完美的与Spring Cloud生态融合在一起。不用再纠结选择Dubbo还是Spring Cloud,两者可以兼容的很好
3. 原生springcloud与springcloudAlibaba怎么选择?
       3.1我们现在所使用的 Spring Cloud 技术体系,实际上是 Spring Cloud Netflix 为主,例如说:
Netflix Eureka 注册中心
Spring Cloud Config 配置中心
Netflix Hystrix 熔断组件
Netflix Ribbon 负载均衡
Netflix Zuul 网关服务 
Feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service随着Spring Cloud Netflix 不再开发新的组件,项目进入维护模式
        3.2 目前 Alibaba 基于开源组件和多个阿里云产品组成以及Spring Cloud 对的接口,实现了一套 Spring Cloud Alibaba 技术体系,并且已经获得 Spring Cloud 的认可,目前在国内使用人数很多了。组件如下:
Nacos 注册中心 + 配置中心,对标 Eureka + Spring Cloud Config 。
Sentinel 服务保障,对标 Hystrix熔断组件 。
Dubbo 服务调用( 包括负载均衡 ),对标 Ribbon + Feign 。
Gateway 网关服务。

四、服务调用,该模块主要功能为负责各微服务之间的通讯, 实现服务端的远程调用,常用技术对比RestTemplate、Feign、OpenFeign。

五、2 张图对比目前的注册中心组件 

六、负载均衡模块对比。


该模块主要功能是负责将 请求经过一定策略均衡的分配到服务端,当我们的服务提供端同一个服务配置额多个实例(集群)时,就需要负载均衡模块协助分配请求到对应服务实例,如果服务配置单个,就不要此模块,但是为了保证高可用都会配置多个实例。

常见负载均衡策略:轮询、随机、权重轮询、ip hash、根据响应时间计算、最优策略等。

七、服务降级、熔断(容错)

服务降级、熔断、限流是微服务架构保证高可用的得力助手,之所以出现这三兄弟,是因为我们的微服务与微服务直接相互调用,错综复杂,调用链路很长,如果微服务体系中某个服务宕机,就会造成微服务系统瘫痪

服务降级: 在服务调用(消费)端做的一种兜底措施,当服务器处理结果不符合预期(服务响应超时、服务出错、宕机等),就把兜底的结果返回客户,以此保证服务消费方正常运行,不至于死等服务器结果,链路积压崩溃。
服务熔断:发生在服务提供方,包含三个状态,降级->熔断->恢复。当满足熔断条件时就会触发熔断,触发熔断首先会降级处理,返回兜底数据,然后开启熔断,熔断开启后,不管三七二十一,请求正确与否,都会在一段时间内返回兜底数据,然后尝试恢复,也就是放行请求,如果请求处理正常,就会关闭熔断。(后面章节会代码演示)
服务限流:服务限流是为了让服务器平稳的处理请求,也是对服务的一种保护措施,不至于把服务拖死,比如我的服务10S内最多同时处理50个请求,突然间来了100个请求,50个以外要么排队要么丢弃,同一时间内我的服务只处理50个请求,如果不做限流,100个请求压在服务端,服务器忙不过来的!就有崩溃风险。

常见主流的技术: HyStrix、Sentinel、Resilience4j(国外使用)

八、 网关

网关的功能
针对所有请求进行登陆统一鉴权(登录态)、限流、缓存、日志(用户打点)。
可以根据不同的请求路径pattern,来进行请求的鉴权、转发、和拒绝。
协议转化。针对后段多种不同的协议,在网关层统一处理后以HTTP对外提供服务。
提供统一的错误码。
请求转发,并且可以基于网关实现内网与外网的隔离。Gateway(网关-Gateway - 知乎)
目前主流的网关(Gateway,与zuul)

Gateway和ZUUL介绍:网关-Gateway - 知乎

目前主流技术为getway,zuul已经跟不上时代步伐了,因为他底层采用的是servlet,servlet是一种阻塞io,满足不了高并发场景,而且不支持任何长连接,而getway后期新秀,底层采用netty做支撑,是一种异步非阻塞io,处理请求能力远远强于 servlet
 

九、配置中心


配置中心的存在主要是为了解决大量微服务下的公共配置以及动态配置问题,我们都知道,每个微服务是由springboot做支撑,每个springboot项目都会有一个application的配置文件,如果某些配置发生变化,得一个一个服务去修改,这样加大维护工作量,特别是运维老哥! 另外每次修改配置还得重启服务,因此对动态配置也有强烈需求,基于这样的背景而产生配置中心模块。

常见配置中心技术支持有: springCloud config,nacos(主流并替换个config)。

十、服务总线


服务总线,顾名思义他是为我们所有服务提供服务,在微服务体系中通常会有一些公共的消息,比如上步骤提到的动态配置,就需要服务总线的支撑,各个微服务向服务总线订阅消息,进而监听总线,当总线发生变动时,订阅的服务可以感知,然后同步更新自己,服务总线一般搭配着消息中间件,如RabbitMq(MQ)、kafka等,此外服务总线还具有定点通知某个或多个服务的功能

总之服务总线就像一个妈妈管着一群孩子一样,通过妈妈向所有孩子或者某个孩子传达消息,从而改变孩子的某些行为或功能。

十一、分布式框架的最终选型

在这里插入图片描述

 

在这里插入图片描述

在这里插入图片描述

 所以说,不管是从微服务一站式解决方面来说,还是从项目长期维护上面来说,alibaba替代springcloud已经成为了一种必然趋势

 

总结技术栈:*


    反向代理:nginx,可做动静分离部署
    统一网关:基于spring-cloud-gateway,配合JWT进行的简单的验权操作
    分布式事务:Spring Cloud Alibaba Seata,阿里内部分布式事务产品不断迭代演进而来。
    降级、限流:hysrix/Spring Cloud Alibaba Sentinel
    服务注册\发现:Spring Cloud Alibaba Nacos
    分布式配置中心:Spring Cloud Alibaba Nacos
    客户端负载均衡:openFeign
    异步消息:RocketMQ,阿里开源,交由Apache孵化
    链路跟踪:Skywalking,华为开源,交由Apache孵化
    分布式缓存:Redis,基础数据缓存
    健康监控:spring-boot-admin
    分布式锁:Redission
    代码简化:Lambok,mybatis-plus,mybatis-generator
    RPC框架:apache dubbo

   

相关文章:

“分布式”与“集群”初学者的技术总结

一、“分布式”与“集群”的解释: 分布式:把一个囊肿的系统分成无数个单独可运行的功能模块 集群: 把相同的项目复制进行多次部署(可以是一台服务器多次部署,例如使用8080部署一个,8081部署一个&#xff0c…...

C++day5(静态成员、类的继承、多继承)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.静态数据成员静态成员函数&#xff08;银行账户实例&#xff09; #include <iostream>using namespace std;class BankAccount { private:double balance; //余额static double interest_rate; //利率 p…...

2023MySQL+MyBatis知识点整理

文章目录 主键 外键 的区别&#xff1f;什么是范式&#xff1f;什么是反范式&#xff1f;什么是事务&#xff1f;MySQL事务隔离级别&#xff1f;MySQL事务默认提交模式&#xff1f;MySQL中int(1)和int(10)的区别MySQL 浮点数会丢失精度吗&#xff1f;MySQL支持哪几种时间类型&a…...

【随笔】如何使用阿里云的OSS保存基础的服务器环境

使用阿里云OSS创建一个存储仓库&#xff1a;bucket 在Linux上下载并安装阿里云的ossutil工具 // 命令行&#xff0c;是linux环境 3. 安装ossutil。sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash 说明:安装过程中&#xff0c;需要使用解压工具…...

汽车电子笔记之:AUTOSA架构下的多核OS操作系统

目录 1、AUTOSAR多核操作系统 1.1、OS Application 1.2、多核OS的软件分区 1.3、任务调度 1.4、核间任务同步 1.5、计数器、报警器、调度表 1.6、自旋锁与共享资源 1.7、核间通信IOC 1.8、OS Object中元素交互 1.9、多核OS的启动与关闭 2、多核OS注意事项 2.1、最小…...

解决华为云ping不通的问题

进入华为云控制台。依次选择&#xff1a;云服务器->点击服务器id->安全组->更改安全组->添加入方向规则&#xff0c;添加一个安全组规则&#xff08;ICMP&#xff09;&#xff0c;详见下图 再次ping公网ip就可以ping通了 产生这一问题的原因是ping的协议基于ICMP协…...

数据结构入门 — 链表详解_双向链表

前言 数据结构入门 — 双向链表详解* 博客主页链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 文章末尾有源码 *****感谢观看&#xff0c;希望对你有所帮助***** 系列文章 第一篇&#xff1a;数据结构入门 — 链表详解_单链表…...

时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比)

时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测&#xff08;含KELM、ELM等对比&#xff09; 目录 时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测&#xff08;含KELM、ELM等对比&#xff09;预测效果基本介绍模型介绍程序设计参…...

SSL/TLS协议的概念、工作原理、作用以及注意事项

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、SSL/TLS协议的基本概念 二、SSL/TLS的工作…...

[Stable Diffusion教程] 第一课 原理解析+配置需求+应用安装+基本步骤

第一课 原理解析配置需求应用安装基本步骤 本次内容记录来源于B站的一个视频 以下是自己安装过程中整理的问题及解决方法&#xff1a; 问题&#xff1a;stable-diffusion-webui启动No Python at ‘C:\xxx\xxx\python.exe‘ 解答&#xff1a;打开webui.bat 把 if not de…...

uniapp结合Canvas+renderjs根据经纬度绘制轨迹(二)

uniapp结合Canvasrenderjs根据经纬度绘制轨迹 文章目录 uniapp结合Canvasrenderjs根据经纬度绘制轨迹效果图templaterenderjsjs数据结构 ​ 根据官方建议要想在 app-vue 流畅使用 Canvas 动画&#xff0c;需要使用 renderjs 技术&#xff0c;把操作canvas的js逻辑放到视图层运…...

VR全景加盟会遇到哪些问题?全景平台会提供什么?

想创业&#xff0c;你是否也遇到这些问题呢&#xff1f;我是外行怎么办&#xff1f;没有团队怎么办&#xff1f;项目回本周期快吗&#xff1f;项目靠谱吗&#xff1f;加盟平台可信吗&#xff1f;等等这类疑问。近几年&#xff0c;VR产业发展迅速&#xff0c;尤其是VR全景项目在…...

如何进行微服务的集成测试

集成测试的概念 说到集成测试&#xff0c;相信每个测试工程师并不陌生&#xff0c;它不是一个崭新的概念&#xff0c;通过维基百科定义可以知道它在传统软件测试中的含义。 Integration testing (sometimes called integration and testing, abbreviated I&T) is the pha…...

spark grpc 在master运行报错 exitcode13 User did not initialize spark context

程序使用sparksql 以及protobuf grpc &#xff0c;执行报错 ApplicationMaster: Final app status: FAILED, exitCode: 13, (reason: Uncaught exception: java.lang.IllegalStateException: User did not initialize spark context! 先说原因 &#xff1a; 1.使用了不具备权限…...

nginx 反向代理的原理

Nginx&#xff08;发音为"engine X"&#xff09;是一个高性能、轻量级的开源Web服务器和反向代理服务器。它的反向代理功能允许将客户端的请求转发到后端服务器&#xff0c;然后将后端服务器的响应返回给客户端。下面是Nginx反向代理的工作原理&#xff1a; 1.客户端…...

【SpringBoot】第二篇:RocketMq使用

背景&#xff1a; 本文会介绍多种案例&#xff0c;教大家如何使用rocketmq。 一般rocketmq使用在微服务项目中&#xff0c;属于分模块使用。这里使用springboot单体项目来模拟使用。 本文以windows系统来做案例。 下载rocketmq和启动&#xff1a; RocketMQ 在 windows 上运行…...

飞天使-vim简单使用技巧

此文是记录技巧使用&#xff0c;如果想节约时间&#xff0c;可以直接看最后一个章节 vim 的介绍 vim号称编辑器之神&#xff0c;唯快不破&#xff0c;可扩展&#xff0c;各种插件满天飞。 vi 1991 vim 1.14 vim四种模式 普通模式: 移动光标&#xff0c; 删除文本&#xff0c…...

分布式搜索引擎----elasticsearch

目录 1、初识elasticsearch 1.1、什么是elasticsearch 1.2.ELK技术栈 2、正向索引和倒排索引 2.1、正向索引 2.2、倒排索引 2.3、正向索引和倒排索引的区别 3、elasticsearch中的概念理解 3.1、文档和字段 3.2、索引和映射 3.3、mysql与elasticsearch 1、初识elasti…...

AnnotationConfigApplicationContext类和ClasspathXmlApplicationContext类的区别?

在 Spring Framework 中&#xff0c;AnnotationConfigApplicationContext 和 ClasspathXmlApplicationContext 是两个不同的应用程序上下文实现&#xff0c;用于配置和管理 Spring Bean 容器。它们之间的主要区别在于配置的方式和使用场景。 1. **AnnotationConfigApplication…...

使用VSCode SSH实现公网远程连接本地服务器开发的详细教程

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

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

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

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...