Spring 基础常识

1.你是如何理解分布式的?

为了解决传统单体服务架构带来的各种问题 ,比如代码数量庞大 ,迭代测试维护比较困难,可能因为一处改动测试不到位造成整个服务瘫痪等问题,分布式系统就是将一个大的服务拆分成几十个甚至几百个微小的服务。方便大家分工开发,也方便大家分开开发,代码不在一个项目里也不会冲突,最主要的是项目自己维护。

2.讲一下最近的一个项目模块介绍

最近我在xxx公司中的xxx项目中参与了限时抢购的模块,在本模块中,首先要根据时间限制和库存限制来查询出符合条件的商品信息显示到活动商品页面,用户可以点击某一个喜欢的商品进行购买,用户在下单时要扣减库存,当我们的库存为0 的时候就无法参加活动了,用户下单成功之后,会跳转到支付页面,支付成功,完成订单,如果用户下单五分钟内未进行支付,就会取消订单,调用支付的关闭订单的接口,恢复库存。在限时抢购模块中,有几个注意的,比如异步抢单,还有用户重复排队的现象,还有并发超卖的一个问题。

3.那你是如何解决一个并发超卖的问题的?

可以用Spring事务还有redis队列进行解决,首先想到使用Spring事务来解决,先更新后查询,然后判断是否超库存了,如果超库存就抛出异常,通过Spring事务回滚处理,但是有一定的缺陷,Spring事务不能保证数据一致性和业务逻辑正确性,而且减库存的压力都落在的数据库上,不能保证一个高并发。

所以我使用了redis队列,通过reids预减库存避免线程安全问题,然后我们会给每一个独立的商品进行队列,每次用户下单的时候,先从队列中读取数据,如果没有读到数据,示他已经没有库存,如果读取到数据了,表明还有库存,则创建商品订单,通过rabbitmq实现异步下单,回退库存,解决订单超时问题,通过定时任务检查redis和mysql的数据一致性。

4.如果用户使用两台电脑同时下单,怎么解决?

超卖问题,就是指多人同时抢购一个商品时,同时判断是否有库存,如果库存只有一个了,那他们都会显示还有库存,这样就会产生一个商品订多个订单的现象了,也就是超卖问题。

实现思路:

可以利用Redis队列实现,在这可以给每一个独立的商品进行队列。每次用户下单的时候,先从队列中读取数据,如果没有读到数据,提示他已经没有库存,如果读取到数据了,表明还有库存,则创建商品订单,将商品信息存入Redis中,然后修改数据库库存。之后判断该商品是否还有库存。如果没有库存,则直接数据重置到Redi中。

5.SpringBoot和SpringCloud的区别?

SpringBoot专注于快速方便的开发单个个体微服务。

SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来

为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务

SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关系

Spring Cloud 和dubbo区别?

(1)服务调用方式 dubbo是RPC springcloud Rest Api

(2)注册中心,dubbo 是zookeeper springcloud是eureka,也可以是zookeeper

(3)服务网关,dubbo本身没有实现,只能通过其他第三方技术整合,springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发

6.怎么解决负载均衡

(1)轮询

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

(2) weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

7.eureka和ZooKeeper/为什么使用eureka

当我们向注册中心查询数据时,如果master节点因为网络故障和其他节点失去联系时,那么 Zookeeper 会进行选举,问题是在选举过过程中,Zookeeper集群都是不可用的,这就导致在选举期间注册服务瘫痪。

而Eureka注册时如果发现连接失败,会自动切换至其他节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。之外, Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障。

8.项目中什么地方使用了Redis

购物车,广告缓存,搜索引擎,商品,

9.什么是熔断?降级?

服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。

服务降级为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。

10. Get post Put Delete 请求的区别:

1、GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的。

2、与GET不同的是,PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。

3、POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。

4.DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操作。

11.SpringBoot可以用xml文件配置吗

可以, SpringBoot是简化了Spring的配置,只是大部分配置都是已经默认了。”

12.SpringCloud

Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性简化了分布式系统的开发,比如服务发现、服务网关、服务路由、链路追踪等。Spring Cloud 并不重复造轮子,而是将市面上开发得比较好的模块集成进去,进行封装,从而减少了各模块的开发成本。换句话说:Spring Cloud 提供了构建分布式系统所需的“全家桶”。

1 服务开发 :spring boot spring mvc spring

2 服务的配置与管理 : netfix

3 服务的注册于发现 :eureka,consul,zookeeper

4 服务的调用:rest

5 服务的熔断器 :hystrix

6 负载均衡 :ribbon .nginx

7 服务接口调用(客户端调用服务的简化工具) Feign等消息队列Kafka、 Rabbitmq、 Activemq等

8 服务配置中心管理Spring Cloud Config、Chef等服务路由(API网关)Zuu等

9 服务监控Zabbix、 Nagios、 Metrics、 Spectator等

10 全链路追踪Zipkin, Brave、 Dapper等

11 服务部罟Docker、 Open Stack、 Kubernetes等

12 数据流操作开发包Spring Cloud Stream(封装与 Redis, Rabbit、 Kafka等发送接收消息)

13.怎样配置Nginx实现负载均衡

在nginx里面配置一个upstream,然后把相关的服务器ip都配置进去。然后采用轮询的方案,然后在nginx里面的配置项里,proxy-pass指向这个upstream,这样就能实现负载均衡。

14.线程池

(1) 线程池的概念:

线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务

(2) 线程池的工作机制:

在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程。

一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。

(3) 使用线程池的原因:

多线程运行时间,系统不断的启动和关闭新线程,成本非常高,会过渡消耗系统资源,以及过渡切换线程的危险,从而可能导致系统资源的崩溃。这时,线程池就是最好的选择了。

如何优化线程

15死锁

关于死锁,我们在学习操作系统的时候就知道它产生的原因和危害,这里就不从原理上去累述了,可以从下面的代码和图示重温一下死锁产生的原因:

预防和处理死锁的方法:

1)尽量不要在释放锁之前竞争其他锁

一般可以通过细化同步方法来实现,只在真正需要保护共享资源的地方去拿锁,并尽快释放锁,这样可以有效降低在同步方法里调用其他同步方法的情况

2)顺序索取锁资源

如果实在无法避免嵌套索取锁资源,则需要制定一个索取锁资源的策略,先规划好有哪些锁,然后各个线程按照一个顺序去索取,不要出现上面那个例子中不同顺序,这样就会有潜在的死锁问题

3)尝试定时锁

Java 5提供了更灵活的锁工具,可以显式地索取和释放锁。那么在索取锁的时候可以设定一个超时时间,如果超过这个时间还没索取到锁,则不会继续堵塞而是放弃此次任务,示例代码如下:

这样可以有效打破死锁条件。

4)检查死锁

JVM采用thread dump的方式来识别死锁的方式,可以通过操作系统的命令来向JVM发送thread dump的信号,这样可以查询哪些线程死锁。

16.synchronized同步锁

可以修饰普通方法,静态方法和代码块。当synchronized修饰一个方法或者一个代码块的时候,它能够保证在同一时刻最多只有一个线程执行该段代码。 对于静态同步方法,锁是当前类的Class对象。 对于同步方法块,锁是Synchonized括号里配置的对象。 当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。 synchronized最常用的使用场景就是多线程并发编程时线程的同步。这边还是举一个最常用的列子:多线程情况下银行账户存钱和取钱的列子。

18.事务什么意思

通常的观念认为,事务仅与数据库相关。

事务必须服du从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写

事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问

19.springmvc与springboot区别*

Spring MVC是基于 Servlet 的一个 MVC 框架 主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML、 JavaConfig、hin处理起来比较繁琐。于是为了简化开发者的使用,从而创造性地推出了Spring boot,约定优于配置,简化了spring的配置流程。

Spring MVC提供了一种轻度耦合的方式来开发web应用。Spring Boot实现了自动配置,降低了项目搭建的复杂度。

Spring MVC是Spring的一个模块,式一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。

Spring Boot只是承载者,辅助你简化项目搭建过程

Spring MVC 是基于Spring的一个 MVC 框架 ;

Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。

20.springboot核心****

起步依赖机制:通过起步依赖机制(Starter),简化jar包的引用,解决jar版本冲突问题。

自动配置:可以实现简单配置,甚至是零配置,就能搭建整套框架。

StringBoot CLI:一种命令工具。

Actuator:是SpringBoot的程序监控器,可监控Spring应用程序上下文中的Bean、查看自动配置决策、Controller映射、线程活动、应用程序健康状况等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值