每天50个JAVA八股~(十六)

1、你还了解别的分布式框架吗?

别的还有 spring 的 spring cloud,facebook 的 thrift,twitter 的 finagle 等

2、Dubbo是什么?

Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目。

3、Dubbo默认使用什么注册中心,还有别的选择吗?

推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。

4、Dubbo有哪几种配置方式?

Spring 配置方式

Java API 配置方式

5、在 Provider 上可以配置的 Consumer 端的属性有哪些?

1)timeout:方法调用超时

2)retries:失败重试次数,默认重试 2 次

3)loadbalance:负载均衡算法,默认随机

4)actives 消费者端,最大并发调用限制

6、Dubbo启动时如果依赖的服务不可用会怎样?

Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,默认 check="true",可以通过 check="false" 关闭检查。

7、Dubbo推荐使用什么序列化框架,你知道的还有哪些?

推荐使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。

8、注册了多个同一样的服务,如果测试指定的某一个服务呢?

可以配置环境点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表。

9、Dubbo支持服务多协议吗?

Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。

10、当一个服务接口有多种实现时怎么做?

当一个接口有多种实现时,可以用 group 属性来分组,服务提供方和消费方都指定同一个 group 即可。

11、注册了多个同一样的服务,如果测试指定的某一个服务呢?

可以配置环境点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表。

12、Dubbo支持服务多协议吗?

Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。

13、当一个服务接口有多种实现时怎么做?

当一个接口有多种实现时,可以用 group 属性来分组,服务提供方和消费方都指定同一个 group 即可。

14、服务上线怎么兼容旧版本?

可以用版本号(version)过渡,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。这个和服务分组的概念有一点类似。

15、Dubbo可以对结果进行缓存吗?

可以,Dubbo 提供了声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量。

16、Dubbo服务之间的调用是阻塞的吗?

默认是同步等待结果阻塞的,支持异步调用。

17、Dubbo支持分布式事务吗?

目前暂时不支持

18、Dubbo支持服务降级吗?

Dubbo 2.2.0 以上版本支持

19、服务提供者能实现失效踢出是什么原理?

服务失效踢出基于 Zookeeper 的临时节点原理。

20、服务读写推荐的容错策略是怎样的?

读操作建议使用 Failover 失败自动切换,默认重试两次其他服务器。

写操作建议使用 Failfast 快速失败,发一次调用失败就立即报错。

21、Dubbo必须依赖的包有哪些?

Dubbo 必须依赖 JDK,其他为可选。

22、Dubbo的管理控制台能做什么?

管理控制台主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能

23、Dubbo 和 Dubbox 有什么区别?

Dubbox 是继 Dubbo 停止维护后,当当网基于 Dubbo 做的一个扩展项目,如加了服务可 Restful 调用,更新了开源组件等

24、Dubbo 能集成 Spring Boot 吗?

可以的

25、在使用过程中都遇到了些什么问题?

Dubbo 的设计目的是为了满足高并发小数据量的 rpc 调用,在大数据量下的性能表现并不好,建议使用 rmi 或 http 协议。

26、你读过 Dubbo 的源码吗?

要了解 Dubbo 就必须看其源码,了解其原理,花点时间看下吧,网上也有很多教程,后续有时间我也会在公众号上分享 Dubbo 的源码。

27、你觉得用 Dubbo 好还是 Spring Cloud 好?

扩展性的问题,没有好坏,只有适合不适合,

更倾向于使用 Dubbo, Spring Cloud 版本升级太快,组件更新替换太频繁,配置太繁琐

28、什么是 Mybatis?

1)、Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。

程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。

2)、MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

3)、通过 xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。(从执行 sql 到返回 result 的过程)。

29、Mybaits 的优点

1)、基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,

SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;

提供 XML标签,支持编写动态 SQL 语句,并可重用。

2)、与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;

3)、很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要JDBC 支持的数据库 MyBatis 都支持)。

4)、能够与 Spring 很好的集成;

5)、提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

30、MyBatis 框架的缺点

1)、SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL 语句的功底有一定要求。

2)、SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

31、MyBatis 框架适用场合

1)、MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。

2)、对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是不错的选择。

32、MyBatis 与 Hibernate 有哪些不同?

1)、Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句。

2)、Mybatis 直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套 sql 映射文件,工作量大。

3)、Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用 hibernate 开发可以节省很多代码,提高效率。

33、#{}和${}的区别是什么?

#{}是预编译处理,${}是字符串替换。

Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set 方法来赋值;

Mybatis 在处理{}时,就是把{}替换成变量的值。使用#{}可以有效的防止 SQL 注入,提高系统安全性

34、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第 1 种: 通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

第 2 种: 通过来映射字段名和实体类属性名的一一对应的关系。

35、 模糊查询 like 语句该怎么写?

第 1 种:在 Java 代码中添加 sql 通配符。

第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入

35、如何获取自动生成的(主)键值?

insert 方法总是返回一个 int 值 ,这个值代表的是插入的行数。

如果 采用自增长策略,自动生成的键值在insert 方法 执行完后可以被设置到传入的参数对象中 。

36、在 mapper 中如何传递多个参数?

第一种: DAO 层的函数

第二种: 使用 @param 注解

第三种:多个参数封装成 map

37、Mybatis 动态 sql 有什么用?执行原理?有哪些动态 sql?

Mybatis 动态 sql 可以在Xml映射文件内,以标签的形式编写动态 sql,执行原理是根据表达式 的值完成逻辑判断并动态拼接sql的功能。

Mybatis 提供 了 9 种动 态 sql 标签 :trim | where | set | foreach | if | choose| when | otherwise | bind。

38、Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复;如果没有配置 namespace,那么 id 不能重复

39、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 Mybatis在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动 ORM 映射工具。

40、MyBatis 实现一对一有几种方式?具体怎么操作的?

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap 里面配置 association 节点配置一对一的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的结果的 外键 id,去再另外一个表里面查询数据,也是通过 association 配置,但另外一个表的查询通过 select 属性配置

41、Mybatis 的一级、二级缓存

一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;

对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

42、什么是 MyBatis 的接口绑定?有哪些实现方式

接口绑定,就是在 MyBatis 中任意定义接口,然后把接口里面的方法和 SQL 语句绑定, 我们直接调用接口方法就可以,这样比起原来了 SqlSession 提供的方法我们可以有更加灵活的选择和设置。

接口绑定有两种实现方式,

一种是通过注解绑定

另外一种就是通过 xml里面写 SQL 来绑定

43、使用 MyBatis 的 mapper 接口调用时有哪些要求?

1)、Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同;

2)、Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的parameterType 的类型相同;

3)、Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的resultType 的类型相同;

4)、Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径。

44、Mapper 编写有哪几种方式?

第一种:接口实现类继承 SqlSessionDaoSupport:使用此种方法需要编写mapper 接口,mapper 接口实现类、mapper.xml 文件。

第二种:使用 org.mybatis.spring.mapper.MapperFactoryBean

第三种:使用 mapper 扫描器:

45、简述 Mybatis 的插件运行原理,以及如何编写一个插件。

Mybatis 仅可以编写针对 ParameterHandler、ResultSetHandler、StatementHandler、Executor 这 4 种接口的插件,Mybatis 使用 JDK 的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是 InvocationHandler 的 invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

46、MyBatis实现一对一有几种方式?具体怎么操作的 ?

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的结果的 外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置

47、什么是Zookeeper?

ZooKeeper 是一个开放源码的分布式协调服务,是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。

最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

分布式应用程序可以基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

48、Zookeeper 如何保证了分布式一致性特性?

顺序一致性、原子性、单一视图、可靠性、实时性(最终一致性)

49、ZooKeeper 提供了什么?

文件系统、通知机制

50、Zookeeper 文件系统

Zookeeper 提供一个多层级的节点命名空间(节点称为 znode)。

与文件系统不同的是,这些节点都可以设置关联的数据,而文件系统中只有文件节点可以存放数据而目录节点不行。

Zookeeper 为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得 Zookeeper 不能用于存放大量的数据,每个节点的存放数据上限为1M。

相关推荐
fensioakq—qqq4 分钟前
Spring框架的学习SpringMVC(1)
java·开发语言·后端·学习·spring
yava_free10 分钟前
通过IoT边缘ModuleSDK进行进程应用的开发介绍?
java·ide·pycharm
小郑[努力版]11 分钟前
Nginx常用操作
java·python·中间件
倾听一世,繁花盛开14 分钟前
Java语言程序设计——篇二(1)
java·开发语言·eclipse
华子w90892585921 分钟前
60页论文参考:基于Java+SpringMvc+Vue技术的智慧校园系统设计与实现
java·开发语言·vue.js·论文阅读
engchina23 分钟前
解析 pdfminer layout.py LAParams类及其应用实例
开发语言·python·pdfminer
不死鸟.亚历山大.狼崽子26 分钟前
python库(6):Pygments库
linux·开发语言·python
Thunter_26 分钟前
QT中常用英语单词
开发语言·qt
2301_7818335227 分钟前
深入探索Python库的奇妙世界:赋能编程的无限可能
开发语言·python
java66666888832 分钟前
使用Java构建一个高性能的消息队列系统
java·开发语言·linq