-
Ribbon 和 Feign 的区别
参考答案 启动类注解不同:Ribbon是@RibbonClient ;Feign是@EnableFeignClients。 服务指定的位置不同:Ribbon是在@RibbonClient注解上声明;Feign则是在定义抽象方法的接口中使用@FeignClient声明。 调用方式不同:Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。…...- 282
-
Mybatis 都有哪些 Executor 执行器,它们之间的区别是什么
参考答案 Mybatis有三种基本的Executor执行器:SimpleExecutor、ReuseExecutor、BatchExecutor。 1. SimpleExecutor 每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。 2. ReuseExecutor 执行update或select,以sql作为key查找Stateme…...- 151
-
MySQL的高可用方案有哪些
参考答案 本篇详解:MySQL的高可用方案选型,MySQL的5个常见高可用方案、以及其各自的优缺点。 一、 MySQL的高可用方案选型 在考虑MySQL数据库的高可用的架构时,主要参考如下几个方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断。 用作备份、只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持…...- 147
-
JDK 动态代理和 CGLIB 动态代理的区别
参考答案 Spring AOP中的动态代理主要有两种方式:JDK 动态代理和 CGLIB 动态代理: JDK动态代理 只提供接口的代理,不支持类的代理。 核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个…...- 135
-
Dubbo 和 Spring Cloud 的区别
参考答案 定位:Dubbo 专注 RPC 和服务治理;Spirng Cloud 是一个微服务架构生态。 性能:Dubbo 强于 SpringCloud(主要是通信协议的影响)。 功能范围:Dubbo 诞生于面向服务架构时代,是一个分布式、高性能、透明化的 RPC 服务框架,提供服务自动注册、自动发现等高效服务治理方案;Spring Cloud 诞生于微服务架构时代,基于 Spring、Spring…...- 135
-
Eureka 和 Zookeeper 的区别是什么
参考答案 Eureka 和 Zookeeper 都能提供服务注册与发现的功能,Eureka和zookeeper的区别: 1. Zookeeper保证了CP(C:一致性,P:分区容错性) 当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的信息,但不能容忍直接down掉不可用。也就是说,服务注册功能对高可用性要求比较高,但Zookeeper会出现这样一种情况,当master节点因为…...- 133
-
MySQL有哪些事务隔离级别
参考答案 MySQL的4个事务隔离级别: 1. READ-UNCOMMITTED(读取未提交) 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。 2. READ-COMMITTED(读取已提交) 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。 3. REPEATABLE-READ(可重复读) 对同一字段的多次读取结果都是一致的,…...- 129
-
Spring 如何解决循环依赖问题
参考答案 在Spring中,循环依赖问题主要有以下三种情况: 通过构造方法进行依赖注入时产生的循环依赖问题。 通过setter方法进行依赖注入且是在多例(原型)模式下产生的循环依赖问题。 通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。 在Spring中,只有第3种方式的循环依赖问题被解决了,第1和第2种方式在遇到循环依赖问题时都会产生异常。 原因: 第1种构造方法注入的情况下…...- 129
-
Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id是否可以重复
参考答案 不同的Xml映射文件: 如果配置了namespace,id可以重复。 如果没有配置namespace,id不能重复。 原因: namespace+id是作为Map的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。 有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。 备注: 在旧版本的Mybat…...- 126
-
MySQL进行慢SQL优化的优化思路、解决办法
参考答案 MySQL进行慢SQL优化: 一、MySQL进行慢SQL优化的思路 通过慢查询日志去寻找哪些 SQL 执行效率低。 使用 explain 获取低效率 SQL 的执行计划。 结合 SQL 与执行计划,进行分析与优化。 二、引起 SQL 查询很慢的原因,以及解决办法 1. 没有索引 解决办法: 根据 where 和 order by 使用比较频繁的字段创建索引,提高查询效率。 索引不宜过…...- 124
-
如何实现 MyBatis 与 Spring 的集成
参考答案 MyBatis 创建了 MyBatis-Spring 项目与 Spring 进行无缝整合,让 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 Spring 的 bean 中。 核心配置就是 dataSource、SqlSessionFactoryBean、MapperScannerConfigurer。 1. data…...- 115
-
你知道哪些微服务技术栈
参考答案 维度:springcloud 服务开发:springboot spring springmvc 服务配置与管理:Netfix的Archaiusm,阿里的Diamond 服务注册与发现:Eureka,Zookeeper 服务调用:Rest RPC gRpc 服务熔断器:Hystrix 服务负载均衡:Ribbon Nginx 服务接口调用:Fegin 消 息 队 列:Kafka Rabbitm…...- 93
-
AQS的底层原理是什么
参考答案 1. AQS是什么 前往查看:AQS是什么 2. AQS 的内部实现 AQS 队列内部维护的是一个 FIFO 的双向链表,这种结构的特点是每个数据结构都有两个指针,分别指向直接的后继节点和直接前驱节点,所以双向链表可以从任意一个节点开始很方便的访问前驱和后继。 每个 Node 其实是由线程封装,当线程争抢锁失败后,会封装成 Node 加入到 ASQ 队列中。当获取锁的线程释放锁后,…...- 91
-
CAS的底层原理是什么
参考答案 1. CAS(compareAndSwap)的概念 前往查看:什么是CAS 2. CAS的优点、缺点 前往查看:CAS有什么优点、缺点 3. CAS的底层原理 CAS的实现主要在JUC中的atomic包,我们以AtomicInteger类为例: 通过代码追溯,可见: Java中的CAS操作,都是通过sun包下Unsafe类实现。 而Unsafe类中的方法都是native方法,由JV…...- 88
-
MySQL分库分表怎么操作
参考答案 一、MySQL分库分表的原因 随着用户的增多,当数据量大到一定程度,仅一张表的数据可能就超过千万时,执行查询或修改等操作就比较耗时,这时就需要进行数据库切分的操作。 二、MySQL分库分表的方式 1. MyBatis实现分表最简单步骤 1)模拟用户表数据量已超过千万。 2)用户表原来的名字叫做user_tab,我们切分为user_tab_0和user_tab_1,这样就能把原来千万的数…...- 86
-
如何保证 MQ 的高可用
参考答案 ActiveMQ: Master-Slave 部署方式主从热备,方式包括通过共享存储目录来实现(shared filesystem Master-Slave)、通过共享数据库来实现(shared database Master-Slave)、5.9版本后新特性使用 ZooKeeper 协调选择 master(Replicated LevelDB Store)。 Broker-Cluste…...- 83
-
什么是Redis持久化、Redis持久化机制,以及各自的优缺点
参考答案 一、Redis持久化 持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。 二、Redis 的持久化机制、以及其优缺点 Redis 提供两种持久化机制: RDB(默认) 和 AOF 机制。 1. RDB:是Redis DataBase缩写快照 RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配…...- 79
-
如何停止一个线程池
参考答案 Java 并发工具包中 java.util.concurrent.ExecutorService 接口定义了线程池任务提交、获取线程池状态、线程池停止的方法等。 JDK 1.8 中,线程池的停止一般使用以下方法 shutdown() shutdownNow() shutdown() + awaitTermination(long timeout, TimeUnit unit) 1. 详…...- 78
-
Redis如何实现分布式锁
参考答案 Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。 Redis中可以使用SETNX命令实现分布式锁: 当且仅当 key 不存在,将 key 的值设为 value。 若给定的 key 已经存在,则 SETNX 不做任何动作。 SETNX (SET if Not eXists)如果不存在,则 SET。 返回值:设置成功,返回1;设…...- 73
-
Executors创建线程池有哪几种方式
参考答案 1. 关于Executors类 Executors 类是从 JDK 1.5 开始就新增的线程池创建的静态工厂类,用来创建线程池的。 但是,现在很多大厂已经不建议使用该类去创建线程池。原因在于,该类创建的很多线程池的内部使用了无界任务队列,在并发量很大的情况下会导致 JVM 抛出 OutOfMemoryError,直接让 JVM 崩溃,影响严重。 2. Executors 类的使用方法…...- 72
-
Spring Boot 和 Spring Cloud 有哪些区别
参考答案 Spring boot和Spring cloud的区别: 1. Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务;Spring Cloud是一个基于Spring Boot实现的云应用开发工具。 2. Spring boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架。 3. Spr…...- 72
-
分布式Redis是前期做,还是后期规模大了再做
参考答案 Redis是轻量的(单实例只使用1M内存),为防止以后扩容,最好的办法就是一开始就启动较多实例。 即便只有一台服务器,也可以一开始就让Redis以分布式的方式运行,使用分区,在同一台服务器上启动多个实例。 一开始就多设置几个Redis实例,例如32或者64个实例,对大多数用户来说,操作可能比较麻烦,但是长远来看是值得的。 如果前期就这样做,当后期数据不断增长,要用到更多的Redis服务器…...- 71
-
MQ 有哪些使用场景
参考答案 MQ 的使用场景: 异步处理:用户注册后,发送注册邮件和注册短信。用户注册完成后,提交任务到 MQ,发送模块并行获取 MQ 中的任务。 系统解耦:比如用注册完成,再加一个发送微信通知。只需要新增发送微信消息模块,从 MQ 中读取任务,发送消息即可。无需改动注册模块的代码,这样注册模块与发送模块通过 MQ 解耦。 流量削峰:秒杀和抢购等场景经常使用 MQ 进行流量削峰。活动开始时流量暴增,…...- 67
-
如何保证缓存与数据库双写时的数据一致性
参考答案 只要用缓存,就可能会涉及到缓存与数据库双存储双写。只要是双写,就一定会有数据一致性的问题。 如何解决数据一致性的问题呢?有两个方案供参考: 解决方案一:读请求和写请求串行化,串到一个内存队列里去。 这种方式可以保证一定不会出现不一致的情况。 串行化之后,会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。 一般来说,如果系统不是严格要求缓存+数据库必须一致性…...- 61