RabbitMQ基础
RabbitMQRabbitMQ介绍RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初起源于金融系统,用于在分布式系统中存储转发消息。
RabbitMQ 的具体特点可以概括为以下几点:
可靠性: 通过自身机制保证其可靠性,如持久化、传输确认及发布确认等
灵活的路由:
扩展性: 多个RabbitMQ节点可以组成一个集群
高可用性
支持多种协议
多语言客户端
易用的管理界面: 官方提供ui工具
插件机制
RabbitMQ核心概念RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。机构模型如下图:
生产者(Producer) 和 消费者(Consumer)
生产者: 消息投放者
消费者: 消息消费者
消息一般由两部分组成: 消息头和消息体。消息体不透明。RabbitMQ根据消息头进行转发
Exchange(交换器)RoutingKey: 生产者将消息交给交换器时,一般会指定一个RoutingKey(路由键),用来指定这个路由规则,而这个路由 ...
SpringBoot源码系列(二)
Spring启动构造方法流程
main方法启动
12345678910@SpringBootApplicationpublic class ApplicationStart { public static void main(String[] args) { // 基础也是最简单的启动方法。通过静态方法调用。 SpringApplication.run(ApplicationStart.class, args); // 使用构建方法启动 new SpringApplication(ApplicationStart.class).run(args); }}
具体过程
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 ...
Spring基础
Spring基础Spring中常见的设计模式
单例模式: bean单例
工厂模式: BeanFactory,ApplicationContext
观察者模式: Event事件驱动
适配器模式: advice和aop增强通知
代理模式: aop使用到了动态代理
模版方法模式: jdbcTemplate等模版方法
SpringMVC的核心组建
Dispatcher
HandlerMapping
handlerAdapter
Handler
ViewResolver
SpringIOC && SpringAopPIoC
控制反转: 作为spring最核心的功能,脱离以往对象的相互依赖,相互耦合的情况,现在通过SpringIOC容器创建,管理每个bean,实现了高内聚,低耦合。
bean: ioc容器帮我们管理的对象就是bean,它是通过ioc容器创建,其中包含了一些我们普通对象所不具备的功能
注入方式:
@Autowired: 类型注入,spring提供的注解。
@Resource: 名称注入,jdk提供的注解。
@Qualifier: 注定注入bean的名称,可以和@ ...
操作系统基础
操作系统
操作系统是管理计算机硬件与软件资源的程序,是计算机的基石
操作系统本质是运行在计算机上的程序,用于管理计算机硬件与软件资源
操作系统屏蔽了硬件的复杂性
操作系统的内核是操作系统的核心,负责系统的内存管理,硬件设备管理,文件系统管理以及应用程序管理
内核维基百科:
内核(英语:Kernel,又称核心)在计算机科学中是一个用来管理软件发出的数据 I/O(输入与输出)要求的电脑程序,将这些要求转译为数据处理的指令并交由中央处理器(CPU)及电脑中其他电子组件进行处理,是现代操作系统中最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的。所以内核通常提供一种硬件抽象的方法,来完成这些操作。有了这个,通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及 IO 设备)。
总结:
它负责将应用数据的要求进行转译,并将转译后的数据交给cpu及其其它电子组件处理
它简化了应用程序操作硬件,是连接应用程序与硬件之间的桥梁
中央处理器(cpu) ...
计算机网络基础
计算机网络最常见的网络分层模型OSI七层模型国际标准化组织提出的网络分层模型
应用层: 为计算机用户提供服务
表示层: 数据处理
会话层: 管理应用程序之间的会话
传输层: 为两台主机之间的通信提供通用的数据传输服务
网络层: 路由和寻址
数据链路层: 帧编码和误差纠正控制
物理层: 原始比特流
理论与实践之间的差距,最后让这个分层显得不是很完美,tcp/ip的大受欢迎
TCP/IP四层模型广泛使用的一种模型,对osi的模型进行一定程度上的精简,分层和对应关系如下:
应用层: 对应会话层、表示层、应用层
传输层: 对应传输层
网络层: 对应网络层
网络接口层: 对应数据链路层、物理层
应用层
位于传输层之上,是应用之间传输数据的服务,定义了信息交换的格式,并将消息交给下层的传输层来传输
应用层有许多不同的协议,用于指定不同的传输规范,常见的有: htt、ssh、smtp
传输层
接受应用层的消息,并负责两台终端之间的消息传输
主要有两种协议:
tcp: 提供面向连接的,可靠的数据传输服务
udp: 提供无连接的,不保证数据传输的可靠性
网络层
负责把传输层数据进行分 ...
读书笔记-数据密集型应用系统设计(一)
系统的核心设计目标三个目标:
可靠(Reliability)>发生了某种意外,系统依旧可以正常运转
可靠性是软件的一个保证,是一种态度,如果不能保证,那么会对营收和声誉都造成很大的影响
如何保证可靠性?有若干方法:
用最小的方法来设计系统。通过精心设计的抽象层、API以及管理界面,是做正确的事情很轻松,做错误的事情很复杂
对容易出现错的地方进行分离。提供一个真实的沙箱环境,导入真实的数据,能够完成快速的切换
测试。重中之重
出现人为失误,系统能够快速的恢复,减少故障影响。通过版本管理,能够实现版本快速回滚,并发布新代码上线
监控系统。对错误能够快速的掌握和把控
管理流程。
可扩展(Scalability)如果系统工程以某种方式增长,我们应对增长的措施有哪些?
描述负载: 在一切开始前,我们需要能够正确的描述出我们系统所能承载的负载情况。然后才能正确的作出合理的解决方法。
描述性能: 对于系统所需要面对的压力,我们需要能够得到请求各个指数,知道各个环节是什么情况。
延迟: 服务器处理时间
响应时间: 对应性能最直观的参数体现,包含整个流程
中位数: 优先拿取响应时间的中位 ...
数据库基础
数据库基础数据库就是信息的集合或者说数据库就是用来管理数据的集合。
关系型数据库一种建立在关系模型之上的数据库。关系型数据库: MySql, Oracle, SQL Server等
MySql最常用的一种关系型数据库。优势
开源免费,文档丰富,社区活跃,可以满足大部分生成环境的存储需要
支持事务,分库分表,读写分离,高可用
学习成本不高,使用成本低,风险低
基础架构
连接器: 用户连接数据库
分析器: 语法分析
优化器: 对执行语言进行分析,索引选择,执行计划
执行器: 对优化后的sql语句选择存储引擎进行执行,然后返回结果
存储引擎: mysql5.5之后默认是InnoDB,之前是MyISAM
InnoDB和MyISAM的区别
InnoDB 支持行级别的锁粒度,MyISAM 不支持,只支持表级别的锁粒度。
MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别。
MyISAM 不支持外键,而 InnoDB 支持。
虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
My ...
Java面试-基础(三)
JVM垃圾回收
GC回收的主要分类:
部分回收(Minor GC)
新生代收集: 只对新生代的回收
老年代收集: 只对老年代进行垃圾回收
混合收集: 堆整个新生代和部分老年代进行垃圾回收
全部回收(Full GC): 回收整个Java堆和方法区
GC回收的空间分配担保: GC每次回收都会计算老年代连续空间和新生代对象所占内存的大小关系,如果老年代大于等于新生代,那么就会进行一个新生代的回收,否则就会进行全部回收。
死亡对象判断方法: 堆中存放着几乎所有的对象实例,每次回收前都会判断是否死亡。JVM通过如下几种方法进行判断:
引用计数法: 通过计数器表明引用次数,简单快捷,但是不用这个方法作为判断标准,因为循环引用的原因。例如:A和B相互引用,GC就回收不了这两个类的对象实例,因为他们相互引用,计数器不为0
可达性分析算法: 通过一个GC Roots作为起点,通过一个个节点进行向下查找,这个链路叫做引用链,如果一个对象找不到GC Roots,那么这个对象就没有被引用,就应该被回收
成为GC Roots的标准
如果对象实列被确认为废弃对象,能够被回收,这个时候其实只是处在可以被 ...
Java面试-基础(二)
多线程
进程:进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。
线程:线程与进程相似,但线程是一个比进程更小的执行单位。一个 Java 程序的运行是 main 线程和多个其他线程同时运行
线程的组成:程序计数器,虚拟机栈,本地方法栈
进程与线程的区别:线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。
堆和方法区:堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象 (几乎所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
线程的生命周期:
NEW: 新创建
RUNNABLE: 运行状态,运行时又分为两种情况,(准备)READY和(运行中)RUNNING
BLOCKED:阻塞
WAITING:等待
TIME_WAITING:超时
TERMINATED:终止
上下文切换: 线程 ...
Java-基础(一)
核心点
浮点数精度丢失: 由于浮点数在计算中的存储机制,转换为二进制存储会出现截断导致不精确的问题。参考
对象中hashCode()与equals()的作用:
equals()方法可以用于对比对象是否相同,它是属于Object这个公共父类的方法。如果不进行重写,那么比较的会是变量的地址值。
hashCode()方法主要是用于获取哈希码,主要用在hash表中,也是属于Object类的方法。散列表中才有用,在其它情况下没用。
hashCode()方法的存在,对于一些HashSet等散列结构的集合提供了便利,大大提高了执行效率。因为HashSet类似的集合,在进行插入等操作时,会进行对比数据是否存在,也就是相等,那么,hashCode()方法就能直接使用,作为第一步。
在非散列结构的集合中,对象比较相等时,hashCode()方法不会生效
异常的分类:
Exception: 程序本身可以处理的异常,可以通过 catch 来进行捕获
Error: 程序无法处理的错误,不建议使用catch捕获,这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。
反射:
什么是反射: 可以在 ...


