1、说一说三大范式
- 「第一范式」:数据库中的字段具有原子性,不可再分,并且是单一职责
- 「第二范式」:「建立在第一范式的基础上」,第二范式要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键
- 「第三范式」:「建立在第一,第二范式的基础上」,确保每列都和主键列直接相关,而不是间接相关不存在其他表的非主键信息
Zookeeper是个数据库,文件存储系统,并且有监听通知机制(观察者模式)。
ZooKeeper主要服务于分布式系统,可以用ZooKeeper来做:统一配置管理、统一命名服务、分布式锁、集群管理。
使用分布式系统就无法避免对节点管理的问题(需要实时感知节点的状态、对节点进行统一管理等等),ZooKeeper能够通用解决这些问题的中间件。
zk的节点类型有4大类
RPC是Remote Procedure Call 远程过程调用的缩写,要想实现RPC通常需要包含传输协议和序列化协议。
而我们熟悉的HTTP,其实是一种超文本传输协议,RPC和HTTP不是同一个维度上的概念,只不过他们都是用来实现远程调用的,所以经常被拿来对比。
RPC适用于内部服务之间的相互调用,性能好,传输效率高,服务治理效果好。
而HTTP适合外部系统对接,比如浏览器访问、APP后端接口调用、三方接口对接等。
Dubbo是通过jdk的shutdownhook来实现优雅停机的。
服务提供者,先将应用下线,标记为不接受请求,然后检查线程池中是否有正在运行的线程,若有,等待执行完成。
服务消费者,不再发起新的调用请求,若有新发起,直接在客户端侧报错,检查是否有正在远程调用的请求,若有已经发起且正在等待响应的,则等待响应完成。
目前在市面上比较主流的消息中间件主要有,Kafka、ActiveMQ、RabbitMQ、RocketMQ 等这几种。
消息中间件一般用来在分布式系统中实现异步、削峰、解耦
消息模型有队列模型和发布订阅模型。
队列模型每条消息只能被一个消费者消费,而发布/订阅模型就是为让一条消息可以被多个消费者消费而生的,当然队列模型也可以通过消息全量存储至多个队列来解决一条消息被多个消费者消费问题,但是会有数据的冗余。
👨💻面试官 :介绍一下自己对 Netty 的认识吧!小伙子。
🙋 我 :好的!那我就简单用 3 点来概括一下 Netty 吧!
Spring Cloud
就是微服务系统架构的一站式解决方案,在平时我们构建微服务的过程中需要做如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等操作,而 Spring Cloud 为我们提供了一套简易的编程模型,使我们能在 Spring Boot 的基础上轻松地实现微服务项目的构建。
基本结构:jdk1.8前数据结构是:链表 + 数组 , jdk1.8之后是 :链表 + 数组 + 红黑树
何时转换:链表长度阈值(边界值) > 8 并且数组长度大于64,才将链表转换为红黑树,变为红黑树的目的是为了高效的查询。
何时扩容:当数组元素大于数组长度*负载因子的值时会扩容。例如默认情况下负载因子是0.75,数组长度是16,当数组中的元素超过0.75**16=12个时,会触发扩容机制。
如何扩容:在进行扩容时使用 resize() 方法申请一个容量是原先数组2倍的新数组,计算 table 数组的新容量和 Node 在新数组中的新位置,将旧数组中的值复制到新数组中,从而实现自动扩容,而这是一个非常耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么初始化时指定数组大小而不是使用默认值16,这能够有效的提高HashMap的性能。
据说有一名意大利程序员,在 2004 年到 2006 年间主要做嵌入式工作,之后接触了 Web,2007 年和朋友共同创建了一个网站,并为了解决这个网站的负载问题(为了避免 MySQL 的低性能),于是亲自定做一个数据库,并于 2009 年开发完成,这个就是 Redis。这个意大利程序员就是 Salvatore Sanfilippo 江湖人称 Redis 之父,大家更习惯称呼他 Antirez。
Redis(Remote Dictionary Server ),即远程字典服务,它的主要特点是使用C语言编写、开源、支持网络访问、可基于内存亦可基于磁盘的持久化、Key-Value类型数据库、提供多种语言的API。Redis属于非关系型数据库中的一种解决方案,目前也是业界主流的缓存解决方案组件。
Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。
Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。
用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)
创建独立的spring引用程序 main方法运行
嵌入的Tomcat 无需部署war文件
简化maven配置
答:spring boot来简化spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用
SpringBoot有以下优点:
快速创建独立运行的spring项目与主流框架集成
使用嵌入式的servlet容器,应用无需打包成war包
starters自动依赖与版本控制
大量的自动配置,简化开发,也可修改默认值
准生产环境的运行应用监控
与云计算的天然集成