
Java-后端
bianhao92115
能不能给我一首歌的时间把故事听到最后才说再见
展开
-
带你手写基于 Spring 的可插拔式 RPC 框架(五)注册中心
注册中心代码使用 zookeeper 实现,通过图片来看看我们注册中心的架构。首先说明, zookeeper 的实现思路和代码是参考架构探险这本书上的,另外在 github 和我前面配置文件中的 zookeeper 服务器是用的1个月免费适用的阿里云,大家也可以用它当测试用。不多说,一次性给出注册中心全部代码。客户端对应的注册中心接口public interface RegisterCe...原创 2019-07-04 11:04:27 · 250 阅读 · 0 评论 -
Java版数据结构与算法读书笔记(二)
队列(Queue)队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。插入一端称为队尾,删除的一端称为队头。如果用顺序存储来存储队列,容易造成溢出,浪费空间等,出队复杂度为O(n)。为了解决假溢出的方式是使用循环队列。但是最好的方式是使用非顺序,链式存储结构来存储。LinkedList(双向链表)其实就是一个队列,它实现了Queue接口。可以利用LinkedList的额头指针v...原创 2019-02-12 14:40:16 · 425 阅读 · 0 评论 -
Java版数据结构与算法读书笔记(一)
数据结构是数据之间相互存在的一种或多种特定关系元素的集合。按逻辑结构来划分集合机构线性结构树形结构图形结构物理结构从内存和存储顺序来划分1.顺序存储结构2.链式存储结构根据上面的结构,Java抽象出来对应的类线性表(List)Java里面最基本的线性顺序结构就是数组。对于添加和删除消耗会大一些,因为需要维护index。Java里面典型的实现类是ArrayL...原创 2019-02-11 17:57:03 · 1482 阅读 · 0 评论 -
打造扛得住的数据库架构读书笔记(七)
Btree索引和Hash索引表中的数据比较小时索引对性能比较小,因为此时索引都被缓存到内存里。但如果数据比较多时,内存不能完全缓存索引数据,此时索引就会对性能有很大影响了。B-tree索引的特点以B+树的结构存储数据。B树索引能够加快存储引擎的查询速度。B树索引更加适合进行范围查找。什么情况下可以用到B树索引?全值匹配的查询 order = ‘98765432111990’;匹...原创 2019-02-11 10:06:11 · 174 阅读 · 0 评论 -
打造扛得住的数据库架构读书笔记(五)
MySQL的复制解决了什么问题?实现了不同服务器上的数据分布,利用二进制日志增量进行。实现数据读取负载均衡。增加了数据的安全性。实现了数据库高可用和故障切换。实现数据库在线升级。MySQL的日志主要分为两大类,MySQL服务层日志,MySQL存储引擎层日志。二进制日志:记录了所有对MySQL数据库修改事件,包括增删改查事件和对表结构的修改事件(成功执行的)。二进制的日志格式:...原创 2019-01-23 17:27:53 · 217 阅读 · 0 评论 -
深入理解SpringCloud读书笔记(一)
SpringCloud的优点:微服务单元按照业务来划分:将一个大的业务拆分为比较小的业务。按照业务划分的微服务单元独立部署。微服务通过HTTP来互相通信:使用HTTP模式请求处理业务逻辑非常高效。服务和服务之间也可以通过轻量级的消息中线来通信,比如RabitMQ,Kafaka等。微服务的数据库独立:不同的服务之间数据库相互独立,可以选择不同类型的数据库。微服务自动化部署:可以使用Docke...原创 2019-01-23 11:40:05 · 278 阅读 · 0 评论 -
打造扛得住的数据库架构读书笔记(四)
MySQL数据库优化策略数据库架构和sql优化-----MySql服务器配置----物理硬件及操作系统。数据库架构和SQL优化数据库设计范式1)数据库表中所有字段都具有单一属性,列是有基本数据类型构成的,表时简单的二维表。2)要求一个表只有一个业务主键。3)消除了第二范式基础上非主属性对主键的依赖(比如主键是学号,学好可以决定学院和学院电话)。三范式的基本原理是将表拆分。反范式化就...原创 2019-01-22 17:36:37 · 319 阅读 · 0 评论 -
打造扛得住的数据库架构读书笔记(三)
Archive存储引擎以zlib对表数据进行压缩,磁盘I/O更少。数据存储在ARZ为后缀的文件中。特点:只支持insert和select操作,支持行级锁。不是事务型存储引擎。只允许在自增ID上加索引。使用场景:日志和数据采集类应用(只能插入和查询的场景)。Memeory存储引擎数据是保存在内存中,一旦MySql重启后,数据会丢失,但是表结构不会丢失。支持Hash索引(等值查找)和BT...原创 2019-01-22 15:07:33 · 179 阅读 · 0 评论 -
Java集合框架读书笔记(三)
ArrayDequeJava里有一个叫Stack栈的类,却没有叫Queue的类(它是一个接口的名字)。当需要使用栈时,Java已经不推荐用Stack,而是使用更加高效的ArrayDeque,如果使用队列,当然也是ArrayDeque。Deque是双端队列,可以当做栈使用,也可以当做队列使用。队列的相关接口:与Stack栈相关的接口从名字就可以看出来ArrayDeque底层通过数组实现...原创 2019-01-16 17:24:39 · 153 阅读 · 0 评论 -
Java集合框架读书笔记(二)
LinkedListLinkedList同时实现了List接口和Deque接口,也就是说它皆可以看做一个顺序容器,也可以看做是一个队列,同时也可以看做是一个栈。当你想要使用栈和队列时,可以考虑使用LinkedList。不过现在首选的是ArrayDeque,他的性能比LinkedList更好。LinkedList的底层通过双向链表来实现。LinkedList没用实现同步,可以采用Colle...原创 2019-01-16 16:44:30 · 154 阅读 · 0 评论 -
Java集合框架读书笔记(一)
容器,就是可以容纳其他Java对象的对象。对于基本数据类型需要完成对象包装后才能被放进去,java的自动拆装包可以自动完成。Java里对象都存在堆上,且对象只能通过引用访问,句柄和直接指针方式,容器里放的起始就是对象的引用而不是对象本身。JCF中定义了14种容器接口:上述接口的对应实现:迭代器(Iterator)JCF的迭代器提供了遍历容器中元素的方法,只有容器本身清除容器里元素的组...原创 2019-01-16 16:18:11 · 240 阅读 · 0 评论 -
打造扛得住的数据库架构读书笔记(二)
影响MySql的性能的因素1)服务器硬件1.CPU资源(目前不支持多个CPU对同一SQL并发处理)如果并发比较多,CPU数量其实很重要。2.可用内存大小(对性能的影响有限)MyISAM会将索引缓存到内存中,数据通过操作系统来缓存。InnoDB会同时在内存中缓存数据和索引。3.磁盘I/O性能和系统磁盘的配置和选择:传统机器硬盘(空间大,读写速度慢),RAID增强传统机器硬盘的性能(R...原创 2019-01-21 18:26:41 · 272 阅读 · 0 评论 -
打造扛得住的数据库架构读书笔记(一)
影响数据库性能的因素:sql查询速度,服务器硬件,网卡流量,磁盘IO。QPS:每秒中处理的查询量。大量的并发:可能会导致数据库连接数被占满。超高的CPU使用率:因CPU资源耗尽而宕机。数据性能的瓶颈往往是磁盘IO(更换性能更高的磁盘)。网卡流量:网卡IO也有可能会被占满(减少从服务器的数量,进行分级缓存,避免使用select*,把业务网络和服务器网络进行分级)。大表,大表是相对而言的,...原创 2019-01-21 15:07:47 · 276 阅读 · 0 评论 -
打造扛得住的数据库架构读书笔记(六)
高可用数据库架构MMM 主主同步管理工具。用于监控和管理MySQL的主主复制拓扑,并在当前的主服务器失效时,进行主和主备服务器之间的主从切换和故障转移等工作。MMM是工作在两个服务器其中一个提供服务的前提下(同一时间只有一台主服务器提供服务)。在主库宕机时进行故障转移并自动配置其他从对新主的复制。(数据可能丢失)提供了主,写虚拟IP,在主从服务器出现问题时可以自动迁移虚拟IP。...原创 2019-01-25 14:18:04 · 179 阅读 · 0 评论 -
JAVA并发编程(六)锁补充
1.Synchronized锁的三种形式:Synchronized修饰普通同步方法,锁的是调用当前方法的实例对象。Synchronized修饰静态同步方法,锁的是当前类的class对象。Synchnonized修饰同步代码块,锁的是Synchronized后面括号里配置的对象。2.Synchronized在JVM里面怎么实现?Synchronized锁是基于进入和退出monitor对象来...原创 2019-02-18 18:04:10 · 175 阅读 · 0 评论 -
Java版数据结构与算法读书笔记(三)
树树是n个节点的有限集,n=0时称为空树,在任意一棵非空树中,有且仅有一个根节点。每个节点最多只有一个父节点。节点拥有的子树数称为节点的度,度为0的节点称为页子节点或者中断节点。树的度是树内各节点的度的最大值。层次与深度节点的层次从根开始定义,根为第一层,跟的孩子为第二层。树中节点的最大层次称为树的深度或高度。树的存储结构,简单的顺序存储不能满足树的实现,需要结合顺序存储和链式存储...原创 2019-02-13 17:34:20 · 351 阅读 · 0 评论 -
带你手写基于 Spring 的可插拔式 RPC 框架(四)代理类的注入与服务启动
上一章节我们已经实现了从客户端往服务端发送数据并且通过反射方法调用服务端的实现类最后返回给客户端的底层协议。这一章节我们来实现客户端代理类的注入。承接上一章,我们实现了多个底层协议,procotol 有 netty,http,和 socket 三个实现类,每个实现类都有启动服务端和客户端发送数据两个方法。问题如何实现底层协议的选择那?可以通过配置文件来选择协议。单独的配置文件还是和 ...原创 2019-07-04 11:03:42 · 406 阅读 · 0 评论 -
带你手写基于 Spring 的可插拔式 RPC 框架(三)通信协议模块
在写代码之前我们先要想清楚几个问题。我们的框架到底要实现什么功能?我们要实现一个远程调用的 RPC 协议。最终实现效果是什么样的?我们能像调用本地服务一样调用远程的服务。怎样实现上面的效果?前面几章已经给大家说了,使用动态代理,在客户端生成接口代理类使用,在代理类的 invoke 方法里面将方法参数等信息组装成 request 发给服务端,服务端需要起一个服务器一直等待接收这种消息,...原创 2019-07-04 11:03:04 · 360 阅读 · 0 评论 -
带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构
前言上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 RPC 框架,这个框架都有那些模块以及这些模块的作用。总体设计在我们的整个框架里比较重要的几个模块:rpc-procotol: 既然是可插拔是框架,我们需要支持选择底层协议,这部分是通信协议相关的模块。rpc-spring: 我们的框架是基于 spring 开发...原创 2019-07-04 11:02:32 · 396 阅读 · 0 评论 -
带你手写基于 Spring 的可插拔式 RPC 框架(一)介绍
概述首先这篇文章是要带大家来实现一个框架,听到框架大家可能会觉得非常高大上,其实这和我们平时写业务员代码没什么区别,但是框架是要给别人使用的,所以我们要换位思考,怎么才能让别人用着舒服,怎么样才能让我们的框架性能优异。通过自己写一个框架,我们能学到的有很多,能让我们脱离 CURD,在更高的层面上去思考。目的写这个框架最主要的目的是要让大家了解整个框架的设计思想和用到的技术,并不是让大家关注代...原创 2019-07-04 11:01:46 · 508 阅读 · 0 评论 -
手动实现 SpringMVC
前几章我们已经分析了 Spring 的源码并且手动实现了一个 IOC/DI 容器。这章我们在自己实现的 Spring 框架的基础上实现一个 SpringMVC 框架。我们自己实现的 Spring 框架的快速入口:Spring 框架 里面的 MySpring 是我们 IOC/DI 框架的源码。下面我们在这个基础上实现一个 MVC 框架。首先 @Controller,@Service,@Repo...原创 2019-06-16 17:41:50 · 184 阅读 · 0 评论 -
Spring 源码解析(二)
第一章为源码解析。第二章为实现一个简单的 IOC 容器。第三章进阶 Spring 插件开发。手动实现一个 IOC/DI 容器上一篇文章里我们已经对 Spring 的源码有了一个大概的认识,对于 Spring 中的一些组件,比如 Aware,PostProcessor,ApplicationContext 有了一定的认识,下面我们就来手动实现一个 IOC/DI 容器。项目整体用 mav...原创 2019-06-10 21:59:36 · 126 阅读 · 0 评论 -
Spring 源码解析(一)
Spring 源码解析第一章为源码解析。第二章为实现一个简单的 IOC 容器。第三章进阶 Spring 插件开发。概念Spring 源码的核心组件:IOC 容器负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。AOP 面向切面编程,通过预编译方式和运行期间动态代理实现功能的统一维护的一种技术。IOC 容器可以理解为一个 Map,key 就是我们平常使用 Spri...原创 2019-06-10 21:58:36 · 131 阅读 · 0 评论 -
带你全面了解高级 Java 面试中需要掌握的 JVM 知识点
带你全面了解高级 Java 面试中需要掌握的 JVM 知识点。 ——当年明月文章目录JVM 内存划分与内存溢出异常垃圾回收算法与收集器虚拟机中的类加载机制Java 内存模型与线程虚拟机性能监控与故障处理工具参考最后的话JVM 内存划分与内存溢出异常概述如果在大学里学过或者在工作中使用过 C 或者 C++ 的读者一定会发现这两门语言的内存管理机制与 Java 的不同。在使用 C 或者 C...原创 2019-05-18 10:52:17 · 356 阅读 · 0 评论 -
MySql的事务隔离级别
了解事务隔离级别之前先要了解高并发环境下的几个概念:1.脏读:事务A读取了事务B更新的数据,然后B执行回滚操作,那么A读到的就是脏数据。2.不可重复读:事务A多次读取同一个数据,事务B在事务A多次读取的过程中,对数据做了更新并提交,导致事务A多次读取同一个数据时,结果不一致。3.幻读:比如事务A将所有成绩从具体分数改为了ABCDE等级,但是事务B在这个时候插入了一条具体的分数,最后事务A结束...原创 2019-03-06 11:23:15 · 1143 阅读 · 1 评论 -
Maven概念知识
内容转载自:https://blog.youkuaiyun.com/u010425776/article/details/52027706什么是Maven?简单来说,Maven就是一款帮助程序员构建项目的工具,他会帮我们管理jar包。管理项目的生命周期。基本命令?-v : 查询maven版本。compile:编译将java源文件编译成class文件test:测试项目执行test目录下的测试用例...转载 2019-03-05 15:48:48 · 197 阅读 · 0 评论 -
Java版数据结构与算法读书笔记(四)
根据前序遍历的字符串转换为二叉树。赫夫曼树二叉树结构的改变对于效率和大小有很大的影响。从树中一个节点到另一个节点之间的分支构成两个节点之间的路径,路径上的分支数目称作路径长度。查找二叉树跟节点比左节点大,比右节点要小,这样的二叉树称为查找二叉树。...原创 2019-02-14 10:15:00 · 255 阅读 · 0 评论 -
MyBatis 读书笔记(三)
MyBatis的运行分为两大部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory,第二部分是SqlSession的执行过程。Mapper仅仅是一个接口,他的运行要依靠动态代理来实现。代理模式就如同工程师,客服和客户三者的关系。动态代理分两种,一种是JDK反射机制提供的代理(缺点是需要自己提供接口),另一种是CGLIB代理。构建Sql...原创 2019-01-20 14:16:54 · 164 阅读 · 0 评论 -
Mybatis读书笔记(二)
MyBatis配置property子元素property是一个配置属性的元素,让我们能在配置文件的上下文使用它。我们可以在properties文件里面配置密文,解密后在重新构建SqlSessionFactory。设置cacheEnabled:影响所有映射器中配置的缓存全局开关。lazyLoadingEnable:延迟加载的全局开关,当它开启时,所有关联对象都会延迟加载。aggres...原创 2019-01-19 15:38:40 · 207 阅读 · 0 评论 -
Mybatis读书笔记(一)
1.传统的JDBC编程JDBC是sun公司提出的一系列规范用于连接数据库。传统的JDBC编程分为如下几步:使用JDBC连接数据库,注册驱动和数据库信息。操作Connection,打开Statement对象。通过Statement执行SQL,返回结果到ResultSet对象。通过ResultSet读取数据,通过代码转化为POJO。关闭数据库资源。2.ORM模型ORM模型就是数据库的表...原创 2019-01-18 18:39:16 · 225 阅读 · 0 评论 -
JAVA并发编程(一)线程的定义和基本方法介绍
什么是线程:线程可以理解成是在进程中独立运行的子任务。一个进程正在运行时至少会有一个线程正在运行,这种情况在Java中也是存在的,这些线程在后台默默执行,比如调用public static void mian()方法的线程就是这样的,而且是有JVM创建的。public class Test{public static void mian(String[] args){System.out....原创 2018-11-19 14:21:34 · 172 阅读 · 0 评论 -
JAVA并发编程(五)拾遗
线程的状态:线程对象在不同的时期有不同的状态,状态信息就存在于State枚举类中。NEW:至今尚未启动的线程处于这种状态。实例化后还未执行start()方法时的状态。RUNNABLE:正在Java虚拟机中执行的线程处于这种状态。进入运行的状态。BLOCKED:受阻塞并等待某个监视器锁的线程处于这种状态。这种状态出现在某一个线程正在等待锁的情况。WAITING:无限期地等待另一个线程来执行...原创 2018-11-21 15:15:19 · 135 阅读 · 0 评论 -
JAVA并发编程(四)单例模式与线程安全问题
单例模式与线程安全一。饿汉模式(立即加载)立即加载就是使用类的时候已经将对象创建完毕。调用方法前,实例已经被创建了。public class MyObject{//立即加载方式 == 饿汉模式private static MyObject myObject = new MyObject();private MyObject(){};public static MyObject get...原创 2018-11-21 14:24:54 · 168 阅读 · 0 评论 -
JAVA并发编程(三)Timer类
定时计划任务在Java里主要是Timer类,他的内部使用了多线程的处理方式。Timer类的主要作用是设置计划任务,但封装任务的类却是TimerTask类。TimerTask就是一个线程。创建一个Timer就是启动了一个新的线程,这个新启动的线程如果不设置为守护线程的话会一直运行,所以private static Timer timer = new Timer(true);如果执行任务的时间早...原创 2018-11-21 10:16:50 · 286 阅读 · 0 评论 -
JAVA并发编程(三)线程间的通信
volatile关键字的工作流程如下:1)read和load阶段,把主存复制变量到当前线程工作内存。2)use和assign阶段,执行代码,改变共享变量值。3)store和write阶段,用工作内存数据刷新主存对应变量的值。i++操作除了使用Synchronized关键字实现外,还可以使用AtomicInteger原子类进行实现。原子类也并不完全安全,如果方法和方法之间的调用不是原子性的...原创 2018-11-20 17:48:14 · 141 阅读 · 0 评论 -
Java虚拟机(十)内存模型与线程
JAVA内存模型Java的内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。这里说的变量包含了实例字段,静态字段和构成数据对象的元素(共享的),而不包括局部变量和方法参数,因为他们是线程私有的。Java内存模型规定了所有变量都存储在主内存中,每个线程还有自己的工作内存,,工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变...原创 2018-11-16 09:46:17 · 169 阅读 · 1 评论 -
JAVA虚拟机(六)调优案例分析与实战
一个在线文档网站采用了新的硬件,4个CPU,16GB物理内存。管理员为了尽量利用硬件资源选用了64位的JDK1.5,并且将堆的大小固定位12GB。但是网站不定期出现失去响应的情况。监控服务器发现是由于GC停顿导致的,回收12GB的堆,一次Full GC停顿高达14秒。而且因为内存中有很多文档序列化产生的大对象,他们直接进入到了老年代,没有在Minor GC中清理掉。问题点:过大的堆导致内存回收...原创 2018-11-12 14:11:31 · 201 阅读 · 0 评论 -
JAVA虚拟机(七)虚拟机类加载机制
虚拟机的类加载机制是指 把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。类的加载连接和初始化过程都是在程序运行期间完成的。类的生命周期:加载->连接(验证,准备,解析)->初始化->使用->卸载。解析有时候可以在初始化之后执行,这是为了支持Java语言的动态绑定。虚拟机没有规定什么时候开始类加载...原创 2018-11-14 09:39:16 · 130 阅读 · 0 评论 -
JAVA虚拟机(九)泛型与泛型擦除
泛型与泛型擦除泛型技术在C#和Java之中使用方式看似相同,实际上却有着本质上的分歧。C#里面的泛型无论是在程序源码,编译后期还是运行期CLR中,都是切实存在的,List与List就是两个不同的类型,他们在运行期生成,有自己的虚方法表和类型数据。Java语言的泛型规则不一样,他只在程序源码中存在,在编译后的字节码文件中就不存在List和List了,他们就是同一个类。上面这段代码是不能被编译...原创 2018-11-15 15:43:23 · 344 阅读 · 0 评论 -
JAVA虚拟机(八)虚拟机字节码执行引擎
栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。每一个方法调用从开始至执行完成,都对应着一个栈帧在虚拟机栈里面入栈到出栈的过程。一个线程的方法调用链可能会很长,很多方法同时处于执行状态,在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧。所有字节码指令都是围绕当前栈帧进行...原创 2018-11-15 14:58:19 · 146 阅读 · 0 评论