SpringCloud
什么是 spring cloud?
Spring Cloud是⼀系列框架的有序集合。它利⽤Spring Boot的开发便利性巧妙地简化了分布式系统 基础设施的开发,如服务发现注册、配置中⼼、消息总 线、负载均衡、断路器、数据监控等,都可以 ⽤Spring Boot的开发⻛格做到⼀键启动和部署。 Spring Cloud并没有重复制造轮⼦,它只是将⽬前各家公司开发的⽐较 成熟、经得起实际考验的服 务框架组合起来,通过Spring Boot⻛格进⾏再封装屏蔽掉了复杂的配置和实现原理,最终给开发者 留出了⼀套简单易懂、易部署和易维护 的分布式系统开发⼯具包。
SpringCloud常见组件有哪些?
注册中心组件:Eureka、Nacos等
负载均衡组件:Ribbon 、Dubbo LB、SpringCloud Loadbalancer
熔断器:Hystrix 、 Sentinel
网关:Spring Cloud Gateway
配置中心:Spring Cloud Config 、 Nacos
服务调用:Feign 、 Dubbo RPC
消息驱动:Spring Cloud Stream
链路追踪: Spring Cloud Sleuth/Zipkin
事务分布: seata
Nacos与Eureka的区别有哪些?
Nacos与Eureka有相同点,也有不同之处,可以从以下几点来描述:
- 接口方式:Nacos与Eureka都对外暴露了Rest风格的API接口,用来实现服务注册、发现等功能
- 实例类型:Nacos的实例有永久和临时实例之分;而Eureka只支持临时实例
- 健康检测:Nacos对临时实例采用心跳模式检测,对永久实例采用主动请求来检测;Eureka只支持心跳模式
- 服务发现:Nacos支持定时拉取和订阅推送两种模式;Eureka只支持定时拉取模式
Sentinel的线程隔离与Hystix的线程隔离有什么差别?
Hystix默认是基于线程池实现的线程隔离,每一个被隔离的业务都要创建一个独立的线程池,线程过多会带来额外的CPU开销,性能一般,但是隔离性更强。
Sentinel是基于信号量(计数器)实现的线程隔离,不用创建线程池,性能较好,但是隔离性一般。
RabbitMQ如何确保消息的不丢失?
(1)生产者开启确认机制,通过setConfirmCallback回调函数,确认信息是否到达交换机。通过 setReturnCallback回调函数,确认信息是否到达消息队列,进行后续处理。
(2)消息存储在rabbitMQ中,为了防止消息丢失,需要将消息进行持久化。
(3)消费阶段,将Rabbitmq的确认方式改为手动确认消息。消费方拿到消息以后,正确处理完业务以后,在调用 basicAck方法手动确认消息。如果业务处理错误,调用basicNack方法,将消息放回到队列中,重新从队列中 获取消息。
RabbitMQ如何保证消息的有序性?
其实RabbitMQ是队列存储,天然具备先进先出的特点,只要消息的发送是有序的,那么理论上接收也是有序的。不过当一个队列绑定了多个消费者时,可能出现消息轮询投递给消费者的情况,而消费者的处理顺序就无法保证了。
因此,要保证消息的有序性,需要做的下面几点:
- 保证消息发送的有序性
- 保证一组有序的消息都发送到同一个队列
- 保证一个队列只包含一个消费者
如何防止MQ消息被重复消费?
消息重复消费的原因多种多样,不可避免。所以只能从消费者端入手,只要能保证消息处理的幂等性就可以确保消息不被重复消费。
而幂等性的保证又有很多方案:
- 给每一条消息都添加一个唯一id,在本地记录消息表及消息状态,处理消息时基于数据库表的id唯一性做判断
- 同样是记录消息表,利用消息状态字段实现基于乐观锁的判断,保证幂等
- 基于业务本身的幂等性。比如根据id的删除、查询业务天生幂等;新增、修改等业务可以考虑基于数据库id唯一性、或者乐观锁机制确保幂等。本质与消息表方案类似。
Redis的单线程问题
Redis快的主要原因是:
- 完全基于内存
- 数据结构简单,对数据操作也简单
- 使用多路 I/O 复用模型,充分利用CPU资源
单线程优势有下面几点:
- 代码更清晰,处理逻辑更简单
- 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为锁而导致的性能消耗
- 不存在多进程或者多线程导致的CPU切换,充分利用CPU资源
Redis的持久化方案由哪些?
(1)RDB 持久化
RDB持久化可以使用save或bgsave,为了不阻塞主进程业务,一般都使用bgsave,流程:
- Redis 进程会 fork 出一个子进程(与父进程内存数据一致)。
- 父进程继续处理客户端请求命令
- 由子进程将内存中的所有数据写入到一个临时的 RDB 文件中。
- 完成写入操作之后,旧的 RDB 文件会被新的 RDB 文件替换掉。
(2)AOF 持久化
AOF(append only file)是Redis的另一种持久化方式。Redis默认情况下是不开启的。开启AOF持 久化后,Redis 将所有对数据库进行过写入的命令及其参数记录到 AOF 文件, 以此达到记录数据库状 态的目的,这样当Redis重启后只要按顺序回放这些命令就会恢复到原始状态了。AOF会记录过程,RDB 只管结果。
Redis事务机制
Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH 四个原语实现的。Redis会将一个事务中的所有命令序列化,然后按顺序执行。但是Redis事务不支持回滚操作,命令运行出错后,正确的命令会继续执行。
Redis事务其实是把一系列Redis命令放入队列,然后批量执行,执行过程中不会有其它事务来打断。不过与关系型数据库的事务不同,Redis事务不支持回滚操作,事务中某个命令执行失败,其它命令依然会执行。
为了弥补不能回滚的问题,Redis会在事务入队时就检查命令,如果命令异常则会放弃整个事务。
Redis的Key过期策略
noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间(server.db[i].dict)中,移除最近最少使用的 key(这个是最常用的)。
allkeys-random:当内存不足以容纳新写入数据时,在键空间(server.db[i].dict)中,随机移除某个 key。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,移除最近最少使用的 key。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,随机移除某个 key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,有更早过期时间的 key 优先移除。
Redis的缓存击穿、缓存雪崩、缓存穿透
缓存击穿:
客户端,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓 存,并返回结果,数据库也没取到,那直接返回空结果。
解决缓存穿透问题
对查询结果为空的情况进行缓存,缓存时间(ttl)设置短一点,或者该key对应的数据insert了之后
清理缓存
缓存雪崩:
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。
和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不
到从而查数据库。
如何解决缓存雪崩
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
如果缓存数据库是分布式集群部署,将热点数据均匀分布在不同的缓存数据库中。
设置热点数据永远不过期。
缓存击穿:
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,
同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
如何解决缓存击穿问题
1 设置热点数据永远不过期。
2 加互斥锁
ES是什么
Elaticsearch简称为ES,是一个开源的可扩展的分布式的全文检索引擎,它可以近乎实时的存储、检索数据。本身扩展性很好,可扩展到上百台服务器,处理PB级别的数据。ES使用Java开发并使用Lucene作为其核心来实现索引和搜索的功能,但是它通过简单的RestfulAPI和javaAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。
ES中的一些基本概念
node
节点,部署Elasticsearch程序的服务器
cluster
集群,多个节点组成的架构
index
索引,相当于关系型数据库的database
document
文档,类似于关系型数据库的row
属性介绍
字段名:任意填写
type:类型,可以是text、keyword、long、short、date、integer、boolean、object
index:是否索引,默认为true
analyzer:指定分词器
分布式文件系统
优点:
扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;
高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的
完整和一致性;
弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中
断系统运行。
缺点:
系统复杂度稍高,需要更多服务器。
FastDFS简介
FastDFS是用C语言编写的一款开源的轻量级分布式文件系统。它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合 以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS特性
分组存储,灵活简洁、对等结构,不存在单点
文件不分块存储,上传的文件和OS文件系统中的文件一一对应
和流行的web server无缝衔接,FastDFS已提供apache和nginx扩展模块
中、小文件均可以很好支持,支持海量小文件存储
支持多块磁盘,支持单盘数据恢复
支持相同内容的文件只保存一份,节约磁盘空间
支持在线扩容 支持主从文件
下载文件支持多线程方式,支持断点续传
客户端(client)
客户端(client),作为业务请求的发起方,通过专有接口,与跟踪器服务器或存储节点进行数据交 互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客 户端库的方式提供给用户使用。
跟踪器(tracker)
Trackerserver(追踪服务器或调度服务器)作用是负载均衡和调度,通过Tracker server在文件上 传时可以根据一些策略找到Storage server。 Tracker是FastDFS的协调者,负责管理所有的storage server,每个storage在启动后会连接 Tracker, 告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立 group==>[storage server list]的映射表。
存储节点(storage)
Storageserver作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server 没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器。 存储节点中的服务器均可以随时增加或下线而不会影响线上服务。 Storageserver以组为单位组织,一个group内包含多台storage机器,数据互为备份。以group为单 位组织存储能方便的进行应用隔离、负载均衡、副本数定制,比如将不同应用数据存到不同的group就 能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡。如果某个 group中添加新的节点,此时整个组都不对外提供服务。等组内的节点同步完成以后,在对外提供服务。
Nginx简介
Nginx 是⼀个⾼性能的HTTP和反向代理web服务器,核⼼特点是占有内存少,并发能⼒强。可以当做 Http服务器 和 反向代理服务器。
优势:
跨平台:Nginx可以在⼤多数类unix操作系统上编译运⾏,⽽且也有windows版本 Nginx的上手非常容易,配置也⽐较简单
高并发,性能好 稳定性也特别好,宕机概率很低
正向代理与反向代理
正向代理
在浏览器中配置代理服务器的相关信息,通过代理服务器访问⽬标⽹站,代理服务器收 到⽬标⽹站的 响应之后,会把响应信息返回给我们⾃⼰的浏览器客户端
反向代理
浏览器客户端发送请求到反向代理服务器(⽐如Nginx),由反向代理服务器选择原始 服务器提供服 务获取结果响应,最终再返回给客户端浏览器
负载均衡服务器
负载均衡,当⼀个请求到来的时候,Nginx反向代理服务器根据请求去找到⼀个 原始服务器来处理当前请求,那么这叫做反向代理。那么,如果⽬标服务器有多台找哪⼀个⽬标服务器来处理当前请求呢,这样个寻找确定的过程就叫做负载均衡。
⽣活中也有很多这样的例⼦,⽐如,我们去银⾏,可以处理业务的窗⼝有多个,那么我们会 被分配到哪个窗⼝呢到底,这样的⼀个过程就叫做负载均衡。
Nginx的核⼼配置⽂件conf/nginx.conf包含三块内容:全局块、events块、 http块
全局块
从配置⽂件开始到events块之间的内容,此处的配置影响nginx服务器整体的运⾏,⽐如worker进 程 的数量、错误⽇志的位置等
events块
events块主要影响nginx服务器与⽤户的⽹络连接,⽐如worker_connections 1024,标识每个 workderprocess⽀持的最⼤连接数为1024
http块
http块是配置最频繁的部分,虚拟主机的配置,监听端⼝的配置,请求转发、反向代理、负载均衡等
标签:文件,存储,缓存,SpringCloud,数据库,Redis,服务器 From: https://www.cnblogs.com/sccx/p/16930164.html