自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(133)
  • 资源 (1)
  • 论坛 (1)
  • 收藏
  • 关注

原创 spring mvc 原理深度解析

概要spring mvc 设计思想与体系结构组成mvc 执行流程解析注解配置一、spring mvc 设计思想与体系结构组成知识点jsp 执行过程回顾spring mvc执行流程解析mvc 体系结构1、回顾servlet 与jsp 执行过程流程说明:请求Servlet处理业务逻辑设置业务Modelforward jsp Servletjsp Servlet 解析封装html 返回提问:这个是一个MVC应用场景吗?spring mvc本质上还是在使用Servl

2020-11-21 16:33:39 5

原创 SpringCloud实战-Ribbon 的基本架构和实现原理

Netflix Ribbon 基本架构作为一款客户端负载均衡工具,要做的事情无非就是两件:第一件事情是获取注册中心中的服务器列表;第二件事情是在这个服务列表中选择一个服务进行调用。Netflix Ribbon 中的核心类ILoadBalancerpublic interface ILoadBalancer { //添加后端服务 //这里抽象成添加服务列表,因为Ribbon是一个工具,可以用来集成不限于Eureka //1 public void addServers(List&l

2020-11-08 17:51:22 95 3

原创 SpringCloud实战-Ribbon

1、Ribbon是Netflix一个客户端负载均衡工具,包括负载均衡、连接超时、重试等功能,Spring Cloud Netflix Ribbon对Netflix Ribbon做了封装和集成2、Eureka提供了 DiscoveryClient工具类用于查找注册在Eureka中的服务3、Ribbon默认是轮询的负载均衡策略,可以通过@RibbonClient注解改变策略,比如随机策略4、Ribbon集成Eureka是通过Eureka暴露的客户端接口-DiscoveryClient工具类实现...

2020-11-08 16:57:26 14

原创 Tomcat-关闭原理

Tomcat启动Tomcat通过Bootstrap类来启动,它的任务是初始化类加载器,并实例化Catalina类Catalina类的作用是解析server.xml文件并创建Server组件Server组件的作用是管理若干个Service组件Service组件的作用是启动连接器组件和容器组件EngineCatalina怎么创建Server组件public void start() { if (this.getServer() == null) { thi

2020-10-29 19:37:33 16

原创 AOP实现方式

Spring AOP实现方式是动态代理,AOP实现除了动态代理还有编译期的静态编织或者类加载期编织。在Java平台上,我们可以使用Java Agent技术,在类加载过程中对字节码进行操纵,比如修改或者替换方法实现等。在Spring体系中,如何做到类似功能呢?你可以使用AspectJ,它具有更加全面的能力,当然使用也更加复杂...

2020-10-28 20:24:14 14

原创 Spring Bean生命周期与作用域

Spring Bean生命周期创建过程销毁过程创建过程销毁过程依次调用DisposableBean的destroy方法和Bean自身定制的destroy方法。Spring Bean的作用域最后多看源码,善于思考背后的设计思想

2020-10-28 20:21:01 7

原创 FastDFS-nginx插件作为FastDFS客户端访问

前言:FastDFS官方不支持浏览器访问文件,要想访问文件,有两种办法:1、Java客户端,用户自己编写程序实现;2、通过nginx插件下面说下nginx插件访问FastDFS的原理:很容易知道nginx-FastDFS插件的原理是实现了FastDFS客户端,然后开启一个http服务,这样用户就可以通过http协议访问步骤:安装tengine,添加nginx-FastDFS插件。安装成功之后nginx知道了nginx-FastDFS插件的存在,这是前提./configure --prefix=/

2020-10-23 10:30:43 70

原创 从静态代理到JDK动态代理

前言:静态代理和动态代理是一种编程风格、编程范式,也叫设计模式静态代理public class StaticProxy implements Service{ public static void main(String[] args) { StaticProxy staticProxy=new StaticProxy(new DefaultService()); staticProxy.show(); } private Service s

2020-10-21 17:27:03 6

原创 mongodb企业级应用管理

概要:mongoDB的聚合操作mongodb 集群:复制mongodb 集群:分片一、 mongoDB的聚合操作知识点:pipeline 聚合mapRedurce 聚合在聚合中使用索引1.pipeline 聚合pipeline相关运算符:$match :匹配过滤聚合的数据$project:返回需要聚合的字段$group:统计聚合数据示例:# $match 与 $project使用db.emp.aggregate({$match:{"dep":{$eq:"客服部

2020-10-20 12:50:55 35

原创 Dubbo源码笔记

Dubbo生成Cluster InvokerReferenceConfig#getRegistryProtocol#referRegistryProtocol#doReferInvoker invoker = cluster.join(directory);

2020-10-16 22:37:19 8

原创 Redis杂碎知识

Redis哨兵机制选举使用Raft算法JedisCluster原理是cluster nodes获取slot与节点的映射关系,也可以不用这样,直接使用RedisCluster的MOVED

2020-10-16 15:35:47 10

原创 设计原则-KISS和YAGNI

KISS(尽量保持简单)Keep It Simple and Stupid.Keep It Short and Simple.Keep It Simple and StraightforwardYAGNI(你不会需要它)You Ain’t Gonna Need It不要去设计当前用不到的功能;不要去编写当前用不到的代码。实际上,这条原则的核心思想就是:不要做过度设计总结:YAGNI 原则跟 KISS 原则并非一回事儿。KISS 原则讲的是“如何做”的问题(尽量保持简单),而 YAGN

2020-10-15 10:50:00 6

原创 设计原则-依赖反转原则

控制反转实际上,控制反转是一个比较笼统的设计思想,并不是一种具体的实现方法,一般用来指导框架层面的设计。这里所说的“控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行。在使用框架之后,整个程序的执行流程通过框架来控制。流程的控制权从程序员“反转”给了框架。依赖注入依赖注入和控制反转恰恰相反,它是一种具体的编码技巧。我们不通过 new 的方式在类内部创建依赖类的对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类..

2020-10-15 10:31:58 48

原创 Dubbo源码-服务消费

Dubbo支持多注册中心同时消费, 如果配置了服务同时注册多个注册中心, 则会在ReferenceConfig#createProxy 中合并成一个 Invok

2020-10-14 23:04:15 12

原创 Dubbo源码-服务暴露

Dubbo服务暴露流程获取ServiceBean,继承自ServiceConfigServiceConfig#doExportServiceConfig#doExportUrlsServiceConfig#doExportUrlsForlProtocol(重点)动态代理转换成Invoker(JavassistProxyFactory 和 JdkProxyFactory)RegistryProtocol#export委托具体协议(Dubbo)进行服务暴露, 创建NettyServer监听端口和

2020-10-14 20:48:37 10

原创 设计原则-里氏替换原则

里式替换原则是用来指导,继承关系中子类该如何设计的一个原则。理解里式替换原则,最核心的就是理解“design by contract,按照协议来设计”这几个字。父类定义了函数的“约定”(或者叫协议),那子类可以改变函数的内部实现逻辑,但不能改变函数原有的“约定”。这里的约定包括:函数声明要实现的功能;对输入、输出、异常的约定;甚至包括注释中所罗列的任何特殊说明。理解这个原则,我们还要弄明白里式替换原则跟多态的区别。虽然从定义描述和代码实现上来看,多态和里式替换有点类似,但它们关注的角度是不一样的。多态是.

2020-10-14 09:37:26 10

原创 UML-类之间的关系

前言:类与类之间都哪些交互关系呢?UML 统一建模语言中定义了六种类之间的关系。它们分别是:泛化、实现、关联、聚合、组合、依赖泛化(Generalization)可以简单理解为继承关系实现(Realization)一般是指接口和实现类之间的关系聚合(Aggregation)是一种包含关系,A 类对象包含 B 类对象,B 类对象的生命周期可以不依赖 A 类对象的生命周期,也就是说可以单独销毁 A 类对象而不影响 B 对象,比如课程与学生之间的关系组合(Composition)也是一种包含关系。

2020-10-13 19:11:30 9

原创 Redis集群-ShardedJedis

Redis3.0开始官方支持集群方案,之前的集群方案有codisTwemproxyJedis的ShardedJedis实现key分片介绍

2020-10-12 16:36:39 8

原创 缓存读写策略-Cache Aside(旁路缓存)策略

Cache Aside(旁路缓存)策略以数据库中的数据为准,缓存中的数据是按需加载的。它可以分为读策略和写策略。读策略从缓存中读取数据;如果缓存命中,则直接返回数据;如果缓存不命中,则从数据库中查询数据;查询到数据后,将数据写入到缓存中,并且返回给用户。写策略更新数据库中的记录;删除缓存记录。答疑:1、不能先删除缓存,后更新数据库2、出现的问题。不过这种问题出现的几率并不高,原因是缓存的写入通常远远快于数据库的写入,所以在实际中很难出现请求 B 已经更新了数据库并且清空了缓存,请求 A 才更

2020-10-11 20:47:38 48

原创 2020秋招笔试编程题

寻找矩形最大面积axb的矩形内切蛋糕,每块1x2,几种切法给定一个正整数数组L,一个非负整数M,和S,从L选若干个数,和为S,有几种选法,可以利用M次魔法,每次魔法会将选定的数变成该数的阶乘...

2020-10-11 11:56:28 144 1

原创 设计模式-面向对象-多用组合少用继承

继承主要有三个作用:表示 is-a 关系,支持多态特性,代码复用。而这三个作用都可以通过其他技术手段来达成。比如 is-a 关系,我们可以通过组合和接口的 has-a 关系来替代;多态特性我们可以利用接口来实现;代码复用我们可以通过组合和委托来实现。讨论:我们在基于 MVC 架构开发 Web 应用的时候,经常会在数据库层定义 Entity,在 Service业务层定义 BO(Business Object),在 Controller 接口层定义 VO(View Object)。大部分情况下,Entity

2020-10-10 10:14:10 14

原创 jvm笔记

GC和GC Tuning作者:马士兵教育 http://mashibing.comGC的基础知识1.什么是垃圾C语言申请内存:malloc freeC++: new deletec/C++ 手动回收内存Java: new ?自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出两种类型的问题:忘记回收多次回收没有任何引用指向的一个对象或者多个对象(循环引用)2.如何定位垃圾引用计数(ReferenceCount)根可达算法(RootSearching)3.常

2020-10-09 11:55:02 30 1

原创 Redis-对象

Redis并没有使用简单动态字符串SDS、双端链表、字典、压缩列表、整数集合等数据结构实现键值对数据库,而是基于这些数据结构创建一个对象系统,包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象。Redis在执行命令之前可以根据对象的类型来判断一个对象是否可以执行给定的命令。也可以针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。Redis的对象系统实现了基于引用计数技术的内存回收机制,当程序不再使用某个对象的时候,这个对象所占用的内存会被自动释放。Red.

2020-10-09 10:48:26 13

原创 Redis吊打面试官系列-数据结构-5大对象对应数据结构

字符串整数值embstr编码的简单动态字符串简单动态字符串列表压缩列表双向链表哈希压缩列表字典集合整数集合字典有序集合压缩列表跳跃表和字典

2020-09-28 20:38:54 27 1

原创 操作系统面试题

select和epoll的区别?epoll两种触发方式?操作系统的进程调度算法?页面调度算法?Linux的零拷贝了解吗?系统中堆和栈的区别什么是僵尸进程?什么是孤儿进程?进程通信方式?用过哪种?...

2020-09-28 19:23:41 623

原创 计算机网络面试题

tcp为什么四次挥手?为什么三次握手?CLOSED_WAIT出现在主动端还是被动端?大量CLOSED_WAIT会是什么原因?由图可知道CLOSE_WAIT出现在服务端,如果大量客户端主动发送FIN信号断开连接,那么服务端就会出现大量的CLOSE_WAIT状态拆包和粘包问题怎么解决?出现拆包和粘包问题是TCP协议本身导致的,因为TCP是面向字节流传输的,TCP对于每一个Socket连接会维护一个发送缓存和接收缓存,应用层通过write系统调用写字节数组到发送缓存,发送缓存其实也是一个字节数组,传.

2020-09-28 19:19:41 18

原创 Redis吊打面试官系列-数据结构-原理-list

前言:本文是Redis吊打面试官系列的数据结构原理专题,介绍列表list的底层实现前提认识:Redis的list底层是双向链表1、链表节点结构2、list结构3、总体结构总结:链表被广泛用于实现Redis的各种功能,比如列表键、发布订阅、慢查询、监视器等。通过为链表设置不太的类型特定函数,Redis的链表可以用于保存各种不太类型的值...

2020-09-28 11:32:16 26

原创 Netty-监听读写事件

前言:监听读写事件是对于NioSocketChannel来说的,而NioSocketChannel和NioServerSocketChannel都对应NioEventLoop1、看NioEventLoop线程的loop方法,NioEventLoop的run()方法2、3、4、5、6、最后:6就是NioSocketChannel每次监听读事件的地方,随后会调用响应的pipeline。...

2020-09-26 21:25:47 34

原创 Netty-监听新连接接入

1、NioServerSocketChannel所在EventLoop线程Loop是NioEventLoop的run()方法2、3、4、5、6、7、8、最后:注册过程和NioServerSocketChannel的相同,区别是NioSocketChannel的第一次注册会开启一个EventLoop线程,之后的不开启。...

2020-09-26 20:23:15 35

原创 Redis持久化-AOF文件重写

1、客户端输入BGREWRITEAOF命令,Redis会创建一个子进程进行AOF文件的重写,并创建AOF重写缓冲区,这样子进程重写AOF文件,父进程可以继续接受客户端的命令请求,当子进程重写AOF文件完毕后,会通知父进程讲AOF重写缓冲区的内容追加到到重写之后的AOF文件中,追加过程是阻塞的,不接受客户端的命令请求。2、子进程重写AOF文件期间,父进程忽略客户端的BGREWRITEAOF命令,所有客户端的写操作会正常进行,写操作会被记录到AOF缓冲区和AOF重写缓冲区。3、每次事件循环后,AOF缓冲区的

2020-09-26 17:04:08 27

原创 Netty-服务端启动流程-文字

newChannel初始化jdk底层的ServerSocketChannel,并封装到Netty的Channel上initChannel初始化1的Channel,主要是设置id,unsafe,channelPipelineregisterChannnel注册channel到jdk底层的Selector,并开启所在的EventLoop线程4、doBind对channel底层的socket完成端口绑定,并添加感兴趣的事件Accept...

2020-09-25 20:40:02 8

原创 Netty-Channel注册到Selector

1、2、3、4、5、6、7、到此真相大白

2020-09-25 19:39:46 35

原创 Netty-吐槽代码-注册channel

这段代码是初始化并注册NioServerSocketChannel,其中红色部分是实现注册的代码,功能是注册channel到parentGroup中,因为此方法属于AbstractBootstrap,而parentGroup就在本类中而parentGroup已经在ServerBootstrap.group(EventLoopGroup parentGroup, EventLoopGroup childGroup)进行了初始化,为什么不直接获取呢?至少现在我看来是一段垃圾代码吧。有知道的小伙伴留言一下.

2020-09-25 16:30:45 9

原创 Netty-parentGroup线程启动时刻

前言:其实掌握Netty的源码不难,关键是掌握几个点,本文介绍其中一个,parentGroup线程在哪启动?流程1:AbstractChannel.register(EventLoop eventLoop, final ChannelPromise promise)方法流程2:SingleThreadEventExecutor.execute(Runnable task)方法流程3:SingleThreadEventExecutor.startThread()方法流程4:SingleThrea

2020-09-25 10:57:40 23 1

原创 Netty-Reactor线程接入原理

原理一个EventLoopGroup是一个Reacctor线程池,负责调度和执行客户端接入、网络读写事件处理、用户自定义任务、定时任务parentGroup负责客户端的接入childGroup负责上面其余的三个parentGroup一般只有一个线程,创建NioServerSocketChannel后创建NioServerSocketChannel的ChannelPipeline,ChannelPipeline包括一系列的ChannelHandler,因为是单线程处理parentGroup的Sel.

2020-09-24 11:05:06 24

原创 TCP参数-backlog

2020-09-23 21:55:44 6

原创 Netty-实现RPC

Netty实现RPC简直不要那么简单,只需要用户实现相应的序列化、反序列化和tcp拆包粘包问题就行步骤:定义服务接口和实现服务接口定义RPC请求实体和响应实体选择序列化框架定义通信协议,解决tcp拆包粘包问题定义RPC服务端和RPC客户端,Netty实现步骤1:服务接口public interface CalculatorService { double add(double op1, double op2); double substract(double o

2020-09-22 20:07:32 19

原创 面向对象设计

面向对象的基本要素:封装、继承、多态。封装的目的是隐藏事务内部的实现细节,以便提高安全性和简化编程。封装提供了合理的边界,避免外部调用者接触到内部的细节。我们在日常开发中,因为无意间暴露了细节导致的难缠 bug 太多了,比如在多线程环境暴露内部状态,导致的并发修改问题。从另外一个角度看,封装这种隐藏,也提供了简化的界面,避免太多无意义的细节浪费调用者的精力。继承是代码复用的基础机制,类似于我们对于马、白马、黑马的归纳总结。但要注意,继承可以看作是非常紧耦合的一种关系,父类代码修改,子类行为也会变动。在实

2020-09-22 11:14:55 1533

原创 谈谈你知道的设计模式?

设计模式是人们为软件开发中相同表征的问题,抽象出的可重复利用的解决方案。在某种程度上,设计模式已经代表了一些特定情况的最佳实践,同时也起到了软件工程师之间沟通的“行话”的作用。理解和掌握典型的设计模式,有利于我们提高沟通、设计的效率和质量。大致按照模式的应用目标分类,设计模式可以分为创建型模式、结构型模式和行为型模式。创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式(Factory、Abstract Factory)、单例模式(Singleton)、构建器模式(Builder)

2020-09-22 10:32:02 16

原创 计算机字节存储顺序-Big-Endian和Little-Endian

如果数据需要用多个字节来存储就要考虑用大端存储还是小端存储,注意这里指字节的存储顺序而不是位的存储顺序,位的存储顺序是固定的,直接取出来就行,即问题是多个字节的数据的高字节放在地址低位还是高位的问题,放在低位的是大端存储,放在高位的是小端存储...

2020-09-20 20:20:31 30

MYSQL45讲.zip

极客时间MYSQL45讲,在极客时间销量算是最高的MYSQL讲授,小白不建议看,看完吊打面试官,MYSQL一切问题都不是事

2020-08-01

csdn的一个bug

发表于 2020-06-26 最后回复 2020-07-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除