Docker-仓库
参考文献
仓库
使用docker login登录镜像仓库
使用docker push repository/image推送镜像到镜像仓库
仓库镜像搭建选择
Distribution
Harbor
Docker-镜像
参考文献
极客时间 <<Kubernetes入门实战课>>
镜像
Docker镜像是静态的分层管理的文件组合,镜像底层的实现依赖于联合文件系统(UnionFS)
镜像是如何构建的
构建过程不是由Docker客户端进行的,而是将整个目录的文件上传到Docker守护进程并在那里进行的.Docker客户端和守护进程不要求在同一台机器上.
如果要在一台Linux系统中使用Docker,客户端就运行在你的宿主操作系统上,但是守护进程运行在一个虚拟机内.由于构建目录中的文件都被上传到了守护进程中,如果包含了大量的大文件而且守护进程不在本地运行,上传过程会花费更多的时间.
注意: 不要在构建目录中包含任何不需要的文件,这样会减慢构建的速度-尤其当Docker守护进程运行在一个远端机器的时候.
镜像分层
镜像不是一个大的二进制块,而是由多层组成,不同镜像可能会共享分层,这会让存储和传输变得更加高效.所有组成基础镜像的分层只会被存储一次.拉取镜像的时候,Docker会独立下载一层.一些分层可能已经存储在机器上了,所以Docker只会下载未被存储的分层.
构建镜 ...
Docker-容器
参考文献
容器
容器是基于镜像创建的可运行实例,并且单独存在.
一个镜像可以创建多个容器.
容器实现原理
chroot
chroot是在Unix和Linux系统的一个操作,针对正在运作的软件行程和它的子进程,改变它外显的根目录.一个运行在这个环境下,经由chroot设置根目录的程序,它不能够对这个指定根目录之外的文件进行访问动作,不能读取,也不能更改它的内容.
即chroot就是可以改变某进程的根目录,使这个程序不能访问目录之外的其他目录
Namespace
Namespace 是 Linux 内核的一项功能,该功能对内核资源进行隔离,使得容器中的进程都可以在单独的命名空间中运行,并且只可以访问当前容器命名空间的资源.Namespace 可以隔离进程 ID、主机名、用户 ID、文件名、网络访问和进程间通信等相关资源.
Docker 主要用到以下五种命名空间.
pid namespace:用于隔离进程 ID.
net namespace:隔离网络接口,在虚拟的 net namespace 内用户可以拥有自己独立的 IP、路由、端口等.
mnt namespace:文 ...
MongoDB-基础知识
参考文献
MongoDB 逻辑备份工具mongodump
MongoDB 日常运维实践总结
Mongo进阶 - 系统设计:模式构建
ObjectId
MongoDB中存储的每个文档都必须有一个_id键._id的值可以是任何类型,但其默认为ObjectId.在单个集合中每个文档的_id值都必须是唯一的,以确保集合中每个文档都可以被唯一标记.
ObjectId占用了12字节的存储空间,可以用24个十六进制数字组成的字符串来表示:每字节存储两个数字.
ObjectId的12字节是按照如下方式生成的:
120 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 时间戳 | 随机值 | 计数器(起始值随机)
ObjectId的前4字节是从Unix纪元开始以秒为单位的时间戳.
时间戳与接下来的5字节组成,在秒级别的粒度上提供了唯一性
因为时间戳在前,所以ObjectId将大致按照插入的顺序进行排列.
ObjectId中接下来的5字节是一个随机值,最后3字节是一个计数器,以一个随机数作为起始值 ...
RPC框架架构设计
参考文献
RPC架构设计
RPC 框架包含三个最重要的组件,分别是客户端、服务端和注册中心。在一次 RPC 调用流程中,这三个组件是这样交互的:
服务端在启动后,会将它提供的服务列表发布到注册中心,客户端向注册中心订阅服务地址;
客户端会通过本地代理模块 Proxy 调用服务端,Proxy 模块收到负责将方法、参数等数据转化成网络字节流;
客户端从服务列表中选取其中一个的服务地址,并将数据通过网络发送给服务端;
服务端接收到数据后进行解码,得到请求信息;
服务端根据解码后的请求信息调用对应的服务,然后将调用结果返回给客户端
Netty源码分析-服务器端启动流程
参考文献
黑马Netty
环境
基于Netty4.1.92.Final-SNAPSHOT
启动流程
Netty中启动流程大致处理步骤
12345678910111213141516171819202122//1 netty 中使用 NioEventLoopGroup (简称 nio boss 线程)来封装线程和 selectorSelector selector = Selector.open(); //2 创建 NioServerSocketChannel,同时会初始化它关联的 handler,以及为原生 ssc 存储 configNioServerSocketChannel attachment = new NioServerSocketChannel();//3 创建 NioServerSocketChannel 时,创建了 java 原生的 ServerSocketChannelServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.confi ...
Netty-Handler&Pipeline
参考文献
ChannelPipline
每一个新创建的Channel都将会被分配一个新的ChannelPipeline.这项关联是永久性的;Channel 既不能附加另外一个ChannelPipeline,也不能分离其当前的.在 Netty 组件的生命周期中,这是一项固定的操作,不需要开发人员的任何干预.
ChannelPipeline可以看作ChannelHandler的容器载体,它是由一组ChannelHandler实例组成的,内部通过双向链表将不同的ChannelHandler链接在一起.ChannelPipeline 的双向链表分别维护了HeadContext 和 TailContext 的头尾节点。我们自定义的ChannelHandler会插入到Head和Tail 之间.
保存 ChannelHandler的List,用于处理或拦截Channel的入站事件和出站操作**,它们的执行顺序是由它们被添加的顺序所决定的**.
ChannelPipeline 实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及 Channel中各个的 Chann ...
Netty-Future&Promise
参考文献
Future & Promise
在异步处理时,经常用到这两个接口
首先要说明Netty中的Future与JDK中的Future同名,但是是两个接口,Netty的Future继承自JDK的Future,而Promise又对NettyFuture进行了扩展
JDKFuture只能同步等待任务结束(或成功、或失败)才能得到结果
NettyFuture可以同步等待任务结束得到结果,也可以异步方式得到结果,但都是要等任务结束
NettyPromise不仅有nettyFuture的功能,而且脱离了任务独立存在,只作为两个线程间传递结果的容器
功能/名称
JDK Future
Netty Future
Promise
cancel
取消任务
-
-
isCanceled
任务是否取消
-
-
isDone
任务是否完成,不能区分成功失败
-
-
get
获取任务结果,阻塞等待
-
-
getNow
-
获取任务结果,非阻塞,还未产生结果时返回 null
-
await
-
等待任务结束,如果任务失败,不会抛异常,而是通 ...
Netty-Channel
参考文献
Channel
与Socket类似
Netty 网络通信的组件,能够用于执行网络 I/O 操作.Channel 为用户提供
当前网络连接的通道的状态(例如是否打开?是否已连接?
网络连接的配置参数 (例如接收缓冲区大小)
提供异步的网络 I/O 操作(如建立连接,读写,绑定端口),异步调用意味着任何 I/O 调用都将立即返回,并且不保证在调用结束时所请求的 I/O 操作已完成.
调用立即返回一个 ChannelFuture 实例,通过注册监听器到 ChannelFuture 上,可以 I/O 操作成功、失败或取消时回调通知调用方.
支持关联 I/O 操作与对应的处理程序.
不同协议、不同的阻塞类型的连接都有不同的 Channel 类型与之对应,下面是一些常用的 Channel 类型:
NioSocketChannel: 异步的客户端 TCP Socket 连接.
NioServerSocketChannel: 异步的服务器端 TCP Socket 连接.
NioDatagramChannel: 异步的 UDP 连接.
NioSctpChannel: 异步的客 ...
Netty-EventLoop
参考文献
如何解决 Netty Channel.isWritable 返回 false
Netty Best Practices
Channel、EventLoop和 EventLoopGroup
一个EventLoopGroup包含一个或者多个EventLoop;
一个EventLoop在它的生命周期内只和一个Thread绑定;
所有由EventLoop处理的I/O 事件都将在它专有的Thread上被处理;
一个Channel在它的生命周期内只注册于一个EventLoop;
一个EventLoop可能会被分配给一个或多个Channel.
EventLoop事件循环对象
EventLoop是一种事件等待和处理的程序模型,可以解决多线程资源消耗高的问题.
EventLoop通用运行模式为,当事件发生时,应用程序都会将产生的事件放入事件队列中,然后EventLoop会轮询从队列中取出事件执行或者将事件分发给相应的事件监听者执行.事件执行的方式通常分为立即执行,延后执行,定期执行.
EventLoop本质是一个单线程执行器(同时维护了一个Selector),里面有run方 ...