1.spring事物的传播行为,主要是用来解决业务层拥有事物的方法,相互调用的问题。
2.声明事物,
在代码执行前,开启事务。代码执行完,提交事务
3.spring并无提供事务具体的处理,而只是调用orm框架的事务,connection的事务。
spring只是对底层事务作了一层封装。
4.spring对事务管理主要用了三个APi。PlatformTransactionManager ,TransactionDefinition,和TransactionStatus。
spring对TransactionManager不一样的orm框架进行了不一样的实现,如hibernate TransactionManager,DatasourceTransactionManager。
不一样的transactionManager实现。
5.TransactionDefiniton定义了事务具体的定义,如传播状态,隔离级别,和是否只读。
11. Redis 支持的数据类型
一、string(字符串)
二、hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
三、list(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你能够添加一个元素到列表的头部(左边)或者尾部(右边)。
四、set(集合)
Redis的Set是string类型的无序集合。
五、zset(sorted set:有序集合)
Redis zset 和 set 同样也是string类型元素的集合,且不容许重复的成员。
不一样的是每一个元素都会关联一个double类型的分数。redis正是经过分数来为集合中的成员进行从小到大的排序。
zset的成员是惟一的,但分数(score)却能够重复。
12. Redis 经常使用命令
清空Redis全部key:
flush db # 清除当前数据库的全部keys
flush all # 清除全部数据库的全部keys
查询匹配key:
keys * # 查看全部keys
keys prefix_* # 查看前缀为"prefix_"的全部keys
key基本操做:
exists key # 确认一个key是否存在
set key value # 设置key和value
get key # 获取key的value
del key # 删除一个key
type key # 返回值的类型
keys pattern # 返回知足给定pattern的全部key
random key # 随机返回key空间的一个
key rename oldname newname # 重命名key
db size # 返回当前数据库中key的数目
select index # 选择第0~15中
什么是应用服务雪崩?
雪崩问题
分布式系统都存在这样一个问题,因为网络的不稳定性,决定了任何一个服务的可用性都不是 100% 的。当网络不稳定的时候,做为服务的提供者,自身可能会被拖死,致使服务调用者阻塞,最终可能引起雪崩连锁效应。
缓存雪崩
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(好比DB)带来很大压力,形成数据库后端故障,从而引发应用服务器雪崩。
雪崩效应产生的几种场景

流量激增:好比异常流量、用户重试致使系统负载升高;
缓存刷新:假设A为client端,B为Server端,假设A系统请求都流向B系统,请求超出了B系统的承载能力,就会形成B系统崩溃;
程序有Bug:代码循环调用的逻辑问题,资源未释放引发的内存泄漏等问题;
硬件故障:好比宕机,机房断电,光纤被挖断等。
数据库严重瓶颈,好比:长事务、sql超时等。
线程同步等待:系统间常常采用同步服务调用模式,核心服务和非核心服务共用一个线程池和消息队列。若是一个核心业务线程调用非核心线程,这个非核心线程交由第三方系统完成,当第三方系统自己出现问题,致使核心线程阻塞,一直处于等待状态,而进程间的调用是有超时限制的,最终这条线程将断掉,也可能引起雪崩;
缓存雪崩的解决方案
缓存失效的几种状况:
一、缓存服务器挂了
二、高峰期缓存局部失效
三、热点缓存失效
解决方案:

一、避免缓存集中失效,不一样的key设置不一样的超时时间
二、增长互斥锁,控制数据库请求,重建缓存。
三、提升缓存的HA,如:redis集群。
雪崩的总体解决方案
通常状况对于服务依赖的保护主要有3种解决方案:

(1)熔断模式
这种模式主要是参考电路熔断,若是一条线路电压太高,保险丝会熔断,防止火灾。放到咱们的系统中,若是某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。若是目标服务状况好转则恢复调用。
重点监控的机器性能指标
cpu(Load) cpu使用率/负载
memory 内存
mysql监控长事务(这里与sql查询超时是紧密结合的,须要重点监控)
sql超时
线程数等
总之,除了cpu、内存、线程数外,重点监控数据库端的长事务、sql超时等,绝大多数应用服务器发生的雪崩场景,都是来源于数据库端的性能瓶颈,从而先引发数据库端大量瓶颈,最终拖累应用服务器也发生雪崩,最后就是大面积的雪崩。
(2)隔离模式
这种模式就像对系统请求按类型划分红一个个小岛的同样,当某个小岛被火少光了,不会影响到其余的小岛。
例如能够对不一样类型的请求使用线程池来资源隔离,每种类型的请求互不影响,若是一种类型的请求线程资源耗尽,则对后续的该类型请求直接返回,再也不调用后续资源。这种模式使用场景很是多,例如将一个服务拆开,对于重要的服务使用单独服务器来部署,再或者公司最近推广的多中心。
(3)限流模式
上述的熔断模式和隔离模式都属于出错后的容错处理机制,而限流模式则能够称为预防模式。限流模式主要是提早对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,再也不调用后续资源。这种模式不能解决服务依赖的问题,只能解决系统总体资源分配问题,由于没有被限流的请求依然有可能形成雪崩效应。
熔断设计
在熔断的设计主要参考了hystrix的作法。其中最重要的是三个模块:熔断请求判断算法、熔断恢复机制、熔断报警
(1)熔断请求判断机制算法:使用无锁循环队列计数,每一个熔断器默认维护10个bucket,每1秒一个bucket,每一个blucket记录请求的成功、失败、超时、拒绝的状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。
(2)熔断恢复:对于被熔断的请求,每隔5s容许部分请求经过,若请求都是健康的(RT<250ms)则对请求健康恢复。
(3)熔断报警:对于熔断的请求打日志,异常请求超过某些设定则报警。
隔离设计
隔离的方式通常使用两种
(1)线程池隔离模式:使用一个线程池来存储当前的请求,线程池对请求做处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式须要为每一个依赖的服务申请线程池,有必定的资源消耗,好处是能够应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)
(2)信号量隔离模式:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操做请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且当即返回模式,没法应对突发流量(流量洪峰来临时,处理的线程超过数量,其余的请求会直接返回,不继续去请求依赖的服务)
超时机制设计
(1)超时分两种,一种是请求的等待超时,一种是请求运行超时。
(2)等待超时:在任务入队列时设置任务入队列时间,并判断队头的任务入队列时间是否大于超时时间,超过则丢弃任务。
(3)运行超时:直接可以使用线程池提供的get方法。
如何提早发现雪崩
就是首先让系统不雪崩,而后经过监控发现请求正在接近或者超过阀值,而后再根据具体状况处理,这个接近或者超过阀值的过程,能够称为 “提早发现雪崩”。
以上就是应用服务雪崩的场景以及技术方案总结。
配置的优化其实包含两个方面的:操做系统内核的优化和mysql配置文件的优化
1)系统内核的优化对专用的mysql服务器来讲,无非是内存实用、链接数、超时处理、TCP处理等方面的优化,根据本身的硬件配置来进行优化,这里很少讲;
2)mysql配置的优化,通常来讲包含:IO处理的经常使用参数、最大链接数设置、缓存使用参数的设置、慢日志的参数的设置、innodb相关参数的设置等,若是有主从关系在设置主从同步的相关参数便可,网上的相关配置文件不少,大同小异,经常使用的设置大多修改这些差很少就够用了。
二、 sql语句的优化
一、 尽可能稍做计算
Mysql的做用是用来存取数据的,不是作计算的,作计算的话能够用其余方法去实现,mysql作计算是很耗资源的。
2.尽可能少 join
MySQL 的优点在于简单,但这在某些方面其实也是其劣势。MySQL 优化器效率高,可是因为其 统计信息的量有限,优化器工做过程出现误差的可能性也就更多。对于复杂的多表 Join,一方面因为其优化器受限,再者在 Join 这方面所下的功夫还不够,因此性能表现离 Oracle 等关系型数据库前辈仍是有必定距离。但若是是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈。
3.尽可能少排序
排序操做会消耗较多的 CPU 资源,因此减小排序能够在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL的 响应时间。
对于MySQL来讲,减小排序有多种办法,好比:
经过利用索引来排序的方式进行优化
减小参与排序的记录条数
非必要不对数据进行排序
4.尽可能避免 select *
在数据量少而且 访问量不大的状况下,select * 没有什么影响,可是量级达到必定级别的时候,在执行效率和IO资源的使用上,仍是有很大关系的,用什么字段取什么字段,减小没必要要的资源浪费。
以前遇到过由于一个字段存储的数据比较大,并发高的状况下把网络带宽跑满的状况,形成网站打不开或是打开速度极慢的状况。
5.尽可能用 join 代替子查询
虽然 Join 性能并不佳,可是和 MySQL 的子查询比起来仍是有很是大的性能优点。MySQL 的子查询执行计划一直存在较大的问题,虽然这个问题已经存在多年,可是到目前已经发布的全部稳定版本中都广泛存在,一直没有太大改善。虽然官方也在很早就认可这一问题,而且承诺尽快解决,可是至少到目前为止咱们尚未看到哪个版本较好的解决了这一问题。
6.尽可能少 or
当 where 子句中存在多个条件以“或”并存的时候,MySQL 的优化器并无很好的解决其执行计划优化问题,再加上 MySQL 特有的 SQL 与 Storage 分层架构方式,形成了其性能比较低下,不少时候使用 union all 或者是union(必要的时候)的方式来代替“or”会获得更好的效果。
7.尽可能用 union all 代替 union
union 和 union all 的差别主要是前者须要将两个(或者多个)结果集合并后再进行惟一性过滤操做,这就会涉及到排序,增长大量的 CPU 运算,加大资源消耗及延迟。因此当咱们能够确认不可能出现重复结果集或者不在意重复结果集的时候,尽可能使用 union all 而不是 union。
8.尽可能早过滤
这一优化策略其实最多见于索引的优化设计中(将过滤性更好的字段放得更靠前)。
在 SQL 编写中一样能够使用这一原则来优化一些 Join 的 SQL。好比咱们在多个表进行分页数据查询的时候,咱们最好是可以在一个表上先过滤好数据分好页,而后再用分好页的结果集与另外的表 Join,这样能够尽量多的减小没必要要的 IO 操做,大大节省 IO 操做所消耗的时间。
9.避免类型转换
这里所说的“类型转换”是指 where 子句中出现 column 字段的类型和传入的参数类型不一致的时候发生的类型转换:
A:人为在column_name 上经过转换函数进行转换
直接致使 MySQL(实际上其余数据库也会有一样的问题)没法使用索引,若是非要转换,应该在传入的参数上进行转换
B:由数据库本身进行转换
若是咱们传入的数据类型和字段类型不一致,同时咱们又没有作任何类型转换处理,MySQL 可能会本身对咱们的数据进行类型转换操做,也可能不进行处理而交由 存储引擎去处理,这样一来,就会出现索引没法使用的状况而形成执行计划问题。
以上两种状况在开发者由于某种缘由常常会有,原本能够用到索引的结果类型不对没有用到索引,或是由于类型不对又有越界的状况发生形成没法使用索引的状况,结果形成很严重的事故。
10.优先优化高并发的 SQL,而不是执行频率低某些“大”SQL
对于破坏性来讲,高并发的 SQL 老是会比低频率的来得大,由于高并发的 SQL 一旦出现问题,甚至不会给咱们任何喘息的机会就会将系统压跨。而对于一些虽然须要消耗大量 IO 并且响应很慢的 SQL,因为频率低,即便遇到,最多就是让整个系统响应慢一点,但至少可能撑一下子,让咱们有缓冲的机会。
11.从全局出发优化,而不是片面调整
SQL 优化不能是单独针对某一个进行,而应充分考虑系统中全部的 SQL,尤为是在经过调整索引优化 SQL 的执行计划的时候,千万不能顾此失彼,因小失大。
12.尽量对每一条运行在数据库中的SQL进行 explain
优化 SQL,须要作到心中有数,知道SQL 的执行计划才能判断是否有优化余地,才能判断是否存在执行计划问题。在对数据库中运行的 SQL 进行了一段时间的优化以后,很明显的问题 SQL 可能已经不多了,大多都须要去发掘,这时候就须要进行大量的 explain 操做收集执行计划,并判断是否须要进行优化。
问题一:
什么是Spring Cloud?
Spring cloud流应用程序启动器是基于Spring Boot的Spring集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。
问题二:
使用Spring Cloud有什么优点?
使用Spring Boot开发分布式微服务时,咱们面临如下问题
-
与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。
-
服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,而后可以查找并链接到该目录中的服务。
-
冗余-分布式系统中的冗余问题。
-
负载平衡 --负载平衡改善跨多个计算资源的工做负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。
-
性能-问题 因为各类运营开销致使的性能问题。
-
部署复杂性-Devops技能的要求。
问题三:
服务注册和发现是什么意思?Spring Cloud如何实现?
当咱们开始一个项目时,咱们一般在属性文件中进行全部的配置。随着愈来愈多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会降低,而某些位置可能会发生变化。手动更改属性可能会产生问题。 Eureka服务注册和发现能够在这种状况下提供帮助。因为全部服务都在Eureka服务器上注册并经过调用Eureka服务器完成查找,所以无需处理服务地点的任何更改和处理。
问题四:
负载平衡的意义什么?
在计算中,负载平衡能够改善跨计算机,计算机集群,网络连接,中央处理单元或磁盘驱动器等多种计算资源的工做负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会经过冗余来提升可靠性和可用性。负载平衡一般涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。
问题五:
什么是Hystrix?它如何实现容错?
Hystrix是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,中止级联故障并在复杂的分布式系统中实现弹性。
一般对于使用微服务架构开发的系统,涉及到许多微服务。这些微服务彼此协做。
思考如下微服务
假设若是上图中的微服务9失败了,那么使用传统方法咱们将传播一个异常。但这仍然会致使整个系统崩溃。
随着微服务数量的增长,这个问题变得更加复杂。微服务的数量能够高达1000.这是hystrix出现的地方 咱们将使用Hystrix在这种状况下的Fallback方法功能。咱们有两个服务employee-consumer使用由employee-consumer公开的服务。
简化图以下所示
如今假设因为某种缘由,employee-producer公开的服务会抛出异常。咱们在这种状况下使用Hystrix定义了一个回退方法。这种后备方法应该具备与公开服务相同的返回类型。若是暴露服务中出现异常,则回退方法将返回一些值。
问题六:
什么是Hystrix断路器?咱们须要它吗?
因为某些缘由,employee-consumer公开服务会引起异常。在这种状况下使用Hystrix咱们定义了一个回退方法。若是在公开服务中发生异常,则回退方法返回一些默认值。
17. 经常使用的 Liunx 命令
-
1.uptime命令
在Linux中,uptime命令显示了你的系统运行了多久以及目前登陆的用户有多少,另外还显示了间隔1分钟、5分钟和15分钟的负载平均值。
# uptime 08:16:26 up 22 min, 1 user, load average: 0.00, 0.03, 0.22
检查uptime版本
除了uptime(正常运行时间)和version(版本)外,uptime命令没有其余选项。若是时间不到1天,它只给出hours:mins这种形式的信息。
[tecmint@linuxprobe ~]$ uptime -V procps version 3.2.8
-
2.w命令
该命令会显示目前登陆的用户及其进程,另外还会显示负载平均值。此外,它还显示了登陆名称、tty名称、远程主机、登陆时间、闲置时间、JCPU、PCPU、命令和进程。
# w 08:27:44 up 34 min, 1 user, load average: 0.00, 0.00, 0.08 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT tecmint pts/0 192.168.50.1 07:59 0.00s 0.29s 0.09s w 可用的选项 -h:不显示标题。 -s:不显示JCPU和PCPU。 -f:不显示字段信息。 -V:(大写V)-显示版本。
-
3.users命令
users命令显示了目前已登陆的用户,除了help(帮助)和version(版本)外,该命令没有其余参数。
# users Tecmint
-
4.who命令
who命令仅仅返回用户名称、日期、时间和主机信息;who命令相似w命令,不像w命令,who并不输出用户执行的操做这一信息,不妨具体看看who和w这两个命令之间的区别。
# who tecmint pts/0 2010-09-18 07:59 (192.168.50.1)# w 08:43:58 up 50 min, 1 user, load average: 0.64, 0.18, 0.06 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT tecmint pts/0 192.168.50.1 07:59 0.00s 0.43s 0.10s w who命令的选项 -b:显示上一次系统重启日期和时间。 -r:显示当前的运行级别。 -a,–all:显示累积的全部信息。
-
5.whoami命令
whoami命令输出当前用户的姓名;你还能够使用“who am i”命令显示当前用户,若是你以根用户身份使用sudo命令登陆,“whoami”命令返回根用户是当前用户,若是你想知道登陆的用户具体是哪一个,使用“who am i”命令。
# whoami tecmint
-
6.ls命令
ls命令显示了人类可读格式的文件列表。
# ls -l total 114 dr-xr-xr-x. 2 root root 4096 Sep 18 08:46 bin dr-xr-xr-x. 5 root root 1024 Sep 8 15:49 boot
按照上一次修改时间排序文件。
# ls -ltr total 40 -rw-r--r--. 1 root root 6546 Sep 17 18:42 install.log.syslog -rw-r--r--. 1 root root 22435 Sep 17 18:45 install.log -rw-------. 1 root root 1003 Sep 17 18:45 anaconda-ks.cfg
7.crontab命令
可以使用crontab命令和-l选项,列出当前用户的计划任务。
# crontab -l 00 10 * * * /bin/ls >/ls.txt
能够使用-e选项编辑crontab,在下面例子中,将用VI编辑工具打开计划任务,进行必要的更改,按:wq键退出,这会自动保存设置。
# crontab -e
8.less命令
less命令容许快速查看文件;你能够向上和向下翻页,按“q”便可退出less窗口。
# less install.log Installing setup-2.8.14-10.el6.noarch warning: setup-2.8.14-10.el6.noarch: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Installing filesystem-2.4.30-2.1.el6.i686 Installing ca-certificates-2010.63-3.el6.noarch Installing xml-common-0.6.3-32.el6.noarch nstalling tzdata-2010l-1.el6.noarch Installing iso-codes-3.16-2.el6.noarch
9.more命令
more命令容许快速查看文件,并以百分比的形式显示详细信息,你能够向上和向下翻页,按“q”便可退出more窗口。
# more install.log Installing setup-2.8.14-10.el6.noarch warning: setup-2.8.14-10.el6.noarch: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Installing filesystem-2.4.30-2.1.el6.i686 Installing ca-certificates-2010.63-3.el6.noarch Installing xml-common-0.6.3-32.el6.noarch Installing tzdata-2010l-1.el6.noarch Installing iso-codes-3.16-2.el6.noarch --More--(10%)
10.cp命令
将文件历来源拷贝到目的地,保留同一种模式。
# cp -p fileA fileB
覆盖文件以前系统会提示你。
# cp -i fileA fileB
11.mv命令
将fileA改名为fileB; -i选项会在覆盖前提示;若是文件已经存在,会要求予以确认。
# mv -i fileA fileB
12.cat命令
cat命令用来同时查看多个文件。
# cat fileA fileB
要是某个文件在一个屏幕/页面显示不了,你能够使用cat命令来合并more和less命令,查看文件内容。
# cat install.log | less or # cat install.log | more
13.cd命令(切换目录)
借助cd命令(切换目录),它会进入到fileA目录。
# cd /fileA
14.pwd命令(输出工做目录)
pwd命令会返回当前的工做目录。
# pwd /root
15.sort命令
以升序排序一行行文本文件,若是使用-r选项,就会以降序排序。
#sort fileA.txt #sort -r fileA.txt
16.vi命令
对大多数相似UNIX的操做系统而言,vi是最流行的文本编辑器,下面例子使用-R选项,打开只读方式的文件,按“:q”便可退出vi窗口。
# vi -R /etc/shadows
17.ssh命令(安全外壳)
ssh命令用来登陆入到远程主机;好比说,下面这个ssh例子会使用用户做为narad,链接到主机(192.168.50.2)。
# ssh narad@192.168.50.2
想检查ssh的版本,使用选项-V(大写),便可显示ssh的版本。
# ssh -V OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 201