- JAVA基础
- 反射
什么是反射: 就是正在运行,动态获取这个类的所有信息 (属性,方法,构造方法)
反 射 机 制: 将.class文件编译成.java,
- 设计模式
- 责任链 将多个执行步骤连接起来形成的一条链,这个对象处理完,就会交给下一个对象去处理。网关设置IP白名单。
- 装饰 mybatis使用redis实现二级缓存,先判断二级(redis)是否有数据,在判断一级(jvm)。
- 模板+工厂: 定义抽象模板,在联合登录中设置联合登录请求处理获取openId、通过id获取用户、通过userId更新openId。
- 策略模式: 主要解决多重if判断问题,前端获取登录方式,通过登录获取从数据库获取对应的处理类class, 如果为空,表示该方式已关闭,否则通过反射的方式获取对应登录渠道的hander进行处理
- 单例模式: 饿汉、懒汉式
- 代理模式:
应用场景: SpringAOP、事物原理、日志打印、权限控制、远程调用、安全代理 可以隐蔽真实角色1. 静态代理
自己写代理类
2. 动态代理
2.1 JDK动态代理
2.2 cblib动态代理
- Spring
- 是一个开源的轻量级的Java开发框架, 就是将我们Bean与bean之间的关系,交给Spring管理。
Spring的核心是IOC(控制反转)、DI(依赖注入)、AOP(面向切面编程)。 - 原理
解析xml, 获取bean的class地址,通过反射机制进行实例化对象。 - Spring的生命周密
Singleton 只会创建一个实例对象,所有请求都会共享这个对象。默认单例。
Prototype 表示每次请求都会实例化一个对象
Request 每次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
Session 每次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效 - Spring注入方式
通过构造函数
通过set方法注入
通过p名称空间注入 原理也是通过set注入 - AOP
通过使用@Aspect实现AOP, 通知方式: 前置通知、后置通知、运行通知、环绕通知
- Spring事务
- 四大特征
原子性 一个事务中包含的所有操作要么全部执行或全部不执行。
隔离性 多个事务他们是互不干扰的
持久性 一个事务一旦提交,那它的数据修改是永久性的
一致性 事务从一个状态变换到另一个状态,数据时一致性的。 如: A和B之间相互多次转账,最终的金额是不会变得。 - 事务的分类
编程式事务 手动开启事务,提交事务
声明式事务 xml事务、 注解事务 - 事务的七大传播特性
1. Propagation.REQUIRED
调用方已经存在事务,则加入到同一个事务中运行,否则,自启一个事务
2. Propagation.REQUIRES_NEW
无论何时自身都会开启新事务
3. Propagation.SUPPORTS
调用方存在事务,则加入到同一个事务中运行,否则以非事务的方式运行
4. Propagation.NOT_SUPPORTED
调用方存在事务,则会被挂起,直到被调用方运行完毕后,事务恢复。
5. Propagation.MANDATORY
调用方存在事务,则加入到同一个事务中运行,若不存在,则抛出异常
6. Propagation.NEVER
调用方存在事务,则抛出异常
7. Propagation.NESTED
调用方存在事务,则运行一个嵌套事务,若不存在,则以Propagation.REQUIRED的方式运行,即开启一个新的事务 - 事务的隔离级别
隔离级别 含义 ISOLATION_DEFAULT 使用后端数据库默认的隔离级别。 ISOLATION_READ_UNCOMMITTED 允许读取尚未提交的更改。可能导致脏读、幻影读或不可重复读。 ISOLATION_READ_COMMITTED 允许从已经提交的并发事务读取。可防止脏读,但幻影读和不可重复读仍可能会发生。 ISOLATION_REPEATABLE_READ 对相同字段的多次读取的结果是一致的,除非数据被当前事务本身改变。可防止脏读和不可重复读,但幻影读仍可能发生。 ISOLATION_SERIALIZABLE 完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻影读。这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。 - 脏读、幻读、不可重复读
脏读 一个事务读取了被另一个事务尚未提交的数据。
幻读 事务A根据条件查询数据时,事务B也根据该条件新增1条数据,此时多出数据事务A就很意外,侧重于新增、删除
不可重复读 事务 A 多次读取同一数据,结果 不一致。侧重于修改。
- mysql的事务隔离级别
- 读未提交
这是最宽松的隔离级别。
在这个级别下,一个事务可以读取到其他事务中未提交的数据(脏读)。
由于存在脏读的风险,这个级别很少被使用。
- 读已提交
这个级别的特点是事务只能读取到已经提交的数据。
每个事务开始时看到的是一个快照,在该事务开始之后其他事务提交的更改不会被当前事务看到。
虽然避免了脏读,但仍然可能出现不可重复读和幻读。 - 可重复读
这是MySQL默认的隔离级别。
在这个级别下,事务会创建一个快照,对于该事务来说,在其执行过程中,这个快照不会改变,因此可以多次读取同一数据并获得相同的结果。
虽然避免了脏读和不可重复读,但仍然可能出现幻读。
- 可串行化
这是最严格的隔离级别。
在这个级别下,所有事务都被串行执行,确保没有并发问题。
虽然保证了数据的一致性和准确性,但是可能会导致性能下降,因为需要锁定更多的资源。
- MyBatis
- MyBatis 是一款优秀的持久层框架,
一级缓存是SqlSession级别的缓存。是存放JVM(HashMap)中,不能共享
二级缓存是mapper级别的缓存,是存放redis等其他数据库中。二级缓存是跨SqlSession的,可以共享
1. Mapper 接口在初始SqlSessionFactory 注册的。
2. Mapper 接口注册在了名为 MapperRegistry 类的 HashMap中, key = Mapper class value = 创建当前Mapper的工厂。
3. Mapper 注册之后,可以从SqlSession中get
4. SqlSession.getMapper 运用了 JDK动态代理,产生了目标Mapper接口的代理对象。
5. 动态代理的 代理类是 MapperProxy ,这里边最终完成了增删改查方法的调用
- SpringBoot
- 介绍
设计目的是用来简化Spring的搭建和配置过程,整合出来的快速开发框架。 - 启动流程
- servlet生命周期
- 加载
当web容器启动时就会加载、创建Servlet实例, - 初始化
在处理客户端请求前完成一些初始化的工作,如建立数据库连接,读取资源文件信息等 - 服务
调用doGet()或者doPost()方法进行业务逻辑处理 - 销毁
当web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,让该实例释放掉所占用的资源。 - 卸载
当一个Servlet调用完destroy()方法后,次实例将等待被垃圾收集器所回收 - tomcat 启动servlet
tomcat服务器启动时,首先加载web.xml中配置的servlet。
- 中间件
- 产生的背景
异步、非组赛 - 什么是JMS
JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输 - JMS支持的2种消息模型
点 对 点: 一个消息只能有一个消费者可以消费,不能重复消费。
发布订阅: 生产者将消息发布到topic中,所有订阅该主题的消费者都可以消费该消息。 - 如何解决消息的顺序问题
采用单消费、单线程处理
发送消息指定key,相同的key发送一个主题(队列)中
- 如何保证消息的幂等性
设置手动签收
通过消息ID判断
通过mq推送的日志记录 - 如何解决消息堆积
a. RabbitMQ可以使用死信队列
b. 设置消息的有效期,mq会将过期未消息的消息删除,客户端通过代码监听删除的消息保存到日志,后期补偿。
c. 提高消费者的能力和服务器数量
- RabbitMQ基础
- RabbitMQ的四个核心概念
virtual hosts(虚拟机)
不同虚拟机可以区分不同的业务,比如订单、用户等,就像mysql有多个数据库的概念一样。每个VirtualHost是独立 的,它们之间的exchange(交换机)、queue(队列)、message(消息)都是隔离的不能互通。
交换机 (exchange)
生产者通常不会直接将消息发送到队列,而是先将消息先发送到交换机,然后交换机根据绑定的策略转发到队列中。
队列 (queue)
接收来自交换机、生产者发送消息的容器,遵循先进先出原则。
路由键(RoutingKey)和绑定键 (BindingKey)
交换机与队列在绑定时,会指定一个binding key,生产者将消息发送给交换机时都会指定一个routing key;交换机 根据binding key与routing key一致、或符合匹配规则来判断,将消息就转发到对应的队列中。 - RabbitMQ的5种队列形式
1. 点对点(简单)的队列
一个生产者对应一个消费者
2. 工作(公平性)队列模式
一个生产者对应多个消费者,但是只能有一个消费者获得消息,当消费者处理完消息后,才会接收下一个消息。可以实现能者多劳,负载均衡。
3. 发布订阅模式
一个消费者将消息首先发送到交换机,交换机(x)绑定到多个队列,然后被监听该队列的消费者所接收并消费
4. 路由模式Routing
在绑定队列和交换器的时候指定路由key,生产者发送的消息会通过路由key,将消息发送到相应key相同的队列,接着 监听该队列的消费者消费消息。
5. 主题模式
路由模式需要key完全相同才可以, 主题模式是在该模式下可以进行模糊匹配规则。
- RabbitMQ支持事务消息
- 如何确保生产者发送消息成功
生产者也可以采用确认机制 - 死信队列产生原因:
设置的消息过期
队列容器满了,生产者拒绝接收消息
消费者多次消费失败,就会转移存放到死信队列中 - 解决分布式事务
采用补偿队列
确保消息一定发送成功,采用确认机制
确保消费者消费消息一定成功, 手动ack应答形式
- kafka
- 介绍
Kafka是apache开源的分布式消息项目,Kafka并没有遵循JMS规范,它只提供了发布和订阅通讯方式。
优点: 高吞吐量、低延迟、可扩展性、高并发
当生产者将消息发送到topic1主题,消息会均摊存放在3台服务器对应topic1主题下的分区上。 - 使用场景
日志收集 - kafka为什么吞吐量高
实现数据的压缩 、分区(操作单元小)、数据的批量发送。
- RocketMQ
- 介绍
RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力
- 事务消息 也称半消息
生产者发送一条事务消息,该消息不可以被消息。
待生产者发送commit或rollback指令后,rocketMQ会将消息删除、或投递消费者
- RocketMQ解决分布式事务思路
1. 发送事务消息,该消息不可消费
2. 返回事务消息是否发送成功
3. 执行本地事务,将订单消息保存到数据库
4. 将本地事务结果返回给Rocket
5. 如果本地事务没有将结果返回给Rocket,则Rocket定时检查
6. 如果本地事务提交commit,则Rocket则将该消息设置为可以消费
思路: 保证订单要先保存到数据库且成功,消费者才可以拿到消
- 源码
- Arraylist、linkedList、 Vector
ArrarList: 底层使用数组动态扩容(移动数组下标)实现,查询效率高,插入和删除效率低,ArrayList不是线程安全的、 ArrayList查询直接通过索引定位,效率高。
是在add()方法时初始化数组长度, 长度为0
每次扩容为原来的1.5倍(0 10 15 22)
Vector是线程安全的集合。
LinkedList采用的是双向链表, 采用折半查找,效率低 - JDK1.7的HashMap是基于数组+单向链表
使用table 数组 来存储对象
使用单向链表解决了Hash冲突问题 - jdk1.8的HashMap是基于数组+链表+红黑树
HashMap线程是否安全
不安全
HashMap默认初始容量
默认初始容量16 ,
HashMap每次扩容的容量为多少
2倍, HashMap每次扩容的数组容量为原来的2倍
HashMap什么时候扩容?阈值多少
HashMap的size>=阈值时,就扩容数组为原来的2倍,重新计算阈值。
阈值=当前数组容量*0.75
HashMap如何存放key为null
如果key==null,存放的对应数组下标为table[0]
HashMap中hash冲突和index冲突的区别
hash冲突:key的hash值相同
index冲突:是在计算数组下标时产生相同问题 index = hash & (length - 1)
HashMap如何解决hash冲突、减少index冲突问题
解决hash、index冲突: 使用单向链表
减少index冲突: 使用 hash & (length - 1) ,(length-1)=15奇数时,在做 '&' 运算时,减少index相同的冲突问题。
HashMap扩容存在哪些问题
多线程情况下可能会存在死循环问题
HashMap的负载因子为什么时0.75
加载因子越大,内存利用率越高,index下标冲突概率也就越大;
加载因子越小,内存利用率越低,index下标冲突概率也就越小;
HashMap如果链表过长
如果hash、index冲突越高,链表就越长,查询效率越低,时间复杂度为On
HashMap的查询效率问题
如果没有发生冲突问题,直接通过数组下标定位,效率高
如果发生了冲突问题,使用链表查询,效率低 - JDK1.8为什么要使用红黑树
Java1.7:当hashCode冲突的时候会使用链表存放,如果链表的长度过长会导致查询效率非常慢,时间复杂度为o(N)
Java1.8: 在链表中长度大于8的时候,将链表中所有的数据以红黑树实现存放,从而加快检索速度;时间复杂度 o(log n)
- HashMap、HashTable、ConcurrentHashMap
HashMap不是线程安全的,但是性能高,但是可以通过
HashMap允许有一个空键和多个空值,HashTable不允许有空值和空键。
ConcurrentHashMap 默认分成16个HashTable,采用的分段锁,保证线程安全
- 树
二叉搜索树: 会将第一次插入的值作为根节点,如果某种情况下第一次插入的值是最小值,后面的都比它大,如上就会形 成 一个链表 ,查询的时间复杂度O(n)
平衡二叉树:就是为了解决二叉搜索树上所产生的问题。 平衡二叉树是在操作中不断的去寻找新的平衡节点,避免形成链 表。查询的时间复杂度为O(logn),
平衡二叉树在每次插入和删除时都要进行平衡操作,插入、删除频繁时,性能就会降低,于是就有了红黑树
红黑树(Red Black Tree) 是一种自平衡二叉查找树,通过指定规则来实现局部平衡,
- 网络安全
- 接口安全策略
防盗链 使用nginx、https实现判断请求来源
DDOS 黑客通过不断访问你的服务器资源,导致正常用户无法、或访问慢,使用nginx限制用户的访问频率
XSS攻击 即跨站脚本攻击。XSS攻击使用Javascript脚本注入进行攻击,如使用过滤器判断提交数据是否有javascript脚 本,并将其转换html源文件
SQL注入攻击
使用token服务间数据的传输
使用MD5实现API接口验证签名,防止抓包篡改数据
使用对称、非对称加密、用户https加密传输
基于网关实现IP黑名单与名单拦截
使用第三方服务的安全加密或基于oauth2.0搭建第三方服务平台。
- 对称加密、非对称加密
对称加密: 在加密、解密过程中使用同一个密钥进行的。如: AES、DES
非对称加密: 使用一对密钥公钥和私钥:(公钥)一个用于加密信息,(私钥)另一个则用于解密信息。如: RSA
- 限流算法
- 令牌桶算法原理
以恒定速率向令牌桶中存入Token,用户须获取到令牌桶的Token才可以处理请求,如果没有获取到令牌则丢失该请求。
- 漏桶实现原理
将请求先流入到漏桶里,漏桶以一定的速度流出请求,当流入的请求大于流出的会直接溢出,漏桶算法能强行限制数据的传输速率。 但不能使网络请求资源实时达到传输效率。对突发性的大量请求来处理效率低。
- 网络模型
- 什么是网络编程
网络编程的本质是两个设备之间的数据交换
使用IP地址,或域名,和端口连接到另一台计算机上对应的程序,按照规定的协议(数据格式)来交换数据。 - Linux五种IO模型
阻塞I/O 如果没有获取到结果,就会一直等待。等待的过程中会导致整个应用程序一直处在阻塞的过程,
非阻塞I/O 不管是否有获取到数据,都会返回,如果没有结果数据,则不断的发起重试请求,直到返回数据。
信号驱动I/O 发出一个请求实现观察监听,当有数据的时候直接走我们异步回调
异步I/O 异步io也就是发出请求数据之后,剩下的事情完全实现异步完成
I/O复用 将客户端所有的socket操作都注册到Selector选择器中,选择器中轮询判断socket是否有数据到达。当数据到达 时,则激活当前的socket,客户端开始读取数据。
客户端可以注册多个socket,然后不断轮询判断是否又数据,即一个线程内同时处理多个IO请求的目的。
nginx、Redis的底层采用Nio中的多路IO复用的机制,能够非常好的支持这样的并发,从而保证线程安全问题; - 七层网络模型介绍 应用层 表示层 会话层 传输层 网络层 链路层 物理层
- BIO 即IO,阻塞式IO ,单纯得输入数据,没有缓冲区。当A没有输入时,B则阻塞等待。
NIO 即NewIO ,非阻塞式IO,是基于通道和缓冲区进行操作,数据是基于缓冲区的读取。 采用IO多路复用机制 - Netty
介绍: 是一个基于NIO的客户端、服务器端的异步通信框架。
特点:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。
解决了NIO代码的复杂问题,容错机制问题 。
应用场景: 分布式开源框架中dubbo、Zookeeper,RocketMQ底层rpc通讯使用就是netty - 粘包与拆包
粘包: 将多个数据包封装成一个数据包。比如客户端发送了2条消息: a、b,服务端直接当成了一条消息读取: ab
拆包: 将一个数据包拆成了多个数据包。比如客户端发送了1条消息: hello,服务端当成了多条消息: h、e、l、l、0。
如何解决: 固定消息长度,使用特殊字符表示每个消息的结束符号 - Socket分为2种协议
TCP 面向连接
通过三次握手、四次挥手完成连接,是可靠协议
在连接中进行大数据量传输,以字节流方式 安全,效率低,对方必须进行3次握手才可以通讯
UDP 面向无连接
不需要建立建立连接 将数据及源的封装成数据包中,
每个数据报的大小在限制64k内 不安全,效率高 - 什么是http
就是客户端和服务端进行的传输格式,简称超文本传输协议。
是基于socket的tcp传输协议 - http与https
http协议传输的数据都是未加密的,也就是明文的, 安全性低,效率高
https则是具有安全性的ssl加密传输协议, 安全性高,效率低 - HTTP1.0与HTTP1.1
http1.0属于短链接
http1.1属于长链接
(本质还是TCP的长连接和短链接)
- ELK
正排索引: 以文档的Id形式保存每个字的位置信息。
倒排索引 : 以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档
logstash支持N种log渠道: kafka、log、reids等中的log数据进行监控读取与输出ELK分布式日志收集原理
1 .使用SpringAop进行日志收集,
2. 通过kafka(发布/订阅)将日志发送给logstash,
3. logstash再将日志写入elasticsearch,
4. 使用kibana将存放在elasticsearch中的日志数据显示出来 - XXL-JOB分布式任务调度
搭建xxl-job管理平台客户端配置管理平台地址,通过@JobHandler("userJobHandler")与管理平台对应,
当任务宕机时,可以手动触发、或重启服务器触发
路由策略:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
采用分片广播实现任务的平均分配 - 微服务
- 服务保护概念
服务学崩效应 服务雪崩效应产生与服务堆积在同一个线程池中,因为所有的请求都是同一个线程池进行处理,这时候如果 在高并发情况下,所有的请求全部访问同一个接口,这时候可能会导致其他服务没有线程进行接受请求,这 就是服务雪崩效应效应。
使用服务隔离机制(线程池方式和信号量),使用线程池方式实現隔离的原理: 相当于每个接口(服务)都有自 己独立的线程池,因为每个线程池互不影响服务降级 在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallBack方法)
服务熔断 熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设 置阈值,让后直接拒绝访问,保护当前服务。使用服务降级方式返回一个友好提示,服务熔断和服务降级一起使用
服务隔离 因为默认情况下,只有一个线程池会维护所有的服务接口,如果大量的请求访问同一个接口,达到tomcat 线程池默认极限,可能会导致其他服务无法访问。
服务限流 服务限流就是对接口访问进行限制,常用服务限流算法令牌桶、漏桶。计数器也可以进行粗暴限流实现。
-
注册中心
eureka:
高可用: 采用eureka集群,相互注册。实现高可用
nacos: -
配置中心
基于mysql实现持久化,和集群 -
swagger
类: 使用@Api(value="aaaa",description="订单相关信息接口") 注解
方法: 使用@ApiOperation(value="获取所有订单",notes="获取所有订单,无需参数") 注解
方法参数: 使用 @ApiParam(value = "订单名称", required = true)注解 -
OpenFeign
是一个Web声明式的Http客户端调用工具,提供接口和注解形式调用,底层采用httpClient技术 。默认集成了 Ribbon 实现负载均衡的效果。 @FeignClient("pitch-member")
SpringCloud第一代采用feign 第二代采用openFeign -
Ribbon
是一个客户端的负载均衡器,提供客户端对服务端的访问控制。轮询策略: 随机、 轮询、哈希、权重
是将从注册中心获取到的服务缓存到本地,然后在本地实现负载均衡策略。属于本地负载均衡 -
sentinel
启动sentinel的jar包,客户端配置sentinel地址,在相应的方法上加入: @SentinelResource(value="mySentinelName", blockHandler = "mySentinelException" )注解 且定义回调方法,
可配置接口每秒访问次数
可配置接口最多同事只能有5个线程处理请求
可配置响应时间超过阈值 响应异常数、异常比例超过阈值
支持nacos持久化 -
网关
Zuul: 属于netfix公司开源的第一代微服务网关,是基于Servlet实现的,阻塞式的Api, 不支持长连接。
Gateway: 属于SpringCloud研发的第二代微服务网关,基于Spring5构建,响应式非阻塞式的Api,支持长连接。
网关应用场景: 黑明白、日志(分析、性能指标)、身份认证
网关与过滤器
网关是拦截所有服务器请求进行控制
过滤器拦截某单个服务器请求进行控制 -
zipkin
作用: 在多个服务之间调用,显示服务的调用关系,处理时间项目整合: 下载zipkind的jar包, 客户端集成的zipkin配置地址,登录zipkin通过图形化界面显示服务的调用
- Redis
- 基本数据类型
字符串类型(String)
列表类型(List)
无序集合(Set)
有序集合(sorted set)
哈希(Hash) - 主从复制 设置主节点具有读写功能、从节点只有读功能。 当主写入数据时,会同步更新到从库
- 哨兵机制 当哨兵检测到Master不能正常工作时,哨兵会自动故障迁移操作,它会将其中一个Slave升级为新的Master
- 支持事务 Redis 事务可以一次执行多个命令,统一提交
- 持久化
RDB: 以数据文件的形式进行保存备份。 redis默认使用RDB, 通过指定时间操作的次数来保存数据,会造成数据丢失。
AOF: 以日志文件的形式进行保存备份。 每次有数据更新是都写入aop文件,虽然AOF会造成磁盘 IO 的负荷加重,但 是相对可靠安全,所以一般都是使用aof - 淘汰策略 移除长时间未使用、随机移除等
- 缓存穿透 比如订单查询功能。用一个不存在的订单Id,在redis和数据库中都不存在,这样缓存就是去了意义。 接口限流 、使用布隆过滤器 (提前保存好订单号),通过bit的hash来判断,容易产生误判,将数组长度扩长
- 缓存雪崩 如果我们缓存在redis数据过期时间是相同的。这就就会导致在这段时间内,这些缓存同时过期失效, 全部请求到数据库中。增加数据库压力。
- 缓存击穿 某个 key对应的数据访问非常频繁,属于高并发式访问,当这个 key 在失效的瞬间,大量的请求就击穿了缓 存,直接请求数据库,造成数据库访问压力大。使用分布式锁,只有一个线程来执行sql操作
- Cluster集群
Redis哨兵机制在同步中,要求每个redis节点服务器都要保存master节点的全量数据,冗余的数据比较多;
采用hash槽的原理,预先设定16384个卡槽,并将卡槽分配各个master服务器;通过计算卡槽位置,然后将数据存放在卡槽对应的服务器上。
一个卡槽可以存放多个值,从而将读或者写转发到该卡槽的服务的节点。
- MyCat
- 什么是mycat
MyCAT是一款由阿里Cobar演变而来的用于支持数据库,读写分离、分表分库的分布式中间件。MyCAT支持Oracle、MSSQL、MYSQL、PG、DB2关系型数据库,同时也支持MongoDB等非关系型数据库。
- mycat原理
MyCAT原理MyCAT主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。
- mycat搭建
搭建a(主)、b(从)数据库的主从复制
搭建mycat服务器,在配置文件中配置a、b数据库信息
创建mycat虚拟数据库,链接账号、密码、库名
客户端直接连接mycat虚拟数据库
- MyCat分片策略
1)求模算法 如: 将数据的id取模你的数据库数量。
2)分片枚举
3)范围约定
4)日期指定
5)固定分片hash算法
6)通配取模
7)ASCII码求模通配
8)编程指定
9)字符串拆分hash解析
- Sharding-Jdbc与MyCat区别
MyCat是基于第三方中间件数据库代理框架,客户端所有的jdbc请求都必须要先交给MyCat转发到具体的真实服务器中。
Sharding-Jdbc是一个Jar形式,在本地应用层重写Jdbc原生的方法,实现数据库分片形式。具体实现逻辑在本地代码中。
-
Docker+Jenkins实现自动化部署
-
tomcat
-
tomcat原理
tomcat在启动的时候通过8080端口监听http请求 -
tomcat配置线程数
1.如果并发量比较大的情况下 最小活跃线程建议设置比较大,可以避免重复处理线程 可以增加吞吐量;如果最小活跃的线程如果比较大的情况下,非常占用cpu资源;
2. 如果是项目的并发量比较小的情况下,最小活跃线程可以设置小一点,可以节约cpu内存
实际案例:
通过监控工具监控线程,如果一个项目20/s请求, tomcat线程池 最大线程树为100 最小活跃线程树30 -
自带监控
配置tomcat远程访问的ip、账号、密码。
通过远程服务器登录tomcat监控页面,查看内存、线程使用情况。
- zookeeper
- 什么是zookeeper
Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务。
- Zookeeper数据结构
层次化的目录结构 - Zookeeper节点的类型
PERSISTENT 持久化节点
PERSISTENT_SEQUENTIAL 持久化顺序节点
EPHEMERAL 临时节点
EPHEMERAL_SEQUENTIAL 临时顺序节点
- zookeeper实现分布式锁
在zk上创建临时节点(设置有效期),使临时节点作为锁且节点不可以重复,
如果创建失败,则继续等待。
如果能创建界节点成功,则生成订单号。zk临时会话结束,释放锁。其他节点继续生成订单号
- 分布式事务
- CAP定律
这个定理的内容是指的是在一个分布式系统中、Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
一致性(C) 在分布式系统中的所有备份数据,在同一时刻是否同样的值。(比如: A数据库更新的信息,其他数据库可以 同时获取到)
可用性(A)在集群中一部分节点故障后,集群整体是否还能响应客户端的请求。(对数据更新具备高可用性)
分区容错性(P)指系统能够容忍节点之间的网络通信的故障。
在分布式场景中是无法保证网络问题,所以在分布式系统中是可以容忍网络之间出现的通讯故障;即发生分区容错情况。
如果发生分区容错情况,必须就当前操作在C和A之间做出选择;
CAP 原则指是指,这三个要素最多只能同时实现两点,不可能三者兼顾。要么是CP或者AP
CP:当你网络出现故障之后,不能保证数据可用性,但是不能保证一致性; 如: zk
AP:当你网络出现故障之后,不能保证数据一致性,但是能够保证可用性; 如: eureka - BASE理论
BASE是Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最终一致性)三个短语的缩写。分布式事务一般采用最终一致性解决 - 二段提交协议
- 三段提交协议
- lcn与seata
Lcn: 参与方在执行方法时,不会提交本地事务,同时等待协调者的结果,容易造成数据的死锁。
Seata: 参与方在执行方法时,不会等待协调者的结果,直接提交本地事务,通过undo_logd的逆向sql实现回滚,避免死锁现象但是容易出现脏读