- 博客(233)
- 收藏
- 关注
原创 操作系统之虚拟化之进程
抽象:进程如何运行多个程序虚拟化计如果我们的硬件只含有一个cpu,但是我们想要让用户同时运行多个程序,我们就要让用户以为我们有多个cpu。下面举个例子。假设我们开设了一个加工厂,但是我们为了多赚钱,多拉生意。我们就同时承接了裤子加工,帽子加工,衣服加工。我们需要让那些老板认为我们的工厂就是为他们生产的,实际上我们是轮流生产的(即cpu轮流给应用程序使用),我们需要有一个机制来安排什么时候生产不同的加工品(这个就是进程调度机制)。如果有时候老板要来看(用户用到了这个软件),我们就需要马上停止当前产品的
2022-05-31 10:45:12 737 2
原创 Future模式与异步回调模式
写再前面Future模式与异步回调模式二者十分相似又存在区别,所以将两个和在一起进行总结。Future模式什么是Future模式长篇大论用生活中的例子来打个比喻,就像叫外卖。比如在午休之前我们可以提前叫外卖,只需要点好食物,下个单。然后我们可以继续工作。到了中午下班的时候外卖也就到了,然后就可以吃个午餐,再美滋滋的睡个午觉。而如果你在下班的时候才叫外卖,那就只能坐在那里干等着外卖小哥,最后拿到外卖吃完午饭,午休时间也差不多结束了。Future 模式是高并发设计与开发过程中常见的设计模式,
2021-11-09 22:04:32 2333 2
原创 网络安全系列导航
1.数字证书:20张图带你彻底领会数字签名与数字证书:https://blog.csdn.net/pjh88/article/details/115057746
2021-10-18 21:24:55 344
原创 网络编程进阶学习笔记--JavaNIO核心讲解
前言本笔记是我对尼恩高并发三部曲的学习笔记,定位为网络编程的进阶学习笔记,看这个笔记的人应当对netty有过基础的学习,没有任何网络里编程经验的同学建议看看我的nety基础系列的文章,链接:https://www.yuque.com/u2196512/mgr9wm再看本系列的文章学习起来可能回更加高效,链接奉上。本系列预计用两个月完成更新。JavaNIO核心讲解概述NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复
2021-09-29 16:03:32 440
原创 网络编程进阶学习笔记--高并发IO的底层原理
前言本笔记是我对尼恩高并发三部曲的学习笔记,定位为网络编程的进阶学习笔记,看这个笔记的人应当对netty有过基础的学习,没有任何网络里编程经验的同学建议看看我的nety基础系列的文章,在看本系列的文章学习起来可能回更加高效,链接奉上。本系列预计用两个月完成更新。链接:https://www.yuque.com/u2196512/mgr9wm高并发IO的底层原理操作系统中的基础知识用户态与内核态系统调用将Linux整个体系分为用户态和内核态为什么需要划分内核态于用户态为了安全。
2021-09-29 16:02:02 405
原创 网络编程进阶学习笔记--开篇
开篇本笔记是我对尼恩高并发三部曲的学习笔记,定位为网络编程的进阶学习笔记,看这个笔记的人应当对netty有过基础的学习,没有任何网络里编程经验的同学建议看看我的nety基础系列的文章,在看本系列的文章学习起来可能回更加高效,链接奉上。本系列预计用两个月完成更新。链接:https://www.yuque.com/u2196512/mgr9wm...
2021-09-29 15:57:47 145
原创 Elasticsearch
Elasticsearch简介Elasticsearch为和何物?Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单Elasticsearch使用场景**2013年初,GitHub抛弃了Solr,**采取
2021-08-24 16:38:42 691
原创 使用Visual Studio Code和码云进行源代码管理——从上传到协作
在码云中新建项目首先你需要注册一个码云账号,随后在官网首页点击新建项目,如图所示:然后进入到如下界面:项目名称就不说了,其他需要注意几点有:是否开源:默认是公有开源的,如果这里选择了私有,那么这个项目以后就只有被你允许加入的项目组成员才能看到并操作这个项目。使用Readme文件…:勾选这个选项会在你的仓库自动生成一个readme文件,如果你的项目中已有readme文件,记得这里取消勾选创建完成后如下图,这里要把红框的网址复制一下,后面会用。蓝框就是如果刚才你勾选了生成Readme文件的效果:
2021-08-22 14:49:32 1088
原创 使用阿里云存储图片
1.准备为什么使用云存储的方式什么是OSS对象存储服务阿里云对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。其数据设计持久性不低于99.9999999999%(12个9),服务可用性(或业务连续性)不低于99.995%。OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。您可以使用阿里云提供的API、SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数
2021-08-22 14:48:04 8027
原创 跨域请求剖析
什么是跨域请求在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等标签以及 Ajax 都可以指向一个资源地址,而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。举个例子:假如一个域名为aaa.cn的网站,它发起一个资源路径为aaa.cn/books/getBoo
2021-08-13 18:30:43 164
原创 Stream流
流基础知识什么是流是一组有序的数据序列,将数据从一个地方带到另一个地方。 。根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种。流的作用Java 中流的定义是“源中支持聚合操作的一系列元素”。流从诸如集合,数组或I / O资源之类的源中消耗。流支持功能编程语言的通用操作,例如映射,过滤,缩小,查找,排序等。什么是输入流与输出流Java 程序通过流来完成输入/输出,所有的输入/输出以流的形式处理。因此要了解 I/O 系统,首先要理解输入/输出流的概念。输入就是将数据从各
2021-08-13 12:07:07 943
原创 @PathVarible详解
@PathVarible@PathVariable是spring3.0的一个新功能:接收请求路径中占位符的值语法:@PathVariable("xxx")通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“) @RequestMapping(value=”user/{id}/{name}”)请求路径:http://localhost:8080/hello/show5/1/james测试环境:环境:jdk1.8
2021-08-10 19:58:19 2448
原创 Spring Cloud微服务学习系列14 Bus服务总线
Spring Cloud Bus服务总线问题前面已经完成了将微服务中的配置文件集中存储在远程Git仓库,并且通过配置中心微服务从Git仓库拉取配置文件,当用户微服务启动时会连接配置中心获取配置信息从而启动用户微服务。如果我们更新Git仓库中的配置文件,那用户微服务是否可以及时接收到新的配置信息并更新呢?1. 修改远程Git配置修改在码云上的userservice-dev.yml文件,添加一个属性test.name。2.修改UserControllerpackage com.pjh.user.C
2021-08-10 19:56:58 549
原创 Spring Cloud微服务学习系列13 分布式配置中心
SpringCloud分布式配置中心什么是分布式配置中心在分布式系统中,由于服务数量非常多,配置文件分散在不同的微服务项目中,管理不方便。为了方便配置文件集中管理,需要分布式配置中心组件。在Spring Cloud中,提供了Spring Cloud Config,它支持配置文件放在配置服务的本地,也支持放在远程Git仓库(GitHub、码云)。使用Spring Cloud Config配置中心后的架构如下图:分布式配置中心本质上也是一个微服务,同样要注册到Eureka注册中心远程仓库的选择远程
2021-08-10 19:55:55 273
原创 Spring Cloud微服务学习系列12 Gateway网关
Spring Cloud Gateway网关简介Spring Cloud Gateway是Spring官网基于Spring 5.0、 Spring Boot 2.0、Project Reactor等技术开发的网关服务。网关的主要作用:Spring Cloud Gateway基于Filter链提供网关基本功能:安全、监控/埋点、限流等**。**Spring Cloud Gateway为微服务架构提供简单、有效且统一的API路由管理方式。3.Spring Cloud Gateway是替代Netf
2021-08-10 19:55:07 597
原创 Spring Cloud微服务学习系列11 Feign
Feign简介在前面的学习中,使用了Ribbon的负载均衡功能,大大简化了远程调用时的代码:String url = "http://user-service/user/" + id;User user = this.restTemplate.getForObject(url, User.class)如果就学到这里,你可能以后需要编写类似的大量重复代码,格式基本相同,无非参数不一样。有没有更优雅的方式,来对这些代码再次优化呢?这就是接下来要学的Feign的功能了Feign也叫伪装:Fei
2021-08-10 19:53:43 201
原创 使用Netty实现一套分布式RPC服务
写在前面Netty作为一个异步事件驱动的网络应用框架,可以用于快速开发可维护的高性能服务器和客户端。国内著名的RPC框架Dubbo底层使用的是Netty作为网络通信的。本篇文章我们来探索一下RPC框架的本质以及使用Netty来实现一个简单地RPC框架。什么是RPC概述RPC(Remote Procedure Call)— 远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程两个或多个应用程序都分布在不同的服务器上,它们之
2021-08-10 13:53:57 643 1
原创 第30讲TCP粘包及拆包解决方案
概述拆包粘包概述拆包和粘包是在socket编程中经常出现的情况,在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的粘包。而如果通讯的一端发送的数据包超过一次tcp报文所能传输的最大值时,就会将一个数据包拆成多个最大tcp长度的tcp报文分开传输,这就叫做拆包。TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,
2021-08-05 11:31:38 837
原创 第29讲Log4j整合到Netty
1.添加对应的依赖 <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <g
2021-08-05 11:31:06 283
原创 第28讲Handler链调用机制
概述学前须知netty的组件设计:Netty的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等ChannelHandler充当了处理入站和出站数据的应用程序逻辑的容器。例如,实现ChannelInboundHandler接口(或ChannelInboundHandlerAdapter),你就可以接收入站事件和数据,这些数据会被业务逻辑处理。当要给客户端发送响应时,也可以从ChannelInboundHandler冲刷数据
2021-08-05 11:30:47 191
原创 第27讲Netty编解码机制概述
Netty编解码机制概述通常我们习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。反之,解码(Decode)称为反序列化(deserialization),它把从网络、磁盘等读取的字节数组还原成原始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。Java序列化相信大多数Java程序员接触到的第一种序列化或者编解码技术就是Java默认提供的序列化机制,需要序列化的Java对象只需要实现java.io.Seria
2021-08-05 11:29:55 166
原创 第26讲WebSocket长连接开发
概述实例要求:问题:Http协议是无状态的,浏览器和服务器间的请求响应一次,下一次会重新建立连接,这样的操作极其耗费资源要求:实现基于websocket的长连接的全双工的交互,改变Http协议多次请求的约束,实现长连接,服务器可以发送消息给浏览器实例要求:Http协议是无状态的, 浏览器和服务器间的请求响应一次,下一次会重新创建连接.要求:实现基于webSocket的长连接的全双工的交互改变Http协议多次请求的约束,实现长连接了, 服务器可以发送消息给浏览器客户端浏览器和服务器端会
2021-08-04 12:06:52 282
转载 第25讲Netty心跳检测机制
何为心跳顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性.为什么需要心跳因为网络的不可靠性, 有可能在 TCP 保持长连接的过程中, 由于某些突发情况, 例如网线被拔出, 突然掉电等, 会造成服务器和客户端的连接中断. 在这些突发情况下, 如果恰好服务器和客户端之间没有交互的话, 那么它们是不能在短时间内发现对方已经掉线的. 为了解决这个问题, 我们就需要引入 心跳 机制. 心跳机制的工作原理是: 在
2021-08-04 12:06:19 443
原创 第24讲Netty实现群聊系统
概述实例要求:编写一个 Netty 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞)实现多人群聊服务器端:可以监测用户上线,离线,并实现消息转发功能客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到)目的:进一步理解Netty非阻塞网络编程机制代码实现服务端代码主类package com.pjh.Netty.GroupChat;import com.pjh.Netty.GroupChat.me.ServerH
2021-08-04 12:05:46 282
原创 第23讲Netty核心模块组件
1.Bootstrap、ServerBootstrap概述Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中 Bootstrap 类是客户端程序的启动引导类,ServerBootstrap 是服务端启动引导类方法解析2.Future ,ChannelFuture概述用于保存Channel异步操作的结果Netty 中所有的 IO 操作都是异步的,不能立刻得知消息是否被正确处理。但是可以过
2021-08-04 11:59:05 138
原创 第22节Netty实现Http服务
概述实例要求:1.使用IDEA 创建Netty项目2.Netty 服务器在 6668 端口监听,浏览器发出请求 "http://localhost:6668/ "3.服务器可以回复消息给客户端 "Hello! 我是服务器 5 " , 并对特定请求资源进行过滤.目的:Netty 可以做Http服务开发,并且理解Handler实例和客户端及其请求的关系.代码实现TestServer代码package com.pjh.Netty.Http;import com.pjh.Netty.Http
2021-08-04 11:58:14 309 1
原创 第21节Netty异步模型介绍
在netty中I/O操作都是异步执行,所以任何的I/O调用都将立即返回。netty为我们提供了一个ChannelFuture实例,这个实例将会返回关于I/O操作结果或者状态。我们可以通过 addListener()为ChannelFuture添加监听器,这样当相关的操作执行结束之后就会发送消息给监听器。概述1.异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的组件在完成后,通过状态、通知和回调来通知调用者。2.Netty 中的 I/O 操作是异步的,包括 Bin
2021-08-04 11:57:42 196
原创 第20节Netty任务队列中的三种场景
概述1.用户自定义的普通任务1 . 用户自定义任务流程 :① 获取通道 : 首先获取 通道 Channel ;② 获取线程 : 获取通道对应的 EventLoop 线程 , 就是 NioEventLoop , 该 NioEventLoop 中封装了任务队列 TaskQueue ;③ 任务入队 : 向任务队列 TaskQueue 中放入异步任务 Runnable , 调用 NioEventLoop 线程的 execute 方法 , 即可将上述 Runnable 异步任务放入任务队列 TaskQueu
2021-07-31 19:08:05 205
原创 第19节Netty案例
案例一概述实例要求:使用IDEA 创建Netty项目Netty 服务器在 6668 端口监听,客户端能发送消息给服务器 “hello, 服务器~”服务器可以回复消息给客户端 “hello, 客户端~”目的:对Netty 线程模型 有一个初步认识, 便于理解Netty 模型理论代码实现服务器端主函数package com.pjh.Netty.Test;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.
2021-07-31 19:07:48 262
原创 第18节Netty模型概述
Netty模型简单版Netty 主要基于主从 Reactors 多线程模型(如图)做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor 。1.BossGroup 线程维护Selector , 只关注Accecpt2.当接收到Accept事件,获取到对应的SocketChannel, 封装成 NIOScoketChannel并注册到Worker 线程(事件循环), 并进行维护3.当Worker线程监听到selector 中通道发生自己感兴趣的事件后,就进行处理(就由handler
2021-07-31 19:06:56 120
原创 第17节Reactor模式介绍
传统IO模型工作原理图黄色的框表示对象蓝色的框表示线程白色的框表示方法(API)模型特点采用阻塞IO模式获取输入的数据 每个连接都需要独立的线程完成数据的输入,业务处理,数据返回问题分析1.当并发数很大,就会创建大量的线程,占用很大系统资源2.连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read 操作,造成线程资源浪费解决方案1.基于 I/O 复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,操作系
2021-07-31 19:05:38 262
原创 第16节Netty概述
原生NIO存在的问题1.NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。2.需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。3.开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。4.JDK NIO 的 B
2021-07-31 19:04:34 96
原创 第15节AIO带过
1.JDK 7 引入了 Asynchronous I/O,即 AIO。在进行 I/O 编程中,常用到两种模式:Reactor和 Proactor。Java 的 NIO 就是 Reactor,当有事件触发时,服务器端得到通知,进行相应的处理 AIO 即 NIO2.0,叫做异步不阻塞的 IO。2.AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用3.目前 AIO
2021-07-31 19:03:41 93
转载 第14节FileChannel详解
经过前两篇文章的学习,相信对Channel有了一定的整体性认识。接下来通过学习本篇文章,更进一步认识Channel,学习FileChannel的细节用途特点api原理一.用途传统IO中的FileInputStream和FileOutputStream,相信读者都不陌生。在NIO中提供新的方式对文件进行I/O操作。A channel for reading, writing, mapping, and manipulating a file.上面的描述来自Java SE8中FileCh
2021-07-28 09:54:07 709
原创 第13节NIO与零拷贝
1.概述在通过IO进行数据读写时(例如从文件读取数据),需要进行多次的数据拷贝,有些拷贝是通过DMA的方式进行的,有些拷贝是CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方,这种方式效率较低。那所谓的零拷贝就是指在进行IO读写时,尽量减少拷贝次数,尤其是cpu拷贝。零拷贝主要是由操作系统来支持,和java api无关。2.相关概念须知在详细介绍零拷贝前,先需要了解以下个概念:DMA、NIO Gather & Scatter 和mmap2.1 DMA直接内存访问
2021-07-28 09:52:19 224
原创 第12节网络编程提升案例之群聊系统实现
案例二群聊系统实现案例要求1.编写一个NIO群聊系统,实现服务器端与客户端之间的数据简单通信(非阻塞)2.实现多人群聊3.服务器端:可以监测用户上线,离线,并实现消息转发功能4.客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到)5.目的:进一步理解NIO非阻塞网络编程机制需求:进一步理解 NIO 非阻塞网络编程机制,实现多人群聊编写一个 NIO 群聊系统,实现客户端与客户端的通信需求(非阻塞)服务器端:可以监测用户上线,离线,
2021-07-28 09:50:49 192
原创 第11节网络编程快速入门案例
案例1NIO非阻塞网络编程快速入门案例要求编写一个NIO入门案例,实现服务端与客户端之间简单的数据通信代码实现服务端代码public class Server { public static void main(String[] args) throws IOException { /*1.获取通道,创建NIO通道*/ ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
2021-07-28 09:50:06 105
原创 第10节JavaNIO常用类解析
1.Channel类详解Java NIO的通道类似流,但又有些不同:既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:Channel的实现这些是Java NIO中最重要的通道的实现:FileChannelDatagramChannelSocketChannelServerSocketChan
2021-07-27 11:45:09 486
原创 第9节复用模型三大组件详解
缓冲区概述缓冲区(Buffer):缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel 提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer,如图: 【后面举例说明】由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类。除了Boolean外其他所有的基本数据类型都有缓冲区。Java NIO 中的 Buf
2021-07-27 11:40:13 243
原创 第8节一文读懂Socket
1. 前言最近在研究RDMA的实时流处理系统,其中需要比较RDMA高速网络通信和传统Socket网络通信的传输特点进行比较。所以我们就来总结游戏传统Scoket网络通信的特点,对于一个程序开发人员来说,我们还需要了解Scoket网络通信的底层数据传输知识。2. Socket简介Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主
2021-07-27 11:38:00 459
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人