棘丶

棘丶 查看完整档案

成都编辑  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

棘丶 收藏了文章 · 10月20日

redis数据丢失你怎么处理?

1. 两种数据丢失的情况

主备切换的过程,可能导致数据丢失;

### 1.1. 异步复制导致的数据丢

因为master -> slave的复制是异步的,所以可能有部分数据还没复制到slave,master就宕机了,此时这些部分数据就丢失了

### 1.2 脑裂导致的数据丢失

脑裂就是说,某个maser 所在机器突然脱离了正常的网络,跟其他slave机器不能连接,但是实际上master还运行着,此时哨兵可能就会认为master 宕机了,然后开启选举,将其他slave切换成了master,这个时候,集群里面就会有2个master,也就是所谓的脑裂,此时虽然某个slave被切换成了master,但是可能client还没来得及切换到新的master,还继续写向旧master的数据可能也丢失了,因此master再次恢复的时候,会被作为一个slave挂到新的master 上去,自己的数据将会清空,重新从新的master 复制数据

2. 解决异步复制和脑裂数据导致的数据丢失

   # redis.conf 配置
   Min-slaves-to-write 1 
   Min-slaves-max-lag 10

上面这两个配置可以减少异步复制和脑裂导致的数据丢失

###2.1 减少异步复制的数据丢失

有了min-slaves-max-lag这个配置,可以确保说,一旦slave复制数据和ack延迟太长,就认为可能master 宕机后损失的数据太多了,那么就拒绝写请求,这样可以吧master宕机时由于部分数据丢失。

### 2.2 减少脑裂的数据丢失

如果一个master出现了脑裂,跟其他slave丢了连接,那么上面这两个配置可以去确保说,如果不能继续给指定数量的slave发送数据,而且slave超过10秒没有给自己ack消息,那么就直接拒绝客户端的写请求,这样脑裂活的旧master就不会接受client的新数据,也就避免了数据丢失,上面配置确保了,如果跟任何一个slave丢了连接,在10秒后发现没有slave给自己ack,那么就拒绝新的写请求,因此脑裂场景下,最多丢失10秒的数据。

更多精彩,weixin 关注 “SpringForAll社区”

本文由博客一文多发平台 OpenWrite 发布!
查看原文

棘丶 赞了文章 · 10月20日

redis数据丢失你怎么处理?

1. 两种数据丢失的情况

主备切换的过程,可能导致数据丢失;

### 1.1. 异步复制导致的数据丢

因为master -> slave的复制是异步的,所以可能有部分数据还没复制到slave,master就宕机了,此时这些部分数据就丢失了

### 1.2 脑裂导致的数据丢失

脑裂就是说,某个maser 所在机器突然脱离了正常的网络,跟其他slave机器不能连接,但是实际上master还运行着,此时哨兵可能就会认为master 宕机了,然后开启选举,将其他slave切换成了master,这个时候,集群里面就会有2个master,也就是所谓的脑裂,此时虽然某个slave被切换成了master,但是可能client还没来得及切换到新的master,还继续写向旧master的数据可能也丢失了,因此master再次恢复的时候,会被作为一个slave挂到新的master 上去,自己的数据将会清空,重新从新的master 复制数据

2. 解决异步复制和脑裂数据导致的数据丢失

   # redis.conf 配置
   Min-slaves-to-write 1 
   Min-slaves-max-lag 10

上面这两个配置可以减少异步复制和脑裂导致的数据丢失

###2.1 减少异步复制的数据丢失

有了min-slaves-max-lag这个配置,可以确保说,一旦slave复制数据和ack延迟太长,就认为可能master 宕机后损失的数据太多了,那么就拒绝写请求,这样可以吧master宕机时由于部分数据丢失。

### 2.2 减少脑裂的数据丢失

如果一个master出现了脑裂,跟其他slave丢了连接,那么上面这两个配置可以去确保说,如果不能继续给指定数量的slave发送数据,而且slave超过10秒没有给自己ack消息,那么就直接拒绝客户端的写请求,这样脑裂活的旧master就不会接受client的新数据,也就避免了数据丢失,上面配置确保了,如果跟任何一个slave丢了连接,在10秒后发现没有slave给自己ack,那么就拒绝新的写请求,因此脑裂场景下,最多丢失10秒的数据。

更多精彩,weixin 关注 “SpringForAll社区”

本文由博客一文多发平台 OpenWrite 发布!
查看原文

赞 1 收藏 1 评论 0

棘丶 发布了文章 · 9月30日

RabbitMQ

ribbitmq好处

服务解耦

避免服务之间耦合度过于紧密,只需要降需要处理的消息发送至消息队列,双方只需要跟消息服务器沟通即可

流量销峰

为了避免高并发送的消息需要处理,将产生的需要处理的消息保存到消息队列,处理一个拿一个,减轻后台处理消息的压力

异步调用

为了提升用户的体验,将消息发送到消息队列后及时返回信息,如果有必要等待处理结束过后向用户发送处理完毕相应

rabbitmq的持久化

1.队列持久化
ch.queueDeclare(uuid,false/true为持久化队列, true, true, null);
2.消息持久化
ch.basicPublish("logs",//交换机名
 "", //陆游建指定
 MessageProperties.PERSISTENT_TEXT_PLAIN 其他属性消息持久化 
msg.getBytes());
 //转换字节

ribbitmq的六大模式

简单模式

消费者共享队列,消息队列实现了负载均衡,轮询发送消息给所有的消费者

工作模式

添加手动ack回执消息并单独拉取消息机制实现合理分配消息并在消息队列得到了缓存

订阅模式

使用fanout模式交换机绑定消息队列,分发送所有绑定的消息队列

陆游模式

使用直连模式的交换机(disrect模式),绑定消息队列.
消息和队列绑定陆游建相互匹配则发送该消息

主题模式

特殊的陆游模式,动态的匹配陆建来发送消息

RPC模式

查看原文

赞 0 收藏 0 评论 0

棘丶 收藏了文章 · 9月28日

第二版:SpringCloud 70 道 面试题

最近我一直在面试高级工程师,不管初级,高级,程序员,我想面试前,大家刷题一定是是少不了吧。

我也一样,我在网上找了很多面试题来看,最近又赶上跳槽的高峰期,好多粉丝,都问我要有没有最新面试题,索性,我就把我看过的和我面试中的真题,及答案都整理好,整理了《第2版:互联网大厂面试题》并分类92份 PDF,累计 3625页 我会持续更新中,马上就出第三版,涵盖大厂算法会更多!

其他都已经在公众号更新

关注公众号:搜云库技术团队,回复:面试题,即可获取全部

第2版:题库非常全面

包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!

什么是微服务架构

  • 微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信。这些服务围绕业务能力来划分,并通过自动化部署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限度的集中式管理。

为什么需要学习Spring Cloud

  • 首先springcloud基于spingboot的优雅简洁,可还记得我们被无数xml支配的恐惧?可还记得springmvc,mybatis错综复杂的配置,有了spingboot,这些东西都不需要了,spingboot好处不再赘诉,springcloud就基于SpringBoot把市场上优秀的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理
  • 什么叫做开箱即用?即使是当年的黄金搭档dubbo+zookeeper下载配置起来也是颇费心神的!而springcloud完成这些只需要一个jar的依赖就可以了!
  • springcloud大多数子模块都是直击痛点,像zuul解决的跨域,fegin解决的负载均衡,hystrix的熔断机制等等等等

Spring Cloud 是什么

  • Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
  • Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

SpringCloud的优缺点

优点:

  1.耦合度比较低。不会影响其他模块的开发。

  2.减轻团队的成本,可以并行开发,不用关注其他人怎么开发,先关注自己的开发。

  3.配置比较简单,基本用注解就能实现,不用使用过多的配置文件。

  4.微服务跨平台的,可以用任何一种语言开发。

  5.每个微服务可以有自己的独立的数据库也有用公共的数据库。

  6.直接写后端的代码,不用关注前端怎么开发,直接写自己的后端代码即可,然后暴露接口,通过组件进行服务通信。

缺点:

 1.部署比较麻烦,给运维工程师带来一定的麻烦。

 2.针对数据的管理比麻烦,因为微服务可以每个微服务使用一个数据库。

 3.系统集成测试比较麻烦

 4.性能的监控比较麻烦。【最好开发一个大屏监控系统】
  • 总的来说优点大过于缺点,目前看来Spring Cloud是一套非常完善的分布式框架,目前很多企业开始用微服务、Spring Cloud的优势是显而易见的。因此对于想研究微服务架构的同学来说,学习Spring Cloud是一个不错的选择。

SpringBoot和SpringCloud的区别?

  • SpringBoot专注于快速方便的开发单个个体微服务。
  • SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,
  • 为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务
  • SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关系
  • SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

Spring Cloud和SpringBoot版本对应关系

Spring Cloud VersionSpringBoot Version
Hoxton2.2.x
Greenwich2.1.x
Finchley2.0.x
Edgware1.5.x
Dalston1.5.x

SpringCloud由什么组成

  • 这就有很多了,我讲几个开发中最重要的

    *  Spring Cloud Eureka:服务注册与发现
    *  Spring Cloud Zuul:服务网关
    *  Spring Cloud Ribbon:客户端负载均衡
    *  Spring Cloud Feign:声明性的Web服务客户端
    *  Spring Cloud Hystrix:断路器
    *  Spring Cloud Config:分布式统一配置管理
    *  等20几个框架,开源一直在更新
    

使用 Spring Boot 开发分布式微服务时,我们面临什么问题

  • (1)与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。
  • (2)服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
  • (3)冗余-分布式系统中的冗余问题。
  • (4)负载平衡 --负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。
  • (5)性能-问题 由于各种运营开销导致的性能问题。

Spring Cloud 和dubbo区别?

  • (1)服务调用方式:dubbo是RPC springcloud Rest Api
  • (2)注册中心:dubbo 是zookeeper springcloud是eureka,也可以是zookeeper
  • (3)服务网关,dubbo本身没有实现,只能通过其他第三方技术整合,springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,springcloud支持断路器,与git完美集成配置文件支持版本控制,事物总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素。

Eureka

服务注册和发现是什么意思?Spring Cloud 如何实现?

  • 当我们开始一个项目时,我们通常在属性文件中进行所有的配置。随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化。手动更改属性可能会产生问题。 Eureka 服务注册和发现可以在这种情况下提供帮助。由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找,因此无需处理服务地点的任何更改和处理。

什么是Eureka

  • Eureka作为SpringCloud的服务注册功能服务器,他是服务注册中心,系统中的其他服务使用Eureka的客户端将其连接到Eureka Service中,并且保持心跳,这样工作人员可以通过Eureka Service来监控各个微服务是否运行正常。

Eureka怎么实现高可用

  • 集群吧,注册多台Eureka,然后把SpringCloud服务互相注册,客户端从Eureka获取信息时,按照Eureka的顺序来访问。

什么是Eureka的自我保护模式,

  • 默认情况下,如果Eureka Service在一定时间内没有接收到某个微服务的心跳,Eureka Service会进入自我保护模式,在该模式下Eureka Service会保护服务注册表中的信息,不在删除注册表中的数据,当网络故障恢复后,Eureka Servic 节点会自动退出自我保护模式

DiscoveryClient的作用

  • 可以从注册中心中根据服务别名获取注册的服务器信息。

Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别

1、 ZooKeeper中的节点服务挂了就要选举 在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的, 选举就是改微服务做了集群,必须有一台主其他的都是从
2、 Eureka各个节点是平等关系,服务器挂了没关系,只要有一台Eureka就可以保证服务可用,数据都是最新的。 如果查询到的数据并不是最新的,就是因为Eureka的自我保护模式导致的
3、 Eureka本质上是一个工程,而ZooKeeper只是一个进程
4、 Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像ZooKeeper 一样使得整个注册系统瘫痪
5、 ZooKeeper保证的是CP,Eureka保证的是AP


CAP: C:一致性>Consistency; 取舍:(强一致性、单调一致性、会话一致性、最终一致性、弱一致性) A:可用性>Availability; P:分区容错性>Partition tolerance;

Zuul

什么是网关?

  • 网关相当于一个网络服务架构的入口,所有网络请求必须通过网关转发到具体的服务。

网关的作用是什么

  • 统一管理微服务请求,权限控制、负载均衡、路由转发、监控、安全控制黑名单和白名单等

什么是Spring Cloud Zuul(服务网关)

  • Zuul是对SpringCloud提供的成熟对的路由方案,他会根据请求的路径不同,网关会定位到指定的微服务,并代理请求到不同的微服务接口,他对外隐蔽了微服务的真正接口地址。 三个重要概念:动态路由表,路由定位,反向代理:

    *  动态路由表:Zuul支持Eureka路由,手动配置路由,这俩种都支持自动更新
    *  路由定位:根据请求路径,Zuul有自己的一套定位服务规则以及路由表达式匹配
    *  反向代理:客户端请求到路由网关,网关受理之后,在对目标发送请求,拿到响应之后在 给客户端
  • 它可以和Eureka,Ribbon,Hystrix等组件配合使用,
  • Zuul的应用场景:

    *  对外暴露,权限校验,服务聚合,日志审计等
    

网关与过滤器有什么区别

  • 网关是对所有服务的请求进行分析过滤,过滤器是对单个服务而言。

常用网关框架有那些?

  • Nginx、Zuul、Gateway

Zuul与Nginx有什么区别?

  • Zuul是java语言实现的,主要为java服务提供网关服务,尤其在微服务架构中可以更加灵活的对网关进行操作。Nginx是使用C语言实现,性能高于Zuul,但是实现自定义操作需要熟悉lua语言,对程序员要求较高,可以使用Nginx做Zuul集群。

既然Nginx可以实现网关?为什么还需要使用Zuul框架

  • Zuul是SpringCloud集成的网关,使用Java语言编写,可以对SpringCloud架构提供更灵活的服务。

如何设计一套API接口

  • 考虑到API接口的分类可以将API接口分为开发API接口和内网API接口,内网API接口用于局域网,为内部服务器提供服务。开放API接口用于对外部合作单位提供接口调用,需要遵循Oauth2.0权限认证协议。同时还需要考虑安全性、幂等性等问题。

ZuulFilter常用有那些方法

  • Run():过滤器的具体业务逻辑
  • shouldFilter():判断过滤器是否有效
  • filterOrder():过滤器执行顺序
  • filterType():过滤器拦截位置

如何实现动态Zuul网关路由转发

  • 通过path配置拦截请求,通过ServiceId到配置中心获取转发的服务列表,Zuul内部使用Ribbon实现本地负载均衡和转发。

Zuul网关如何搭建集群

  • 使用Nginx的upstream设置Zuul服务集群,通过location拦截请求并转发到upstream,默认使用轮询机制对Zuul集群发送请求。

Ribbon

负载平衡的意义什么?

  • 简单来说: 先将集群,集群就是把一个的事情交给多个人去做,假如要做1000个产品给一个人做要10天,我叫10个人做就是一天,这就是集群,负载均衡的话就是用来控制集群,他把做的最多的人让他慢慢做休息会,把做的最少的人让他加量让他做多点。
  • 在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。

Ribbon是什么?

  • Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法
  • Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。简单的说,就是在配置文件中列出后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。(有点类似Nginx)

Nginx与Ribbon的区别

  • Nginx是反向代理同时可以实现负载均衡,nginx拦截客户端请求采用负载均衡策略根据upstream配置进行转发,相当于请求通过nginx服务器进行转发。Ribbon是客户端负载均衡,从注册中心读取目标服务器信息,然后客户端采用轮询策略对服务直接访问,全程在客户端操作。

Ribbon底层实现原理

  • Ribbon使用discoveryClient从注册中心读取目标服务信息,对同一接口请求进行计数,使用%取余算法获取目标服务集群索引,返回获取到的目标服务信息。

@LoadBalanced注解的作用

开启客户端负载均衡。

Hystrix

什么是断路器

  • 当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应 当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)
  • 断路器有三种状态

    *  打开状态:一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务
    *  半开状态:短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时 断路器关闭
    *  关闭状态:当服务一直处于正常状态 能正常调用
    

什么是 Hystrix?

  • 在分布式系统,我们一定会依赖各种服务,那么这些个服务一定会出现失败的情况,就会导致雪崩,Hystrix就是这样的一个工具,防雪崩利器,它具有服务降级,服务熔断,服务隔离,监控等一些防止雪崩的技术。
  • Hystrix有四种防雪崩方式:

    *  服务降级:接口调用失败就调用本地的方法返回一个空
    *  服务熔断:接口调用失败就会进入调用接口提前定义好的一个熔断的方法,返回错误信息
    *  服务隔离:隔离服务之间相互影响
    *  服务监控:在服务发生调用时,会将每秒请求数、成功请求数等运行指标记录下来。
    

谈谈服务雪崩效应

  • 雪崩效应是在大型互联网项目中,当某个服务发生宕机时,调用这个服务的其他服务也会发生宕机,大型项目的微服务之间的调用是互通的,这样就会将服务的不可用逐步扩大到各个其他服务中,从而使整个项目的服务宕机崩溃.发生雪崩效应的原因有以下几点
  • 单个服务的代码存在bug. 2请求访问量激增导致服务发生崩溃(如大型商城的枪红包,秒杀功能). 3.服务器的硬件故障也会导致部分服务不可用.

在微服务中,如何保护服务?

  • 一般使用使用Hystrix框架,实现服务隔离来避免出现服务的雪崩效应,从而达到保护服务的效果。当微服务中,高并发的数据库访问量导致服务线程阻塞,使单个服务宕机,服务的不可用会蔓延到其他服务,引起整体服务灾难性后果,使用服务降级能有效为不同的服务分配资源,一旦服务不可用则返回友好提示,不占用其他服务资源,从而避免单个服务崩溃引发整体服务的不可用.

服务雪崩效应产生的原因

  • 因为Tomcat默认情况下只有一个线程池来维护客户端发送的所有的请求,这时候某一接口在某一时刻被大量访问就会占据tomcat线程池中的所有线程,其他请求处于等待状态,无法连接到服务接口。

谈谈服务降级、熔断、服务隔离

  • 服务降级:当客户端请求服务器端的时候,防止客户端一直等待,不会处理业务逻辑代码,直接返回一个友好的提示给客户端。
  • 服务熔断是在服务降级的基础上更直接的一种保护方式,当在一个统计时间范围内的请求失败数量达到设定值(requestVolumeThreshold)或当前的请求错误率达到设定的错误率阈值(errorThresholdPercentage)时开启断路,之后的请求直接走fallback方法,在设定时间(sleepWindowInMilliseconds)后尝试恢复。
  • 服务隔离就是Hystrix为隔离的服务开启一个独立的线程池,这样在高并发的情况下不会影响其他服务。服务隔离有线程池和信号量两种实现方式,一般使用线程池方式。

服务降级底层是如何实现的?

  • Hystrix实现服务降级的功能是通过重写HystrixCommand中的getFallback()方法,当Hystrix的run方法或construct执行发生错误时转而执行getFallback()方法。

其他答案已经在公众号更新

关注公众号:搜云库技术团队,回复:面试题,即可获取全部

查看原文

棘丶 赞了文章 · 9月28日

第二版:SpringCloud 70 道 面试题

最近我一直在面试高级工程师,不管初级,高级,程序员,我想面试前,大家刷题一定是是少不了吧。

我也一样,我在网上找了很多面试题来看,最近又赶上跳槽的高峰期,好多粉丝,都问我要有没有最新面试题,索性,我就把我看过的和我面试中的真题,及答案都整理好,整理了《第2版:互联网大厂面试题》并分类92份 PDF,累计 3625页 我会持续更新中,马上就出第三版,涵盖大厂算法会更多!

其他都已经在公众号更新

关注公众号:搜云库技术团队,回复:面试题,即可获取全部

第2版:题库非常全面

包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!

什么是微服务架构

  • 微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信。这些服务围绕业务能力来划分,并通过自动化部署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限度的集中式管理。

为什么需要学习Spring Cloud

  • 首先springcloud基于spingboot的优雅简洁,可还记得我们被无数xml支配的恐惧?可还记得springmvc,mybatis错综复杂的配置,有了spingboot,这些东西都不需要了,spingboot好处不再赘诉,springcloud就基于SpringBoot把市场上优秀的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理
  • 什么叫做开箱即用?即使是当年的黄金搭档dubbo+zookeeper下载配置起来也是颇费心神的!而springcloud完成这些只需要一个jar的依赖就可以了!
  • springcloud大多数子模块都是直击痛点,像zuul解决的跨域,fegin解决的负载均衡,hystrix的熔断机制等等等等

Spring Cloud 是什么

  • Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
  • Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

SpringCloud的优缺点

优点:

  1.耦合度比较低。不会影响其他模块的开发。

  2.减轻团队的成本,可以并行开发,不用关注其他人怎么开发,先关注自己的开发。

  3.配置比较简单,基本用注解就能实现,不用使用过多的配置文件。

  4.微服务跨平台的,可以用任何一种语言开发。

  5.每个微服务可以有自己的独立的数据库也有用公共的数据库。

  6.直接写后端的代码,不用关注前端怎么开发,直接写自己的后端代码即可,然后暴露接口,通过组件进行服务通信。

缺点:

 1.部署比较麻烦,给运维工程师带来一定的麻烦。

 2.针对数据的管理比麻烦,因为微服务可以每个微服务使用一个数据库。

 3.系统集成测试比较麻烦

 4.性能的监控比较麻烦。【最好开发一个大屏监控系统】
  • 总的来说优点大过于缺点,目前看来Spring Cloud是一套非常完善的分布式框架,目前很多企业开始用微服务、Spring Cloud的优势是显而易见的。因此对于想研究微服务架构的同学来说,学习Spring Cloud是一个不错的选择。

SpringBoot和SpringCloud的区别?

  • SpringBoot专注于快速方便的开发单个个体微服务。
  • SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,
  • 为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务
  • SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关系
  • SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

Spring Cloud和SpringBoot版本对应关系

Spring Cloud VersionSpringBoot Version
Hoxton2.2.x
Greenwich2.1.x
Finchley2.0.x
Edgware1.5.x
Dalston1.5.x

SpringCloud由什么组成

  • 这就有很多了,我讲几个开发中最重要的

    *  Spring Cloud Eureka:服务注册与发现
    *  Spring Cloud Zuul:服务网关
    *  Spring Cloud Ribbon:客户端负载均衡
    *  Spring Cloud Feign:声明性的Web服务客户端
    *  Spring Cloud Hystrix:断路器
    *  Spring Cloud Config:分布式统一配置管理
    *  等20几个框架,开源一直在更新
    

使用 Spring Boot 开发分布式微服务时,我们面临什么问题

  • (1)与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。
  • (2)服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
  • (3)冗余-分布式系统中的冗余问题。
  • (4)负载平衡 --负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。
  • (5)性能-问题 由于各种运营开销导致的性能问题。

Spring Cloud 和dubbo区别?

  • (1)服务调用方式:dubbo是RPC springcloud Rest Api
  • (2)注册中心:dubbo 是zookeeper springcloud是eureka,也可以是zookeeper
  • (3)服务网关,dubbo本身没有实现,只能通过其他第三方技术整合,springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,springcloud支持断路器,与git完美集成配置文件支持版本控制,事物总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素。

Eureka

服务注册和发现是什么意思?Spring Cloud 如何实现?

  • 当我们开始一个项目时,我们通常在属性文件中进行所有的配置。随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化。手动更改属性可能会产生问题。 Eureka 服务注册和发现可以在这种情况下提供帮助。由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找,因此无需处理服务地点的任何更改和处理。

什么是Eureka

  • Eureka作为SpringCloud的服务注册功能服务器,他是服务注册中心,系统中的其他服务使用Eureka的客户端将其连接到Eureka Service中,并且保持心跳,这样工作人员可以通过Eureka Service来监控各个微服务是否运行正常。

Eureka怎么实现高可用

  • 集群吧,注册多台Eureka,然后把SpringCloud服务互相注册,客户端从Eureka获取信息时,按照Eureka的顺序来访问。

什么是Eureka的自我保护模式,

  • 默认情况下,如果Eureka Service在一定时间内没有接收到某个微服务的心跳,Eureka Service会进入自我保护模式,在该模式下Eureka Service会保护服务注册表中的信息,不在删除注册表中的数据,当网络故障恢复后,Eureka Servic 节点会自动退出自我保护模式

DiscoveryClient的作用

  • 可以从注册中心中根据服务别名获取注册的服务器信息。

Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别

1、 ZooKeeper中的节点服务挂了就要选举 在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的, 选举就是改微服务做了集群,必须有一台主其他的都是从
2、 Eureka各个节点是平等关系,服务器挂了没关系,只要有一台Eureka就可以保证服务可用,数据都是最新的。 如果查询到的数据并不是最新的,就是因为Eureka的自我保护模式导致的
3、 Eureka本质上是一个工程,而ZooKeeper只是一个进程
4、 Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像ZooKeeper 一样使得整个注册系统瘫痪
5、 ZooKeeper保证的是CP,Eureka保证的是AP


CAP: C:一致性>Consistency; 取舍:(强一致性、单调一致性、会话一致性、最终一致性、弱一致性) A:可用性>Availability; P:分区容错性>Partition tolerance;

Zuul

什么是网关?

  • 网关相当于一个网络服务架构的入口,所有网络请求必须通过网关转发到具体的服务。

网关的作用是什么

  • 统一管理微服务请求,权限控制、负载均衡、路由转发、监控、安全控制黑名单和白名单等

什么是Spring Cloud Zuul(服务网关)

  • Zuul是对SpringCloud提供的成熟对的路由方案,他会根据请求的路径不同,网关会定位到指定的微服务,并代理请求到不同的微服务接口,他对外隐蔽了微服务的真正接口地址。 三个重要概念:动态路由表,路由定位,反向代理:

    *  动态路由表:Zuul支持Eureka路由,手动配置路由,这俩种都支持自动更新
    *  路由定位:根据请求路径,Zuul有自己的一套定位服务规则以及路由表达式匹配
    *  反向代理:客户端请求到路由网关,网关受理之后,在对目标发送请求,拿到响应之后在 给客户端
  • 它可以和Eureka,Ribbon,Hystrix等组件配合使用,
  • Zuul的应用场景:

    *  对外暴露,权限校验,服务聚合,日志审计等
    

网关与过滤器有什么区别

  • 网关是对所有服务的请求进行分析过滤,过滤器是对单个服务而言。

常用网关框架有那些?

  • Nginx、Zuul、Gateway

Zuul与Nginx有什么区别?

  • Zuul是java语言实现的,主要为java服务提供网关服务,尤其在微服务架构中可以更加灵活的对网关进行操作。Nginx是使用C语言实现,性能高于Zuul,但是实现自定义操作需要熟悉lua语言,对程序员要求较高,可以使用Nginx做Zuul集群。

既然Nginx可以实现网关?为什么还需要使用Zuul框架

  • Zuul是SpringCloud集成的网关,使用Java语言编写,可以对SpringCloud架构提供更灵活的服务。

如何设计一套API接口

  • 考虑到API接口的分类可以将API接口分为开发API接口和内网API接口,内网API接口用于局域网,为内部服务器提供服务。开放API接口用于对外部合作单位提供接口调用,需要遵循Oauth2.0权限认证协议。同时还需要考虑安全性、幂等性等问题。

ZuulFilter常用有那些方法

  • Run():过滤器的具体业务逻辑
  • shouldFilter():判断过滤器是否有效
  • filterOrder():过滤器执行顺序
  • filterType():过滤器拦截位置

如何实现动态Zuul网关路由转发

  • 通过path配置拦截请求,通过ServiceId到配置中心获取转发的服务列表,Zuul内部使用Ribbon实现本地负载均衡和转发。

Zuul网关如何搭建集群

  • 使用Nginx的upstream设置Zuul服务集群,通过location拦截请求并转发到upstream,默认使用轮询机制对Zuul集群发送请求。

Ribbon

负载平衡的意义什么?

  • 简单来说: 先将集群,集群就是把一个的事情交给多个人去做,假如要做1000个产品给一个人做要10天,我叫10个人做就是一天,这就是集群,负载均衡的话就是用来控制集群,他把做的最多的人让他慢慢做休息会,把做的最少的人让他加量让他做多点。
  • 在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。

Ribbon是什么?

  • Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法
  • Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。简单的说,就是在配置文件中列出后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。(有点类似Nginx)

Nginx与Ribbon的区别

  • Nginx是反向代理同时可以实现负载均衡,nginx拦截客户端请求采用负载均衡策略根据upstream配置进行转发,相当于请求通过nginx服务器进行转发。Ribbon是客户端负载均衡,从注册中心读取目标服务器信息,然后客户端采用轮询策略对服务直接访问,全程在客户端操作。

Ribbon底层实现原理

  • Ribbon使用discoveryClient从注册中心读取目标服务信息,对同一接口请求进行计数,使用%取余算法获取目标服务集群索引,返回获取到的目标服务信息。

@LoadBalanced注解的作用

开启客户端负载均衡。

Hystrix

什么是断路器

  • 当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应 当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)
  • 断路器有三种状态

    *  打开状态:一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务
    *  半开状态:短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时 断路器关闭
    *  关闭状态:当服务一直处于正常状态 能正常调用
    

什么是 Hystrix?

  • 在分布式系统,我们一定会依赖各种服务,那么这些个服务一定会出现失败的情况,就会导致雪崩,Hystrix就是这样的一个工具,防雪崩利器,它具有服务降级,服务熔断,服务隔离,监控等一些防止雪崩的技术。
  • Hystrix有四种防雪崩方式:

    *  服务降级:接口调用失败就调用本地的方法返回一个空
    *  服务熔断:接口调用失败就会进入调用接口提前定义好的一个熔断的方法,返回错误信息
    *  服务隔离:隔离服务之间相互影响
    *  服务监控:在服务发生调用时,会将每秒请求数、成功请求数等运行指标记录下来。
    

谈谈服务雪崩效应

  • 雪崩效应是在大型互联网项目中,当某个服务发生宕机时,调用这个服务的其他服务也会发生宕机,大型项目的微服务之间的调用是互通的,这样就会将服务的不可用逐步扩大到各个其他服务中,从而使整个项目的服务宕机崩溃.发生雪崩效应的原因有以下几点
  • 单个服务的代码存在bug. 2请求访问量激增导致服务发生崩溃(如大型商城的枪红包,秒杀功能). 3.服务器的硬件故障也会导致部分服务不可用.

在微服务中,如何保护服务?

  • 一般使用使用Hystrix框架,实现服务隔离来避免出现服务的雪崩效应,从而达到保护服务的效果。当微服务中,高并发的数据库访问量导致服务线程阻塞,使单个服务宕机,服务的不可用会蔓延到其他服务,引起整体服务灾难性后果,使用服务降级能有效为不同的服务分配资源,一旦服务不可用则返回友好提示,不占用其他服务资源,从而避免单个服务崩溃引发整体服务的不可用.

服务雪崩效应产生的原因

  • 因为Tomcat默认情况下只有一个线程池来维护客户端发送的所有的请求,这时候某一接口在某一时刻被大量访问就会占据tomcat线程池中的所有线程,其他请求处于等待状态,无法连接到服务接口。

谈谈服务降级、熔断、服务隔离

  • 服务降级:当客户端请求服务器端的时候,防止客户端一直等待,不会处理业务逻辑代码,直接返回一个友好的提示给客户端。
  • 服务熔断是在服务降级的基础上更直接的一种保护方式,当在一个统计时间范围内的请求失败数量达到设定值(requestVolumeThreshold)或当前的请求错误率达到设定的错误率阈值(errorThresholdPercentage)时开启断路,之后的请求直接走fallback方法,在设定时间(sleepWindowInMilliseconds)后尝试恢复。
  • 服务隔离就是Hystrix为隔离的服务开启一个独立的线程池,这样在高并发的情况下不会影响其他服务。服务隔离有线程池和信号量两种实现方式,一般使用线程池方式。

服务降级底层是如何实现的?

  • Hystrix实现服务降级的功能是通过重写HystrixCommand中的getFallback()方法,当Hystrix的run方法或construct执行发生错误时转而执行getFallback()方法。

其他答案已经在公众号更新

关注公众号:搜云库技术团队,回复:面试题,即可获取全部

查看原文

赞 21 收藏 18 评论 0

棘丶 发布了文章 · 9月23日

springcloud和zookeeper

springcloud的eureka注册中心

1.注册

每当一个提供者开启服务时就会不断的向注册发起注册请求,直到成功注册

2.拉取

每30秒拉取一次注册表,更新注册表(当一个服务器拉取获得注册表就会在本地保存,注册中心宕了也不受影响)

3.自我保护

当注册中心有心跳检测85%以上的心跳异常时开启注册中心,不删除表中的注册信息

4.心跳检测

当有服务器心跳异常时不会第一时间删除该服务器注册的信息,而是每30秒向服务器发起心跳检测,3次没有回应则判断服务器挂了,删除该服务器注册信息

zookeeper注册中心与eureka注册中心区别

eureka

AP模式(强调可用性每阁一段时间更新,最终达到一致即可)
集群(同级结构)

zookeeper

CP模式(强调一致性及时更新注册信息表)
集群(主从结构)
查看原文

赞 0 收藏 0 评论 0

棘丶 发布了文章 · 9月14日

redis

redis持久化存储策略

AOF模式-(默认)

特点:aof模式采用记录用户执行的状态,缺点:持久化文件较大,恢复数据能力较慢,优点:能保证数据的安全性.

RDB模式-(需要手动开启)

特点:RDB模式采用的是快照的方式并且会覆盖之前的内存快照,定期进行持久化到磁盘中,优点:持久化文件效小,回复数据快,缺点:不能保证数据的安全性.

总结

1.当用户允许丢失某些数据时一般采用rdb模式进行数据持久化.
2.当用户不允许丢失数据时一般采用aof模式进行数据持久化.

**在reids集群中一般设置主机为rdb模式,从机采用aof模式,来提高性能..

redis的内存优化

LRU算法

lru算法也就是页面置换算法利用了时间维度来进行了计算,会记录上一次访问的时间,当要删除时会删除时间较大的页面.

LFU算法

lfu算法会记录访问的引用次数,访问一次加1,为了保证指数衰减的平均使用次数,所以引用计数寄存器定时右移一位,当要删除时会删除较小的访问次数

随机算法

也就是随机删除(不可取)

TTL算法

检索失效时间,提前删除存活时间少的数据

redis的8种内存优化策略

1.volatile-lru  在设定了超时时间的数据中,采用lru算法.
2.allkeys-lru  所有数据采用lru算法
3.volatile-lfu  在超时的数据中采用lfu算法
4.allkeys-lfu -> 所有数据采用lfu算法
5.volatile-random -> 设定超时时间的数据采用随机算法
6.allkeys-random -> 所有数据随机删除
7.volatile-ttl ->  删除存活时间少的数据
8.noeviction -> 不会删除数据,如果内存溢出报错返回.

缓存的穿透

是指在高并发的环境下不停的查询数据库中没有的数据,从而redis没有实现效果,导致数据库崩溃
解决方法:当访问不存在时,当有用户连续访问过大,禁止IP访问,也可以在微服务中设置网关过滤.

缓存的雪崩

是指在高访问量时缓存的数据突然大量失效,从而直接大量去数据库查询数据,导致数据库压力过大崩溃.
解决方法:配置多级缓存和设置数据失效时间不一致.

缓存的击穿

是指在高访问量时缓存的某条数据失效,去查询数据库期间一堆这条数据的查询业务涌向数据库从而崩溃.
解决方法:配置多级一台失效时会寻第二台redis查询完毕直接返回即可

关于伪静态的说明

由于一般的搜索引擎只能检测静态的页面,不能检索动态页面信息,为了让浏览器能检索到所以,后缀名为html的动态页面.

搜索引擎的工作原理(倒排索引)

搜索引擎的搜索机制

查看原文

赞 0 收藏 0 评论 0

棘丶 发布了文章 · 8月26日

shiro理解

shiro框架


认证模块

AuthenticationInfo

同时还得配置controller层,使用subject

//1.需要从token中获得用户名级密码怎么办?
UsernamePasswordToken Utoken = (UsernamePasswordToken)token;  //token强转成子类对象可获得
String username = Utoken.getUsername();
token(将token类型强转为他的子类usernamepasswordToken类型),以便获取账户和密码
//2.从数据库查询?
通过当前用户的登录的username查询数据库是否有对应的用户信息
SysUsersinsert sysusers = sysuserdao.selectById(username);
//3.对查询结构进行判断?
if(sysusers==null)
    throw new UnknownAccountException();//没有找到异常
//3.1判断是否被锁定?
if(sysusers.getvalid()==0)
    throw new LockedAccountException();//用户名被锁定异常
/4.封装用户信息并返回.?不知道返回的是什么,看方法的返回值
//由于盐值传递的必须是要转换一下
ByteSource credentialsSalt =                                           ByteSource.Util.bytes(sysusers.getSalt());
SimpleAuthenticationInfo info = 
                        new SimpleAuthenticationInfo(
        sysusers, // 用户身份
        sysusers.getPassword(), //数据库的密码(已被加密)
        credentialsSalt, //盐值
        getName());//认证对象返回
 return info;   

授权模块

AuthorizationInfo

获取当前对象

    SysUsersinsert user =( //获取当前类对强转一下像转换       SysUsersinsert)principals.getPrimaryPrincipal();

基于菜单id查询授权标识并校验

注意需要授权的业务在业务方法上加入注解@RequiresPermissions("sys:user:update")

List<String> menusSTRING =   sysmenudao.findMenusStringprop(menuids);
    if(menusSTRING==null||menusSTRING.size()==0)
            throw new AuthorizationException();

封装查询结果并返回

SimpleAuthorizationInfo sim = new SimpleAuthorizationInfo();
        sim.setStringPermissions(stringPermissions);
        return sim;
//由于 sim.setStringPermissions(stringPermissions) 需要传入一个List类型所以创建一个集合
Set<String> stringPermissions=new HashSet<>();    
    for (String pre : menusSTRING) {
            if(pre!=null&&!"".equals(pre)) {
                stringPermissions.add(pre);
            }
        }     

还需要配置凭证匹配器

//设置凭证匹配器:还有一种方式为get
    @Override
    public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {
        //构建匹配器对象
        HashedCredentialsMatcher credent = new HashedCredentialsMatcher();
        //设置加密算法
        credent.setHashAlgorithmName("MD5");
        //设计几次加密与添加用户时相同次数
        credent.setHashIterations(1);
        super.setCredentialsMatcher(credent);
    }

shiro框架的手动配置

超级管理员SecurityManager

//Realm 是认证和授权的两个实现类的一个大接口好处是实现了多态减少代码的编写
@Bean
public SecurityManager SecurityManager(Realm realm){
 DefaultWebSecurityManager securityManager=
                new DefaultWebSecurityManager();
      securityManager.setRealm(realm);          
      return securityManager;          
    }
//如果需要配置缓存将缓存对象也得注入给securityManager对象 
CacheManager 缓存对象
RememberMeManager 记住我对象 
//将两个同时注入到SecurityManager之中   ji'ke

        //添加shiro框架的cache缓存
    @Bean
    public CacheManager newcacheMange() {
        return new MemoryConstrainedCacheManager();
    }

授权管理配置

/**    授权管理操作时
     *     首先在springboot项目中只需要配置Advison,其他两个配置由spring底层自动配置
     *     配置shiro中的Advison对象,此对象在spring框架启动时用于告知spring框架要为那些切入点描述对象创建代理对象
     */
@Bean
public AuthorizationAttributeSourceAdvisor                 authorizationAttributeSourceAdvisor(SecurityManager  securityManager) {
        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
    }

手动添加认证跳转信息(模板)

//设置通过此对象设置资源匿名访问、认证访问。关键代码如下:
@Bean
public ShiroFilterFactoryBean shiroFilterFactory (SecurityManager securityManager) {
 ShiroFilterFactoryBean sfBean    = new     ShiroFilterFactoryBean();                sfBean.setSecurityManager(securityManager);
//定义map指定请求过滤规则(哪些资源允许匿名访问,哪些必须认证访问)
 sfBean.setLoginUrl("/doLoginUI"); //设置认证页LinkedHashMap<String,String> map= new LinkedHashMap<>();
          //静态资源允许匿名访问:"anon"                                map.put("/bower_components/**","anon");
          map.put("/build/**","anon");
          map.put("/dist/**","anon");
          map.put("/plugins/**","anon");
          map.put("/user/doLogin","anon");
          map.put("/doLogout","anon");
//除了匿名访问的资源,其它都要认证("authc")后访问
          map.put("/**","user");                 sfBean.setFilterChainDefinitionMap(map);  //直接加入map也可以一个的加
                 return sfBean;
             }

使用添加依赖包的方式配置shiro

@Configuration//此注解描述的类为spring的配置类,不用把那边的业务交给spring管理了

@Configuration
public class SpringShiroConfig{
@Bean   
public Realm realm() {        
    return new shiroAuthenSerivce();  
    }
//配置认证转换器
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
 //同上可以是Map集合也一个一个的添加,最好用map
    chainDefinition.setaddPathDefinitions(map);
}
//如果想要配置cache缓存、话直接配置一下代码即可
@Bean
protected CacheManager shirocacheManager() {
        return new MemoryConstrainedCacheManager();
    }
查看原文

赞 0 收藏 0 评论 0

棘丶 发布了文章 · 8月22日

aop理解

Aop 理解

什么是Aop?

Aop是spring框架提供的切面编程,主要作用与在不修改原有业务的时候扩展新的业务.降低程序的耦合度,增强程序的开发效率.代码得到重用性.

Aop如何实现

Aop实现主要有两种方式

配置中如果没有配置那么默认使用的是cglib
1.jdk自代的动态代理.为目标对象创建代理对象
2.cglib代理机制,为目标创建代理对象

什么是OCP原则(开闭原则)?

ocp开闭原则是对业务修改关闭,对业务扩展开发

AOP 相关术语分析

@Async 进行异步操作spring框架会在底层创建一个新的线程池,被@Async修饰的方法会又线程池分配的一个线程来进行调用.
@Order 设置优先级,设置数字优先级越高优先级也就越高

五大通知

@Advice 通知.在切面的某一个链接点进行通知操作例如:
1.@befor:第二顺序执行不管失 前置通知
2.@Around:优先级最高 环绕通知
3.@After:不管程序执行成功与否当快要执行完时都会先执行 后置通知
4.@AfterReturning: 程序执行成功执行 返回通知
5.@Afterthwing: 程序执行失败执行 异常通知

四大连接点

@poincut 切面编程的切入点~~~~
1.bean(直接指定保存在bean中的对象)粗略的切入点,该类下所有的方法都可以进行方法的扩展
2.@annotation(指定注解接口的全限定类名),细腻的切入点,只有被该注解修饰的方法才会有方法的扩展
3.within 用于匹配包下的所有类中的所有方法
4.execution 用于指定方法~~~~

Spring AOP事务处理

@Transaction
默认事务回滚
@Transaction(timeout:时长到时自动回滚事务)

如何获取注解上的值

//1.获取用户行为日志信息
        //获取目标对象(要执行的那个目标业务对象)类
        Class<?> getcls = jp.getTarget().getClass();
        MethodSignature sim = (MethodSignature) jp.getSignature();//强转是为了让他获取更多的方法
        Method methods = getcls.getDeclaredMethod(sim.getName(), sim.getParameterTypes());
        System.out.println(methods);
        //判断是否是LoginObject的注解值 
        LoginObject falg = methods.getAnnotation(LoginObject.class);
        String operation="operation";
        if(falg!=null)
            operation = falg.value();

环绕通知最为重要,重点一下

由@Around注解描述的方法为一个环绕通知方法,我们可以在此方法内部
         手动调用目标方法(通过连接点对象ProceedingJoinPoint的proceed方法进行调用)
          环绕通知:此环绕通知使用的切入点为bean(sysUserServiceImpl)
          环绕通知特点:
        1)编写:
      a)方法的返回值为Object.
      b)方法参数为ProceedingJoinPoint类型.
      c)方法抛出异常为throwable.
           2)应用:
      a)目标方法执行之前或之后都可以进行功能拓展
      b)相对于其它通知优先级最高。
        @param jp 为一个连接对象(封装了正在要执行的目标方法信息)
        @return 目标方法的执行结果
      @throws Throwable 

事务Transaction的处理

@Transactional(timeout = 30,    //执行时长到时自动回滚
 readOnly = false,              //只读事务,*   为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
 isolation = Isolation.READ\_COMMITTED,//事务的隔离级别,默认值采用 DEFAULT.
 rollbackFor = Throwable.class, //异常回滚事务
 propagation = Propagation.REQUIRED) //Propagation.new的话为事务的都在新的线程处理事务
 no-rollback- for  抛出 no-rollback-for 指定的异常类型,不回滚事务。

Spring 中事务传播特性

@Transactional(propagation=Propagation.REQUIRED) 
如果没有事务创建新事务, 如果当前有事务参与当前事务, Spring 默认的事务传播行为是PROPAGATION\_REQUIRED,它适合于绝大多数的情况
@Transactional(propagation=Propagation.REQUIRES\_NEW)
必须是新事务, 如果有当前事务, 挂起当前事务并且开启新事务

Spring AOP异步操作实现

1.  @EnableAsync //spring容器启动时会创建线程池
  @SpringBootApplication
 public class Application {
 public static void main(String\[\] args) {
 SpringApplication.run(Application.class, args);
 }
}
2. @在需要异步执行的业务方法上,使用@Async方法进行异步声明。即可
##### 
当我们需要自己对spring框架提供的连接池进行一些简易配置,
spring:
 task:
 execution:
 pool:
 queue-capacity: 128    阻塞队列最大等待线程数
 core-size: 5           核心线程数
 max-size: 128          最大线程数
 keep-alive: 60000      当线程空闲时60s后执行线程销毁回收
 thread-name-prefix: db-service-task-      为线程创建名字

Spring AOP中Cache操作实现

1.  @EnableCaching //spring容器启动时会自动启动cache配置缓存
  @SpringBootApplication
 public class Application {
 public static void main(String\[\] args) {
 SpringApplication.run(Application.class, args);
 }
}
2.在需要缓存的方法上配置@Cacheable(value = "deptCache"),      cache配置姓名以便后期清理缓存
3.在需要清理缓存的方法上配置@CacheEvict(value="deptCache",allEntries=true)
当执行结束的清理缓存,cache姓名和清理所以缓存配置

在Spring中默认cache底层实现是一个Map对象,假如此map对象不能满足我们实际需要,在实际项目中我们可以将数据存储到第三方缓存系统中.

查看原文

赞 0 收藏 0 评论 0

棘丶 关注了用户 · 8月21日

程序媛小红 @sf_hcx

关注 770

认证与成就

  • 获得 1 次点赞
  • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 7月28日
个人主页被 127 人浏览