好多东西

lddd 后端 2019-05-13

## **Docker相关概念**

镜像与容器

lc467b13215f264015

34e9707eb2bd4f42a3d60c50c08315 

镜像是静态的,是只读的,而容器是动态的,里面运行着我们的程序,可以修改文件,但是这些操作并不会影响镜像,容器是通过镜像创建的,在镜像上面加了一个可写的层,一个镜像可以创建多个容器

## **Dockerfile中的相关命令**

* `FROM image:version`  

表示基于哪个镜像:版本

* `MAINTAINER name`  

表示作者是name

* `ADD srv.jar app.jar`  

表示将服务jar包复制到镜像中,并重命名为app.jar

* `EXPOSE 8080`  

运行镜像容器,并监听8080端口

* `ENTRYPOINT ["java", "-jar", "/app.jar"]`  

启动时运行命令: `java -jar app.jar`

* `ENV pathVar path`  

指定容器的环境变量pathVar为path

* `RUN command`  

设置镜像编译时执行的命令,一般用来创建文件的存储文件夹

## **Docker相关命令**

1 编译镜像:

* `docker build -t dahua/srvname .`  

其中,`dahua/srvname` 是镜像名称,最后一个点.是用来指明dockerfile的位置,.表示在当前目录下面

//  public static String APPID = "lcef24d4ed2c244ffa";
// public static String SECRET = "f9493308c052461ca080d6c415abd4";

2 运行镜像为容器

* `docker run -d --name containername -p 8080:8080 dahua/srvname`  

`-d` 表示执行完上面这个命令之后控制台不会被阻塞

`--name` 是容器的名称

`-p innerport:outerport` 将镜像内部端口innerport暴露为本机的端口outerport

最后是镜像名称



* `docker-machine ssh default`  

进入docker默认安装的虚拟机



# Linux常用命令

* `cat [-n] file`  

打印file文件中的内容, `-n` 选项用来显示行号  

* `more file`  

用来分页展示file文件的内容,按下Enter显示下一行,Space显示下一页,F键显示下一屏幕,B键显示上一屏幕

* `less file`  

功能比 `more` 命令更加丰富,支持内容查找,比如通过 `/GET` 可以查找字符串GET,并且高亮显示

* `tail [-n line -f] file`  

参数 `-n line` 指定显示文件尾部多少行,`-f` 让 `tail` 程序不退出,持续显示文件新增的内容

* `head [-n]`  

作用类似于 `tail` 命令,但是是显示头几行

* `sort [-k col -t char -n -r] file`  

`sort` 命令默认按照字符顺序,也就是ascii码的大小,`-n` 指定按照数字顺序,`-n -r` 指定按照数字逆序,`-k col -t char -n` 是将文件行按`char`字符分割成多列,然后按第`col`列的数字顺序进行排序

* `wc [-l -c -L -w]`  

字符统计命令,`-l` 统计总共多少行,`-c` 显示文件字节数量,`-L` 显示文件最长的行长度,`-w` 查看文件有多少行

* `sort file | unqi [-c -u -d]`  

`uniq` 用来显示经过去重统计后的结果,`-c` 是在结果前显示出现次数,`-u` 只显示出现一次的结果,`-d` 显示出现多次的结果,`sort` 是排序,可以使用sort指令中的选项。

* `grep [-c] str file`  

`grep` 命令是用来查找字符串,`-c` 是用来显示查找到的行数,`str` 可以为正则表达式,`'G.*T'`就是查找G开头,T结尾的字符串

* `find path -name file`  

查找路径 `path` 下名为file的文件,`*.txt` 为查找txt结尾的文件,`find . -print` 为递归打印当前目录

* `whereis execfile`  

`whereis` 可以方便定位可执行文件 `execfile` 的位置

* `tar [-cf] [-tf] [-xf] tfile sfile1 sfile2`  

`tar` 命令用来打包和解包文件,`-cf` 是将文件sfile1 sfile2打包为tfile, `-tf` 是用来查看压缩包里面的内容,`-xf` 是将file解压

* `awk '{print $1}' access.log | head 10`  

* `awk '/google/{print $5,$6}' access.log | head -10`  

* `awk 'length($0)>40{print $3}' access.log | head -10`  

* `akw '{line = sprintf("method: %s, response: %s", $3, $7);   print line}' access.log | head -10`  

* `awk -f testawk access.log | head -10`  



* `uptime`  

查看系统的load, load的计算是平均时间内,每个spu的运行队列中的平均线程个数,处于运行队列中的线程满足:1.没有处于io等待状态;2.没有主动进入等待状态,也就是没有调用wait操作;3.没有被终止

* `top [-p processid]`

`-p` 选项是查看id为processid的进程的消耗情况,结果中,Cpu(s)后面跟的就是各个状态下CPU所消耗时间的占比:1.用户时间(us),表示CPU执行用户进程所占用的时间,占比越高越好;2.系统时间(sy)表示CPU在内核态所花费的时间,sy占比高时,说明系统设计存在不合理;3.Nice时间(ni),表示系统在调整进程优先级的时候所花费时间;4.空闲时间(id),系统空闲,等待进程运行,id越低越好;5.等待时间(wa),cpu等待io操作所花费的时间,过长则存在不合理;6.硬件中断处理时间(hi);7.软件中断处理时间(si);8.丢失时间(st)st占比较高,说明 当前虚拟机与宿主机器山的其他虚拟机的cpu争用较为频繁。

* `df -h`  

`-h` 表示按单位格式化输出磁盘剩余空间

* `df -d 1 -h dir`  

`-d` 指定递归深度,这里是`1`,只列出下一级目录,`-h` 按文件大小格式输出

* `iostat -d -k`  

`-d` 表示查看磁盘使用情况,-k以kb显示,Device表示设备,tps表示每秒处理的io请求数量,kb_read/s表示每秒从设备读取的数据量,kb_wrtn/s表示每秒向设备写入的数据量,kb_read表示读取的数据总量,kb_wrtn表示写入数据总量

* `free -m`  

内存使用情况,包括物理内存和虚拟内存,注意free不代表可用的内存小,他会从cached或者buffers内存要,应用更加关注swap的虚拟内存,该内存消耗过多则意味着物理内存不够用,这个会严重影响系统性能,可以利用`vmstat` 命令查看swap的io状态,其中swap的si表示每秒从磁盘交换到内存的数据量

* `ps`

* `nohup`


#### RPC通信协议

* 真正的协议在设计时要考虑并发连接的处理,及性能、可靠性、数据完整性、编码、可扩展性、数据压缩、缓存、等复杂细节。



#### 关系型数据库和HBase的缺点与优点:

* 前者支持关联查询、排序、关联查询等复杂查询,而后者不支持,但是却可以通过构建搜索引擎来实现

* 后者更适合海量数据的存储和处理,分布式的hbase支持多节点同时写入,显著提高写入性能,而且是可扩展的



# 相关面试题

## BIO/NIO和AIO

首先清楚解释两个概念

阻塞和非阻塞:

同步和异步:

BIO是阻塞IO,也就是主线程负责接收请求,然后对于每个请求创建一个线程处理该请求,线程的开销较大

NIO是非阻塞IO

AIO是异步IO



# Netty基础相关问题

## 讲讲Netty的特点?

## BIO、NIO和AIO的区别?

## NIO的组成是什么?

## 如何使用 Java NIO 搭建简单的客户端与服务端实现网络通讯?

## 如何使用 Netty 搭建简单的客户端与服务端实现网络通讯?

## 讲讲Netty 底层操作与 Java NIO 操作对应关系?

## Channel 与 Socket是什么关系,Channel 与 EventLoop是什么关系,Channel 与ChannelPipeline是什么关系?

## EventLoop与EventLoopGroup 是什么关系?

## 说说Netty 中几个重要的对象是什么,它们之间的关系是什么?

# 粘包与半包和分隔符相关问题

## 什么是粘包与半包问题?

## 粘包与半包为何会出现?

## 如何避免粘包与半包问题?

## 如何使用包定长 FixedLengthFrameDecoder 解决粘包与半包问题?原理是什么?

## 如何使用包分隔符 DelimiterBasedFrameDecoder 解决粘包与半包问题?原理是什么?

## Dubbo 在使用 Netty 作为网络通讯时候是如何避免粘包与半包问题?

## Netty框架本身存在粘包半包问题?

## 什么时候需要考虑粘包与半包问题?

# WebSocket 协议开发相关问题

## 讲讲如何实现 WebSocket 长连接?

## 讲讲WebSocket 帧结构的理解?

## 浏览器、服务器对 WebSocket 的支持情况

## 如何使用 WebSocket 接收和发送广本信息?

## 如何使用 WebSocket 接收和发送二进制信息?

# Netty源码分析相关问题

## 服务端如何进行初始化?

## 何时接受客户端请求?

## 何时注册接受 Socket 并注册到对应的 EventLoop 管理的 Selector ?

## 客户端如何进行初始化?

## 何时创建的 DefaultChannelPipeline ?

## 讲讲Netty的零拷贝?

# Netty的线程模型

## Reactor单线程模型

所有的IO操作都同一个NIO线程处理,包括接收连接和请求相应,Reactor使用的是异步非阻塞IO

该模型存在一些问题:

1.

2.

3.

## Reactor多线程模型

有专门的一个线程来处理请求连接,并由一组NIO线程来处理网络的读写,一个NIO可以处理多个链路的请求,一个请求只能由一个NIO线程处理

存在的问题:

在百万高并发连接的请求下,单个Acceptor线程存在性能瓶颈



## Reactor主从多线程模型



用来接收请求的不再是一个单独的线程,而是一个AcceptorNIO线程池,Acceptor接收到客户端请求并处理完成后(可能包含接入认证等),将创建的新的SocketChannel注册到IO线程池(subReactor,负责网络读写的线程池),由它负责网络读写和编解码,Acceptor线程池只负责客户端登陆、握手和安全认证,一旦链路建立成功,subReactor负责后续操作



## netty中的线程模型





## netty中对空轮询bug的修复策略

1.对Selector的select操作周期进行统计

2.每完成一次空的select操作就进行一次计数

3.在某个周期内如果连续N次空轮询,则说明触发bug

4.重建Selector让系统恢复正常

Apipost 私有化火热进行中

评论