Redis
本质上是一个 Key-Value 类型的内存数据库,很像memcached
,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬 盘上进行保存。
因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的 Key-Value DB。
Redis 的出色之处不仅仅是性能,Redis 最大的魅力是支持保存多种数据结构,此外单个 value 的最大 限制是 1GB,不像memcached 只能保存 1MB 的数据,因此 Redis 可以用来实现很多有用的功能。
比方说用他的 List 来做FIFO 双向链表
,实现一个轻量级的高性 能消息队列服务,用他的 Set 可以做 高性能的 tag 系统等等。
另外 Redis 也可以对存入的 Key-Value 设置 expire 时间,因此也可以被当作一 个功能加强版的 memcached 来用。 Redis 的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能 读写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。
Redis 与 memcached 相比有哪些优势
1.memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰富的数据类型
2.redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多
3.redis 可以持久化其数据
Redis 支持哪几种数据类型?
String、List、Set、Sorted Set、Hash
为什么 Redis 需要把所有数据放到内存中?
Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。
所以 redis 具有快速和数据持久化的特征,如果不将数据放在内存中,磁盘 I/O 速度为严重影响 redis 的性能。
Redis 哈希槽的概念
Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。
Redis 集群的主从复制模型是怎样的?
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型, 每个节点都会有 N-1 个复制品.
Redis 中的管道有什么用?
一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应,这样就可以将多个命令发送到服务 器,而不用等待回复,最后在一个步骤中读取该答复。
这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多 POP3 协议已经实现支持这个 功能,大大加快了从服务器下载新邮件的过程。
怎么理解 Redis 事务?
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行的过程中,不会 被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
Redis 如何做内存优化?
尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该 尽可能的将你的数据模型抽象到一个散列表里面。
比如你的 web 系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而 是应该把这个用户的所有信息存储到一张散列表里面。
Redis 分布式锁怎么实现
先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。
应用场景:不同的定时任务有且只能一个节点执行
特性:
保证同一个方法在某一时刻只能在一台机器里一个进程中一个线程执行;要保证是可重入锁(避免死锁)->同一个线程(已获取到锁)还可以获得锁;要保证获取锁和释放锁的高可用;
setnx缺点:不支持超时时间,如果一个线程在执行时出现异常或超时导致锁未及时释放,那么这块资源将被一直锁住,其他线程也进不来.
Redis 2.6.12以上版本为set指令增加了可选参数,伪代码如下:set(key,1,30,NX),这样就可以取代setnx指令
场景1: 超时后使用del 导致误删其他线程的锁
线程A执行到超时时间,然后锁的超时时间已到自动释放,此时b线程进来,而这个时候A线程执行完毕,A需要删除锁(可能删除b线程的锁),所以在释放锁的时候需要用lua脚本:
String luaScript = 'if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end';redisClient.eval(luaScript , Collections.singletonList(key), Collections.singletonList(threadId));
方案解决2: 让获得锁的线程开启一个守护线程,用来给快要过期的锁“续航”。当过去了29秒,线程A还没执行完,这时候守护线程会执行expire指令,为这把锁“续命”20秒。守护线程从第29秒开始执行,每20秒执行一次。
当线程A执行完任务,会显式关掉守护线程。
Redission和RedisLockRegistry区别
RedisLockRegistry通过本地锁(ReentrantLock)和redis锁,双重锁实现,Redission通过Netty Future机制、Semaphore (jdk信号量)、redis锁实现。RedisLockRegistry和Redssion都是实现的可重入锁。RedisLockRegistry对锁的刷新没有处理,Redisson通过Netty的TimerTask、Timeout 工具完成锁的定期刷新任务。RedisLockRegistry仅仅是实现了分布式锁,而Redisson处理分布式锁,还提供了了队列、集合、列表等丰富的API。缓存穿透?如何避免?什么是缓存雪崩?何如避免?
缓存穿透
一般的缓存系统,都是按照 key 去缓存查询,如果不存在对应的 value,就应该去后端系统查找(比如 DB)。一些恶意的请求会故意查询不存在的 key,请求量很大,就会对后端系统造成很大的压力。这就叫 做缓存穿透。
如何避免?
对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该 key 对应的数据 insert 了之后清
理缓存。对一定不存在的 key 进行过滤。可以把所有的可能存在的 key 放到一个大的 Bitmap 中,查询时通过 该 bitmap 过滤。
缓存雪崩
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压 力。导致系统崩溃。
如何避免?
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个
线程查询数据和写缓存,其他线程等待。做二级缓存,A1 为原始缓存,A2 为拷贝缓存,A1 失效时,可以访问 A2,A1 缓存失效时间设置
为短期,A2 设置为长期不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀
Spring
Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。
Spring 帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。
Spring 框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成 Spring 框 架,不必担心 Spring 是如何在后台进行工作的。
Spring 框架至今已集成了 20 多个模块。这些模块主要分为核心容器、数据访问/集
成,、Web、AOP(面向切面编程)、工具、消息和测试模块。
使用 Spring 框架能带来哪些好处?
Dependency Injection(DI) 方法使得构造器和 JavaBean properties 文件中的依赖关系一
目了然。
与 EJB 容器相比较,IoC 容器更加趋向于轻量级。这样一来 IoC 容器在有限的内存和 CPU 资源的情况下进行应用程序的开发和发布就变得十分有利。
Spring 并没有闭门造车,Spring 利用了已有的技术比如 ORM 框架、logging 框架、J2EE、Quartz 和 JDK Timer,以及其他视图技术。
Spring 框架是按照模块的形式来组织的。由包和类的编号就可以看出其所属的模块,开发者仅 仅需要选用他们需要的模块即可。
要测试一项用 Spring 开发的应用程序十分简单,因为测试相关的环境代码都已经囊括在框架中 了。更加简单的是,利用 JavaBean 形式的 POJO 类,可以很方便的利用依赖注入来写入测试数据。
Spring 的 Web 框架亦是一个精心设计的 Web MVC 框架,为开发者们在 web 框架的选择上 提供了一个除了主流框架比如 Struts、过度设计的、不流行 web 框架的以外的有力选项。
Spring 提供了一个便捷的事务管理接口,适用于小型的本地事物处理(比如在单 DB 的环境下)和复杂的共同事物处理(比如利用 JTA 的复杂 DB 环境)。
什么是控制反转(IOC)?什么是依赖注入
控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对 象之间耦合关系在编译时通常是未知的。在传统的编程方式中,业 务逻辑的流程是由应用程序中的 早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配 器负责实例化,这种实现方式还可以将对象之间的关联关系的定 义抽象化。而绑定的过程是通过“依赖注入”实现的。
控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在我们的实际工作中起到 了有效的作用。
依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下,将其他对象所依赖的功能对象 实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能,所以依赖注入是控制反 转的基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件?
在 Java 中依然注入有以下三种实现方式:
构造器注入Setter 方法注入接口注入
请解释下 Spring 框架中的 IoC?
Spring 中的org.springframework.beans
包和org.springframework.context
包构成了 Spring 框架IoC
容器的基础。
BeanFactory
接口提供了一个先进的配置机制,使得任何类型的对象的配置成为可能。
ApplicationContex
接口对BeanFactory
(是一个子接口)进行了扩展,在BeanFactory
的基础上添加了其他功能,比如与 Spring 的 AOP 更容易集成,也提供了处理message resource
的机制(用于国际化)、事件传播以及应用层的特别配置,比如针对 Web 应用的WebApplicationContext
。
org.springframework.beans.factory.BeanFactory
是Spring IoC
容器的具体实现,
用来包装和管理前面提到的各种bean
。BeanFactory
接口是Spring IoC
容器的核心接口。
IOC:把对象的创建、初始化、销毁交给 spring 来管理,而不是由开发者控制,实现控制反转
BeanFactory 和 ApplicationContext 有什么区别?
BeanFactory 可以理解为含有 bean 集合的工厂类。BeanFactory 包含了种 bean 的定义,以便在接收到客户端请求时将对应的 bean 实例化。
BeanFactory 还能在实例化对象的时生成协作类之间的关系。此举将 bean 自身与 bean 客户端的 配置中解放出来。BeanFactory
还包含 了bean 生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
从表面上看,application context
如同bean factory
一样具有bean
定义、bean 关联关系的设 置,根据请求分发bean
的功能。但applicationcontext
在此基础上还提供了其他的功能。
提供了支持国际化的文本消息统一的资源文件读取方式已在监听器中注册的 bean 的事件
Spring 有几种配置方式?
基于 XML 的配置基于注解的配置基于 Java 的配置请解释 Spring Bean 的生命周期?
通过构造器或工厂方法创建bean实例;(实例化) Instantiation为bean的属性赋值;(属性赋值)Instantiation调用bean的初始化方法;(初始化)Initialization使用bean;当容器关闭时,调用bean的销毁方法;(销毁)Destruction说明:
实例化:指创建类实例(对象)的过程。比如使用构造方法new对象,为对象在内存中分配空间。(要创建对象,但是并未生成对象)初始化:指为类中各个类成员(被static修饰的成员变量)赋初始值的过程,是类生命周期中的一个阶段。简单理解为对象中的属性赋值的过程。(对象已经生成,为其属性赋值)属性赋值:给类中注入的对象赋值或者其它成员变量销毁:不会被立即gc,只是在调用时不推荐使用(销毁的bean可能少些东西)
一句话概括:一个对象是需要内存去存放的。所以会有一个分配内存的过程。分配了内存之后,jvm
便会开始创建对象,并将它赋值给a 变量
。然后再去初始化A
中的一些属性,并执行A
的构造方法。在初始化的过程中,会先执行static
代码块,再执行构造方法。除此之外,如果有父类,会优先父类的进行执行。
Spring Bean 的作用域之间有什么区别?
Spring 容器中的 bean 可以分为 5 个范围。所有范围的名称都是自说明的,但是为了避免混淆,还 是让我们来解释一下:
singleton:这种 bean 范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个
bean 的实例,单例的模式由 bean factory 自身来维护。prototype:原形范围与单例范围相反,为每一个 bean 请求提供一个实例。request:在请求 bean 范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,
bean 会失效并被垃圾回收器回收。Session:与请求范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,bean
会随之失效。global- session:global-session
和Portlet
应用相关。当你的应用部署在 Portlet 容器中工作时,它包含很多 portlet。如果 你想要声明让所有的 portlet 共用全局的存储变量的话,那么这全局变量需要存储在global-session
中。全局作用域与 Servlet 中的 session 作用域效果相同。
Spring 框架中的单例 Beans 是线程安全的么?
Spring 框架并没有对单例 bean 进行任何多线程的封装处理。关于单例 bean 的线程安全和并发问 题需要开发者自行去搞定。但实际上,大部分的 Spring bean 并没有可变的状态(比如 Serview 类 和 DAO 类),所以在某种程度上说 Spring 的单例 bean 是线程安全的。如果你的 bean 有多种状 态的话(比如 View Model 对象),就需要自行保证线程安全。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
最浅显的解决办法就是将多态 bean 的作用域由“singleton”
变更为“prototype”
。
Spring Bean 的自动装配?
自动装配就是让应用程序上下文为你找出依赖项的过程。说的通俗一点,就是Spring会在上下文中自动查找,并自动给bean装配与其关联的属性!
举例解释@Required 注解?
@Required注释为为了保证所对应的属性必须被设置,@Required
注释应用于bean
属性的setter
方法,它表明受影响的bean
属性在配置时必须放在XML 配置文件
中,否则容器就会抛出一个BeanInitializationException
异常。直接的理解就是,如果你在某个java
类的某个set
方法上使用了该注释,那么该set方法对应的属性在xml配置文件中必须被设置,否则就会报错!!!
@Autowired 注解?
@Autowired 注解对自动装配何时何处被实现提供了更多细粒度的控制。
@Autowired 注解可 以像@Required
注解、构造器一样被用于在 bean 的设值方法上自动装配 bean 的属性,一个参数或者带有任意名称或带有多个参数的方法。
比如,可以在设值方法上使用@Autowired
注解来替代配置文件中的<property>元 素
。当Spring 容器
在setter
方法上找到@Autowired
注解时,会尝试用byType
自动装配。
@Qualifier 注解?
@Qualifier 注解意味着可以在被标注 bean 的字段上可以自动装配。Qualifier 注
解可以用来注入指定的bean
构造方法注入和设值注入有什么区别?
构造方法注入可能会出现循环依赖问题
setter
注入的原理是先调用无参构造方法来创建对象,然后掉用对应的set
方法来为属性赋值。用setter
注入的方式也可以解决那个有参构造方法的缺陷,并且可以提高可读性。
Spring 框架中有哪些不同类型的事件?
Spring
的ApplicationContext
提供了支持事件和代码中监听器的功能。
我们可以创建bean
用来监听在ApplicationContext
中发布的事件。ApplicationEvent
类和在ApplicationContext
接口中处理的事件,如果一个 bean 实现了
ApplicationListener
接口,当一个ApplicationEvent
被发布以后,bean
会自动被通知。
FileSystemResource 和 ClassPathResource 有何区别?
在FileSystemResource
中需要给出spring-config.xml
文件在你项目中的相对路径或者
绝对路径。在ClassPathResource
中spring
会在ClassPath
中自动搜寻配置文件,所以要把ClassPathResource
文件放在ClassPath
下。
如果将spring-config.xml
保存在了src
文件夹下的话,只需给出配置文件的名称即可,因为src
文件夹是默认。
简而言之,ClassPathResource
在环境变量中读取配置文件,FileSystemResource
在配置文件中读取配置文件。
Spring 框架中都用到了哪些设计模式?
代理模式—在AOP
和remoting
中被用的比较多。单例模式—在spring
配置文件中定义的bean
默认为单例模式。策略模式-同一方法-不同的业务方法对应不同的业务执行依赖注入—贯穿于BeanFactory / ApplicationContext
接口的核心理念。工厂模式—BeanFactory
用来创建对象的实例开发中主要使用 Spring 的什么技术 ?
IOC 容器管理各层的组件使用 AOP 配置声明式事务整合其他框架.简述 AOP 和 IOC 概念
AOP:
Aspect Oriented Program, 面向(方面)切面的编程;Filter(过滤器) 也是一种 AOP. AOP 是一种 新的方法论, 是对传统OOP
(Object-Oriented Programming, 面向对象编程) 的补充.AOP
的 主要编程对象是切面(aspect
), 而切面模块化横切关注点.可以举例通过事务说明.
IOC:
Invert Of Control, 控制反转. 也成为 DI(依赖注入)其思想是反转 资源获取的方向. 传统
的资源查找方式要求组件向容器发起请求查找资源.作为 回应, 容器适时的返回资源. 而应用了IOC
之后, 则是容器主动地将资源推送 给它所管理的组件,组件所要做的仅是选择一种合适的方式 来接受资源. 这种行 为也被称为查找的被动形式
在 Spring 中如何配置 Bean ?
通过全类名(反射)、通过工厂方法(静态工厂方法 & 实 例工厂方法)、 FactoryBean
IOC 容器对 Bean 的生命周期:
通过构造器或工厂方法创建 Bean 实例为 Bean 的属性设置值和对其他 Bean 的引用将 Bean 实 例 传 递 给 Bean 后 置 处 理 器 的 postProcessBeforeInitialization 方法调用 Bean 的初始化方法(init-method)将 Bean 实 例 传 递 给 Bean 后 置 处 理 器 的 postProcessAfterInitialization 方法Bean 可以使用了当容器关闭时, 调用 Bean 的销毁方法(destroy-method)
SpringBoot
简述
Spring Boot
已经建立在现有spring 框架
之上。使用 spring 启动,我们避免了之前我们必须做的所有样板代码和配置。因此,Spring Boot 可以 帮助我们以最少的工作量,更加健壮地使用现有的 Spring 功能。
优缺点
减少开发,测试时间和努力。
使用JavaConfig
有助于避免使用XML
。
避免大量的Maven
导入和各种版本冲突。
提供意见发展方法。
通过提供默认值快速开始开发。
没有单独的Web 服务器
需要。这意味着你不再需要启动Tomcat
,Glassfish
或其他任何东西。
需要更少的配置 因为没有web.xml
文件。只需添加用@Configuration
注释的类,然后添加 用@Bean
注释的方法,Spring
将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired
添加到 bean 方法中,以使Spring
自动装入需要的依赖关系中。
基于环境的配置使用这些属性,您可以将您正在使用的环境传递到应用程序:-
Dspring.profiles.active={enviornment}
。在加载主应用程序属性文件后,Spring
将在 (application{environment} .properties
)中加载后续的应用程序属性文件。
什么是 JavaConfig
Spring JavaConfig
是Spring
社区的产品,它提供了配置Spring IoC
容器的纯 Java 方法。因此 它有助于避免使用XML 配置
。使用JavaConfig
的优点在于:
面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的 面向对象功能。一个配置类可以继承另一个,重写它的@Bean
方法等。
减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在XML
和Java
之间来回切换。JavaConfig
为开发人员提供了一种纯 Java 方法来配 置与 XML 配置概念相似的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置 容器是可行的,但实际上很多人认为将JavaConfig
与XML
混合匹配是理想的。
类型安全和重构友好。JavaConfig
提供了一种类型安全的方法来配置Spring
容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或 基于字符串的查找。
SpringBoot如何运行的?
@springbootApplication
是一个组合注解,主要组合,@SpringBootConfiguration
,@enableAutoconfiguration
,@ComponentScan
,所以,可以直接引用这三个注解,就可以是程序的入口。
@enableAutoConfiguration
可以让springboot
根据类路径中的jar包依赖为当前项目进行自动配置。不配置扫描路径的情况下,默认是扫描启动类所在目录或者他的子目录下的controller
、service
、dao
等,所以解决办法有两个:
1、 用注解@ComponentScan(basePackages = {"com.*", "com.frames"})
主动配置扫描路径;(@SpringBootApplication
注解等价于@Configuration
,@EnableAutoConfiguration
and@ComponentScan
)
2、 直接把启动类放到根目录下,让他自动扫描所有的包(这也是官方建议的做法)
Spring Boot 中的监视器是什么?
spring boot actuator
是spring
启动框架中的重要功能之一。Spring boot
监视器可帮助您访 问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和 监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器 模块公开了一组可直接作为 HTTP URL 访问的 REST 端点来检查状态。
如何在 Spring Boot 中禁用 Actuator 端点安全性?
默认情况下,所有敏感的 HTTP 端点都是安全的,只有具有ACTUATOR
角色的用户才能访 问它们。安全性是使用标准的HttpServletRequest.isUserInRole
方法实施的。 我们可以使用management.security.enabled = false
来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。
什么是 YAML?
YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。
与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构
化,而且更少混淆。可以看出 YAML 具有分层配置数据。
如何实现 Spring Boot 应用程序的安全性?
引入security或者shiro
什么是 Spring Profiles?
Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来标注并区分配置文件的内容信息等,使得开发人员以及运维人员调试或部署更加清晰明了。
Spring Boot 异常处理?
Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。 我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常。
注:特定过滤器抛出异常由框架提供指定异常处理类或者由自己做特殊处理
什么是 CSRF 攻击?
CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的 Web 应用 程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。
SpringCloud
简述
Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。
Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。
优势
使用 Spring Boot 开发分布式微服务时,我们面临以下问题
与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。冗余-分布式系统中的冗余问题。负载平衡--负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。性能-问题 由于各种运营开销导致的性能问题。部署复杂性-Devops 技能的要求。
负载平衡的意义什么?
在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算 资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源 的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程
什么是 Hystrix?它如何实现容错?
Hystrix 是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的 故障时,停止级联故障并在复杂的分布式系统中实现弹性。
场景:
由于某些原因,employee-consumer 公开服务会引发异常。在这种情况下使用 Hystrix 我们定义了一个 回退方法。如果在公开服务中发生异常,则回退方法返回一些默认值。
断路器的目的是给第一页方法或第一页方法可能调用的其他方法 留出时间,并导致异常恢复。可能发生的情况是,在负载较小的情况下,导致异常的问题有更好的恢复机会。
什么是 Netflix Feign?它的优点是什么?
Feign 是受到 Retrofit,JAXRS-2.0 和 WebSocket 启发的 java 客户端联编程序。Feign 的第一个目标是将约束分母的复杂性统一到http apis
,而不考虑其稳定性。在 employee-consumer 的例子中,我们 使用了 employee-producer 使用 REST 模板公开的 REST 服务。但是我们必须编写大量代码才能执行以下步骤
使用功能区进行负载平衡。获取服务实例,然后获取基本 URL。利用 REST 模板来使用服务。
什么是 Spring Cloud Bus?
我们有多个应用程序使用 Spring Cloud Config 读取属性,而 Spring Cloud Config 从
GIT 读取这些属性。
下面的例子中多个员工生产者模块从 Employee Config Module 获取 Eureka 注册的财产。
因此,在上面的示例中,如果我们刷新 Employee Producer1,则会自动刷新所有其他必需的模块。如果我们有多个微服务启动并运行,这特别有用。这是通过将所有微服务连接到单个消息代理来实现的。无论何时刷新实例,此事件都会订阅到侦听 此代理的所有微服务,并且它们也会刷新。可以通过使用端点/总线/刷新来实现对任何单个实例的刷新