Java
2020-07-11 10:40:56 1 举报
AI智能生成
个人
作者其他创作
大纲/内容
Spring
SpringIOC
SpringAOP
<b style=""><font color="#9999ff">什么是AOP:</font></b>AOP(Aspect-OrientedProgramming,面向切面编程),是对OOP(Object-Oriented Programing,面向对象编程)的补充和完善。<br>它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。<br>
<b><font color="#9999ff">AOP的基本概念:</font></b><br>1》Aspect(切面):通常是一个类,里面可以定义切入点和通知<br>2》JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用<br>3》Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around<br>4》Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式<br>5》AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类<br>
<b><font color="#9999ff">通知方法:</font></b><br>1》前置通知:在我们执行目标方法之前运行(@Before)<br>2》后置通知:在我们目标方法运行结束之后 ,不管有没有异常(@After)<br>3》返回通知:在我们的目标方法正常返回值后运行(@AfterReturning)<br>4》异常通知:在我们的目标方法出现异常后运行(@AfterThrowing)<br>5》环绕通知:动态代理, 需要手动执行joinPoint.procced()(其实就是执行我们的目标方法执行之前相当于前置通知, 执行之后就相当于我们后置通知(@Around)
Struts2
SpringMVC
SpringBoot
Shiro
SpringSecurity
Hibernate
MyBatis
MyBatisPlus
微服务
Spring Cloud
为什么使用SpringCloud?
不论是商业应用还是用户应用,在<font color="#f15a23">业务初期都很简单,我们通常会把它实现为单体结构的应用。</font>但是,<font color="#f15a23">随着业务逐渐发展,产品思想会变得越来越复杂,单体结构的应用也会越来越复杂。</font><br>
<b style="font-size: inherit;"><font color="#9999ff">单体应用带来的问题:</font></b><br>代码结构混乱:业务复杂,导致代码量很大,管理会越来越困难。同时,这也会给业务的快速迭代带来巨大挑战<br>开发效率变低:开发人员同时开发一套代码,很难避免代码冲突。开发过程会伴随着不断解决冲突的过程,这会严重的影响开发效率<br>排查解决问题成本高:线上业务发现 bug,修复 bug 的过程可能很简单。但是,由于只有一套代码,需要重新编译、打包、上线,成本很高<br>
什么是SpringCloud?<br>
Spring Cloud是一系列框架的有序集合。<font color="#f15a23">它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发</font>,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。通俗的讲,<font color="#f15a23">Spring cloud就是用于构建微服务开发和治理的框架集合,并不是具体的一个框架</font>,主要贡献来自Netflix OSS。
由于单体结构的应用随着系统复杂度的增高,会暴露出各种各样的问题。近些年来,微服务架构逐渐取代了单体架构,且这种趋势将会越来越流行。Spring Cloud是目前最常用的微服务开发框架,已经在企业级开发中大量的应用。
使用微服务架构的好处<br>
<font color="#f15a23">服务的独立部署</font>:每个服务都是一个独立的项目,可以独立部署,不依赖于其他服务,耦合性低。<br>
<font color="#f15a23">服务的快速启动</font>:拆分之后服务启动的速度必然要比拆分之前快很多,因为依赖的库少了,代码量也少了。
<font color="#f15a23">更加适合敏捷开发</font>:敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行。服务拆分可以快速发布新版本,修改哪个服务只需要发布对应的服务即可,不用整体重新发布。
<font color="#f15a23">职责专一</font>,由专门的团队负责专门的服务:业务发展迅速时,研发人员也会越来越多,每个团队可以负责对应的业务线,服务的拆分有利于团队之间的分工。
服务可以动态<font color="#f15a23">按需扩容</font>:当某个服务的访问量较大时,我们只需要将这个服务扩容即可。
<font color="#f15a23">代码的复用</font>:每个服务都提供RESTAPl,所有的基础服务都必须抽出来,很多的底层实现都可以以接口方式提供。
使用微服务架构的劣势
<font color="#f15a23">分布式部署,调用的复杂性高</font>:单体应用的时候,所有模块之前的调用都是在本地进行的,在微服务中,每个模块都是独立部署的,<font color="#f15a23">通过HTTP来进行通信</font>,这当中会产生很多问题,比如<font color="#f15a23">网络问题</font>、<font color="#f15a23">容错问题</font>、调用关系等。<br>
独立的数据库,分布式事务的挑战:<font color="#f15a23">每个微服务都有自己的数据库,这就是所谓的去中心化的数据管理。</font>这种模式的优点在于不同的服务,可以<font color="#f15a23">选择适合自身业务的数据</font>,比如订单服务可以用MySQL、评论服务可以用Mongodb、商品搜索服务可以用ElasticSearch。<font color="#f15a23">缺点就是事务的问题了</font>,目前最理想的解决方案就是<font color="#f15a23">柔性事务中的最终一致性</font>。<br>
<font color="#f15a23">测试的难度提升</font>:服务和服务之间通过接口来交互,当接口有改变的时候,对所有的调用方都是有影响的,这时自动化测试就显得非常重要了,如果要靠人工一个个接口去测试,那工作量就太大了。这里要强调一点,就是APl文档的管理尤为重要。<br>
<font color="#f15a23">运维难度的提升</font>:在采用传统的单体应用时,我们可能只需要关注一个Tomcat的集群、一个MySQL的集群就可以了,但这在微服务架构下是行不通的。当业务增加时,服务也将越来越多,服务的部署、监控将变得非常复杂,这个时候对于运维的要求就高了。
Spring Cloud和Dubbo区别
<b><font color="#9999ff">社区的支持:</font></b><br>首先Spring Cloud有强大的社区支持,在Java生态圈必定离不开Spring.且Spring Cloud的更新频率也越来越高。<br><br>Dubbo虽然出自阿里巴巴,但是有很长一段时间没维护了,原因是内部有另一个RPC的框架HSF,所以Dubbo被抛弃了,不过去年Dubbo又重回大众视野,对使用开源框架的用户来说,社区对框架的持续维护非常重要,所以Spring家族的产品更适合中小型公司。 <br>
<b><font color="#9999ff">关注内容:</font></b><br>Spring Cloud关注的是整个服务架构会涉及的方方面面,在Spring Cloud中各种组件应有尽有,从而使其具有可快速集成、方便、成本低等优势。<br><br>Dubbo关注的更细一些,只针对服务治理,相当于SpringCloud中的一个子集。能和Dubbo相互比较的应该是gRPC,Thrift之类的框架。 <br>
<b><font color="#9999ff">性能问题:</font></b><br>对于性能这块,Dubbo确实要比Spring Cloud好,原因大家也都清楚.Dubbo基于Netty的TCP及二进制的数据传输,Spring Cloud基于HTTP.HTTP每次都要创建连接,传输的也是文本内容,自然在性能上有些损耗。<br><br>Spring Cloud带来的性能损耗对于大部分应用来说是可以接受的,而它具有的HTTP风格的API交互,在不同的语言中是通用的,且对每个微服务的测试来说是非常方便的,也就是说Spring Cloud用小的性能损耗换来了更多好处。<br>
<b><font color="#9999ff">具体技术不同点:</font></b><br><font color="#99ccff">1》</font>服务调用方式: dubbo是RPC ,springcloud是Rest API<br><font color="#99ccff">2》</font>注册中心:Dubbo 是zookeeper,springcloud是eureka,也可以是zookeeper<br><font color="#99ccff">3》</font>服务网关:Dubbo本身没有实现,只能通过其他第三方技术整合。springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,Spring cloud支持断路器,与Git完美集成配置文件支持版本控制,事物总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素
Spring Boot和Spring Cloud的区别
SpringBoot专注于快速方便的开发单个个体微服务。<br>
SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务。<br>
SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关系。SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。
Dubbo
Java基础
基本数据类型
byte:Java中最小的数据类型,在内存中占位8位(bit),即1个字节,取值范围-128~127,默认值0
short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0
int:整型,用于存储整数,在内存中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0
long:长整型,在内存中占64位,即8个字节,取值范围-2^63~2^63-1,默认值0L
float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0
double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0
char:字符型,用于存储单个字符,在内存中占16位,即2个字节,取值范围0~65535,默认值为空
boolean:布尔类型,理论是占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false
常用工具类
Short
Integer
Long
Float
Double
Boolean
Character
String
StringBuffer
StringBuilder
BigDecimal
Date
LocalDate(jdk1.8):不可变、线程安全的日期对象
LocalTime(jdk1.8):不可变、线程安全的时间对象
LocalDateTime(jdk1.8):不可变、线程安全的日期时间对象
System
Random
Math
UUID
Runtime
SimpleDateFormat
Calandar
Duration(jdk1.8):Duration是Java8新增的一个时间工具类,是final且线程安全的。<br>
Period(jdk1.8):是
运算符
算术运算符
赋值运算符
关系运算符
逻辑运算符
位运算符
三元运算符
运算符优先级
Java变量命名规范
必须以字母、下划线"_"、美元符"$"开头
可以包括数字、区分大小写
不能使用Java语言的关键字
Java高级
集合
集合接口
集合实现类
Map
HashTable
HashMap
ConcurrentHashMap
TreeMap
Collection
ArrayList
Vector
LinkedList
Set
HashSet
TreeSet
<b><font color="#9999ff">Set和List的区别</font></b><br>1》Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。<br>2》Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。<br>3》List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。
多线程
创建方式
通过继承 Thread 类本身
通过实现 Runnable 接口
通过 Callable 和 Future 创建线程
一个线程的生命周期
<b><font color="#9999ff">新建状态:</font></b>使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。<br>
<b><font color="#9999ff">就绪状态:</font></b>当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。<br>
<b><font color="#9999ff">运行状态:</font></b>如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
<font color="#9999ff"><b>阻塞状态:</b></font>如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。<br><font color="#99ccff">1》</font>等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。<br><font color="#99ccff">2》</font>同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用。<br><font color="#99ccff">3》</font>其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。<br>
<b><font color="#9999ff">死亡状态:</font></b>一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。
线程的优先级
每一个 Java 线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。
Java 线程的优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) ~ 10 (Thread.MAX_PRIORITY )。<br>默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。
具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。<font color="#f15a23">但是,线程优先级不能保证线程执行的顺序,而且非常依赖于平台。</font>
常用设计模式
单例设计模式
工厂设计模式
代理设计模式
观察者模式
装饰设计模式
IDE
IntelliJ IDEA
快捷键
Eclipse
面试题
<b><font color="#9999ff">String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?</font></b><br>String底层是一个final char[], <br>JDK1.9以后为一个final byte[], <br>所以String是不可改变的, 对它进行修改会产生新的对象, <br>不适合大量的字符串拼接. <br>StringBuffer是可变对象, 是线程安全的, 所以效率有所下降. <br>StringBuilder是可变对象, 是非线程安全的, 他相比与StringBuffer速度快10%~15%.<br>
<b><font color="#9999ff">关于 JVM JDK 和 JRE 最详细通俗的解答</font></b><br>JDK是Java开发环境(Java Development Kit), 它是功能齐全的Java SDK. 它拥有JRE所拥有的一切, 还有编译器(javac) 和 工具(如javadoc 和jdb). 它能够创建和编译程序.<br>JRE是Java运行时环境. 它是运行已编译Java程序所需的所有内容的集合, 包括Java虚拟机(JVM), Java类库, java命令和其他的一些基础构建. 但是, 它不能用于创建新程序.<br>
<b><font color="#9999ff">==和equals()的区别</font></b><br>== : 它的作用是判断两个对象的地址是不是相等. 即判断两个对象是不是同一个对象. (基本数据类型==比较的是值, 引用数据类型==比较的是内存地址)<br>equals()有两种情况:<br>类没有重写equals()方法. 则使用的Object类equals()方法. 等价于==<br>类覆盖了equals()方法. 一般, 我们都会重写equals()方法实现两个对象的相等判断.<br>
<b><font color="#9999ff">为什么重写equals()就要重写hashCode()</font></b><br>如果两个对象相等,则 hashcode 一定也是相同的。两个对象相等,对两个对象分别调用 equals 方法都返回 true。但是,两个对象有相同的 hashcode 值,它们也不一定是相等的 。因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖。<br>
Redis<br>
数据类型
字符串(String)
哈希表(Hash)
列表(List)
集合(Set)
有序集合(ZSet)
常用命令
持久化
RDB
AOF
高可用
主从复制
Sentinel
Redis Cluster
发布/订阅模式
<b><font color="#9999ff">使用场景:</font></b><br>如新增订单后,30分钟未支付则取消订单。<br>常见方式:<br>1》使用定时器进行定时查询未支付订单进行取消。<br>2》使用发布/订阅模式,缓存订单key30分钟,订单key失效时触发钩子
<font color="#9999ff"><b>步骤:</b></font><br>1》修改redis.config>notify-keyspace-events Ex<br>2》<br>3》<br>4》
Solr
Solr是一个高性能,采用Java开发,Solr基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
RabbitMQ
交换机
<b><font color="#9999ff">1》Direct Exchange</font></b><br>处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “abc”,则只有被标记为“abc”的消息才被转发,不会转发abc.def,也不会转发dog.ghi,只会转发abc。<br>
<b><font color="#9999ff">2》Fanout Exchange</font></b><br>不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。<br>
<b><font color="#9999ff">3》Topic Exchange </font></b><br>将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“abc.#”能够匹配到“abc.def.ghi”,但是“abc.” 只会匹配到“abc.def”。<br>
<b><font color="#9999ff">4》Headers Exchanges </font></b><br>不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。<br><br>匹配规则x-match有下列两种类型:<br><br>x-match = all :表示所有的键值对都匹配才能接受到消息<br>x-match = any :表示只要有键值对匹配就能接受到消息<br>
六大模式
ActiveMQ
MySQL
常用函数
字符串函数
常用SQL语法
存储引擎
索引
索引失效的原因
全值匹配
<span style="font-size: inherit;">最左匹配原则</span><br>
explain用法
日志跟踪<br>
开启日志跟踪:SET GLOBAL general_log = ON;<br>查看系统参数是否修改成功:SHOW VARIABLES LIKE 'general_log';<br>
SQL保存方式
保存到文件:SET GLOBAL log_output = 'file';
保存到表:SET GLOBAL log_output = 'table';<br>sql的执行情况会记录在表mysql.general_log<br>SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 100;<br>
查看修改结果:SHOW VARIABLES LIKE 'log_output';<br>
跟踪会消耗资源,问题定位完之后一定要关闭跟踪,执行以下sql关闭跟踪:<br>SET GLOBAL general_log = OFF;<br>
分库分表
面试常见问题
Oracle
0 条评论
下一页