前言

《Java程序员日常积累-向大神学习》系列是本人根据日常工作中碰到的问题写的一个问题记录,比较琐碎零散。
主要用于记录和忘记时可以有个地方查询。现分享给大家,这是这个系列的第三篇。
另外两篇请查阅《[Java程序员日常积累-向大神学习(一)]()》和《[Java程序员日常积累-向大神学习(二)]()》

Vue和LayUI的区别:

我们都知道前端框架都是基于DOM对元素进行操作的。
Vue和LayUI最大的区别就是Vue操作的是虚拟DOM,而layUI操作的是真实的DOM。
也就是说,Vue和LayUI天生就不合。
1、Vue是MVVM工作模式,负责数据和视图的绑定,数据变了,视图自动更新,视图发生事件也会更新数据。
  目前和Vue吻合的UI框架比较知名的是element-ui和i-view。
2、LayUI只负责提供外观和行为,不提供和数据的绑定,数据变了,自己负责刷新;视图变了,自己获取数据。
  与LayUI相似的产品有:Bootstrap4、EasyUI,ZUI等。

各种文件形式的上传和预览

Vert.x是啥?

Vert.x是一个多语言Web框架,它支持Java,Kotlin,Scala,Ruby和Javascript支持的语言之间的共同功能。无论语言如何,Vert.x都在Java虚拟机(JVM)上运行。模块化和轻量级,它面向微服务开发。
简单说,Vert.x就是一堆的jar包,提供了一系列的编程API接口。通过这些API,可以实现异步编程。
Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模型中线程对于操作系统的开销。因此相比较传统的阻塞模型,异步模型能够很大层度的提高系统的并发量。
Vert.x(vertx) 简明介绍:

同源策略

浏览器自带的一种安全策略,他是指协议、域名、 端口 三个都相同的才能互相访问,即若协议、域名、端口有一个不相同时,浏览器禁止页面加载或执行与自身不同域的脚本。

实现不同域的脚本文件访问
	通过html几个特殊的标签进行访问
	通过jsonp来实现跨域请求
	通过CORS(跨域资源共享)实现跨域请求
	通过代理实现跨域请求(例如nginx 、node中间件)

MySQL底层MVCC原理:

当执行查询SQL时会生成一致性视图read-view,它由执行查询时所有未提交事务ID数据(数组里最小的ID为min_id)和已创建的最大事务ID(max_id)组成,查询的数据结果需要跟read-view做比对从而得到快照结果。
版本链比对规则:
1、如果落在绿色部分(trx_id<min_id),表示这个版本是已提交的事务生成的,这个数据可见的。
2、如果落在红色部分(trx_id>max_id),表示这个版本是由将来启动的事务生成的,是肯定不可见的。
3、如果落在黄色部分(min_id<=trx_id<=max_id),那就包括两种情况:
	a、若row的trx_id在数组中,表示这个版本是由还没提交的事务生成的,不可见,当前自己的事务是可见的。
	b、若row的trx_id不在数组中,表示这个版本是已经提交了的事务生成的,可见。
对于删除的情况可以认为是update的特殊情况,会将版本链上最新的数据复制一份,然后将trx_id修改成删除操作的trx_id,同时在该条记录的头信息(record lieader)里的(deteled_flag)标deteled_flag标记位为true,意味着记录已被删除,则不返回数据。

索引:是帮助MySQL高效的获取数据的排好序的数据结构

联合索引:按照联合索引的顺序排序

面向对象和面向过程思想的总结

都是解决问题的思维方式,都是代码组织的方式
面向过程是一种“执行者思维“,解决简单问题可以使用面向过程
面向对象是一种“设计者思维”,解决复杂、需要协作的问题可以使用面向对象
面向对象离不开面向过程
	宏观上:通过面向对象进行整体设计
	微观上:执行和处理数据,仍然是面向过程。

什么是JWT

用户发送按照约定,向服务端发送 Header、Payload 和 Signature,并包含认证信息(密码),验证通过后服务端返回一个token,之后用户使用该token作为登录凭证,适合于移动端和api
JWT 的三个部分,Header(头部), Payload(负载),Signature(签名)。

你如何理解 Spring Boot 中的 Starters?

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。

MySQL的事务的ACID

原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
一致性(Consistency): 数据库总是从一个一致性的状态转换到另一个一致性的状态。
隔离性(Isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。
持久性(Durability):一旦事务提交,则其所做的修改不会永久保存到数据库。

MySQL中隔离性有4种级别

isolation-default:默认值,使用数据库的设置隔离级别,数据库设置什么就用什么
read-uncommitted 读未提交
read-committed 读提交
repeatable-read 可重读
serializable 可串行化

脏读:表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事物尝试插入记录A,此时该事物还未提交,然后另一个事物尝试读取到了记录A.
不可重复读:是指在一个事务内,多次读同一数据。

幻读:指同一个事务内多次查询返回的结果集不一样。比如同一个事物第一次查询时候有n条数据,但第二次同等条件下查询却是n+1条数据记录。这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

nacos做配置中心:内部是客户端使用长轮询的方法拉去配置数据的。

  1. 原因在于如果用推的方式,服务端需要维持与客户端的长连接,这样的话需要耗费大量的资源,并且还需要考虑连接的有效性,例如需要通过心跳来维持两者之间的连接。而用拉的方式,客户端只需要通过一个无状态的 http 请求即可获取到服务端的数据。
  2. 总结实现原理:客户端是通过一个定时任务来检查自己监听的配置项的数据的,一旦服务端的数据发生变化时,客户端将会获取到最新的数据,并将最新的数据保存在一个 CacheData 对象中,然后会重新计算 CacheData 的 md5 属性的值,此时就会对该 CacheData 所绑定的 Listener 触发 receiveConfigInfo 回调。

Navicat for MySQL破解,以及连接数据库出现错误:1045-Access denied for user ‘root’@'localhost’或者@“ip”解决方法

步骤:
1、登录mysql数据库:mysql -uroot -p 登录mysql数据库
2、给登录数据的IP设置权限(以下两个语句设置一个就行):
	①、grant all privileges on *.* to 'root'@'IP' identified by '123456'; 允许在IP下使用root用户名登录
	②、grant all privileges on *.* to 'root'@'%' identified by '123456'; 允许所有IP下使用root用户名登录
3、刷新授权:flush privileges;

将自己的jar包安装到maven本地仓库

mvn install:install-file -DgroupId=my -DartifactId=my-ssh2 -Dversion=1.0.0 -Dpackaging=jar -Dfile=my-ssh2.jar
<dependency>
   <groupId>com.szkingdom.frame</groupId>
   <artifactId>kjdp-core</artifactId>
   <version>1.0.0</version>
</dependency>

GateWay组件:

三大概念:
	Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由。
	Predicate(断言):参考的是Java8的java.util.function.Predicate开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
	Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
核心逻辑:路由转发和执行过滤链

Hystrix组件:

服务降级:程序运行异常、超时、服务熔断触发服务降级、线程池/信号量打满也会导致服务降级
服务熔断(保险丝):请求达到最大访问量(应对雪崩效应)以后,为了防止系统瘫痪。
服务限流:秒杀高并发等操作,有序进行

在选择缓存时,什么时候选择 redis,什么时候选择 memcached?

选择 redis 的情况:复杂数据结构/需要进行数据的持久化功能/高可用/存储的内容比较大
选择 memcache 的场景:纯 KV,数据量非常大的业务

微服务模块

建module
改POM
写YML
主启动
业务类

轮询算法:取余

CAP定律:一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。