singleton单例模式

懒汉

第一次调用时实例化

1
2
3
4
5
6
7
8
9
10
11
12
13
public class LHanDanli {
//定义一个私有类变量来存放单例,私有的目的是指外部无法直接获取这个变量,而要使用提供的公共方法来获取
private static LHanDanli dl = null;
//定义私有构造器,表示只在类内部使用,亦指单例的实例只能在单例类内部创建
private LHanDanli(){}
//定义一个公共的公开的方法来返回该类的实例,由于是懒汉式,需要在第一次使用时生成实例,所以为了线程安全,使用synchronized关键字来确保只会生成单例
public static synchronized LHanDanli getInstance(){
if(dl == null){
dl = new LHanDanli();
}
return dl;
}
}

双重判断

不用每次获取对象都加锁
volatile 屏蔽虚拟机代码优化(代码执行顺序),运行效率会成问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SLHanDanli {
private static volatile SLHanDanli dl = null;
private SLHanDanli(){}
public static SLHanDanli getInstance(){
if(dl == null){
synchronized (SLHanDanli.class) {
if(dl == null){
dl = new SLHanDanli();
}
}
}
return dl;
}
}
`

饿汉

加载类内就实例化

常用语法

1
2
3
4
5
sudo  service docker status

sudo service docker stop

sudo service docker start

搜索

1
2
docker search Python

拉取

1
2
docker pull python:2.7

查询

镜像 image

1
2
docker images

容器 container

1
2
3
4
docker ps  #run container

docker ps -a #all container

日志
1
2
3
4
docker logs -f  <container or id>


❯ docker logs -f --tail 10 jenkins
  • -f--follow 选项表示跟随日志输出,即持续显示新的日志条目。
  • -t--timestamps 选项会在每条日志前添加时间戳,以便于追踪日志的时间顺序。

--tail 参数用于限制返回的日志行数,只显示最新的 N 条日志记录

容器信息
1
2
3
4
5
6
7
docker inspect  <id>

#查看指定信息
docker inspect <id> --format '{{.Args}}'

docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID

sed替换查找

参数

1
2
3
sed [options] 'command' file(s) 

sed [options] -f scriptfile file(s)

g 表示行内全面替换。 global 全局
p 表示打印行。 P 打印模板第一行
r 读文件
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) -i :直接修改读取的文件内容,而不是输出到终端
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 子串匹配标记
& 已匹配字符串标记元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。

  • 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
    [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
    [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
    (..) 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers。
    & 保存搜索字符用来替换其他字符,如s/love/&/,love这成love
    < 匹配单词的开始,如:/\ 匹配单词的结束,如/love>/匹配包含以love结尾的单词的行。
    x{m} 重复字符x,m次,如:/0{5}/匹配包含5个0的行。
    x{m,} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。
    x{m,n} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。

批量替换

把目录下所有格式文件内容进行批量替换

1
sed -n "s#/pics/${src#$dest#g"p `grep /pics/${src -rl --include=\*.{yaml,md} $path`

扫描path路径对应格式的文件,把src替换成dest,

sed

-n p 结合打印改变内容,不执行变更

grep

-r 表示查找当前目录以及所有子目录

-l 表示仅列出符合条件的文件名

–include=”*.[ch]” 表示仅查找.c、.h文件

上面不适用大多数情况,推荐下面

–include=*.{yaml,md}

网络概念介绍

http 应用层

在两台计算机相互传递信息时,HTTP规定了每段数据以什么形式表达才是能够被另外一台计算机理解

第一步:在浏览器输入内容(网址)

第二步:浏览器把 域名 发送到DNS上 ,进行解析 得到IP之后链接到指定

​ 服务器 (服务器地址110,102.13.32:80 从浏览器到服务器使用底层TCP/IP)

第三步:实现TCP/IP协议用Socket 用Socket套接字

第四步:服务器端口80监听客户端链接(客户端到服务器端链接)

HTTP 1.0 一个链接发送一个请求

HTTP 1.1 一个链接发送多个请求

get 向服务器 【索取】 数据的一种 请求

一般用于 获取/查询 资源信息

get用于信息获取,而且应该是安全(指非修改信息)和幂等

如:新闻头版不断更新,该操作被认为安全和幂等,从自身角度来看没有改变资源

post 向服务器 【提交】 数据的一种 请求

一般用于 更新 资源信息

​ post表示可能修改服务器上的资源请求

​ 如:评论新闻,提交后站点资源不同,资源被修改

表面现象

​ get请求数据附在URL上; post提交数据放在http包体中

​ get字节限制(1024) 实质是浏览器(和服务器)的限制 ; post理论没有限制

​ post 安全(security)性比 get安全(security)性高

tpc/udp 传输层

规定的是数据应该怎么传输才能稳定且高效的传递与计算机之间。

\ TCP UDP
是否连接 面向连接 面向非连接
传输可靠性 可靠 不可靠
应用场合 传输大量的数据,对可靠性要求较高的场合 传送少量数据、对可靠性要求不高的场景
速度

三次握手

1.客户端发送syn报文,序号seq=X

2.服务发送syn+ack报文,序号seq=y,确认ack=X+1

3.客户端发送ack报文,序号seq=Z ,确认ack=Y+1

四次挥手

  • 首先客户端要关闭连接,先把报文中标志位FIN置为1,然后向服务端发送FIN报文表示要关闭连接.之后客户端进入FIN_WAIT1状态
  • 服务端收到客户端发来的FIN报文之后,内核会自动回复一个ACK给客户端,之后服务端进入CLOSED_WAIT状态.
  • 等待服务端进程调用close函数,也就是等待服务端处理完数据之后,服务端在给客户端发送FIN报文表示请求断开连接,之后服务端进入LAST_ACK状态
  • 客户端收到服务端发来的FIN报文之后,会回复最后一个ACK报文,客户端进入TIME_WAIT状态,2MSL后,进入closed状态 (注意只有主动关闭连接的一方才会有TIME_WAIT状态)
  • 服务端接收到客户端的最后一个ACK报文后,就会进入closed状态,关闭连接

四次挥手的过程可以知道每一方都要发送一个FIN报文和一个ACK报文

  • 客户端发送FIN报文表示请求断开连接,仅仅表示客户端不在发送数据了,但是还能够接收数据
  • 服务端收到客户端的FIN报文后,内核会自动的回复ACK报文,等待服务端进程调用close函数,也就是等待服务端进程处理完数据之后,服务端会向客户端发送FIN报文,表示要断开连接.

服务端发送的ACK报文并不能和FIN报文结合在一起发送,因为要等待服务端进程处理完数据之后才可以关闭连接, 所以是四次挥手.

挥手丢失了,会发生什么

https

HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议

tcpdump

1
2
3
4
5
6
❯ sudo apt install tcpdump

#tcpdump -i <interface> src <source-ip> and port <source-port>
tcpdump -i any src 192.168.1.10 and port 80

❯ sudo apt install wireshark

❯ kubectl get pods -o wide -A | grep -E ‘^NAMESPACE|traefik’
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
default traefik-7d7459bcdc-js5gc 1/1 Running 0 4h42m 121.21.112.116 k8s08

kubectl get pod traefik-7d7459bcdc-js5gc -o json |grep -C 2 containerID
“containerStatuses”: [
{
“containerID”: “containerd://e11f4f9710a330ba375823e849f32880fe7103e12324ae4d2ec3b7dc9879662b“,
“image”: “k8s.org/k8s/traefik:v2.10.4”,
“imageID”: “k8s.org/k8s/traefik@sha256:57b2516b7549c4f59531bb09311a54a05af237670676529249c3c0b8e58ad0f3”

[root@k8s08 ~]# crictl exec e11f4f9710a330ba375823e849f32880fe7103e12324ae4d2ec3b7dc9879662b /bin/sh -c ‘cat /sys/class/net/eth0/iflink’
DEBU[0000] get runtime connection
DEBU[0000] ExecRequest: &ExecRequest{ContainerId:e11f4f9710a330ba375823e849f32880fe7103e12324ae4d2ec3b7dc9879662b,Cmd:[/bin/sh -c cat /sys/class/net/eth0/iflink],Tty:false,Stdin:false,Stdout:true,Stderr:true,}
DEBU[0000] ExecResponse: &ExecResponse{Url:http://127.0.0.1:41659/exec/u51c3Rnf,}
DEBU[0000] Exec URL: http://127.0.0.1:41659/exec/u51c3Rnf
DEBU[0000] StreamOptions: { 0xc000012018 0xc000012020 false }
8
[root@k8s08 ~]# for i in /sys/class/net/veth/ifindex; do grep -l 8 $i; done*
/sys/class/net/veth2e926487/ifindex

[root@k8s08 ~]# sudo tcpdump -i veth91f5a7d7 -w ~/tcpdump.cap

分割

1
tcpdump -r large.pcap -w part1.pcap -c 1000 -s 0 

-c 包的数量

-s 0 捕获整个数据包,不截断包

1
2
tcpdump -r large.pcap -w part1.pcap -c 50000
tcpdump -r large.pcap -c 50000 -j 50000 -w part2.pcap

-j选项后面跟的是跳过的包数,用于分割下一个文件

pyshark库分割
split cap
import pyshark

def split_pcap(input_file, output_prefix, packets_per_file): cap = pyshark.FileCapture(input_file) file_number = 1 with open(f"{output_prefix}{file_number}.pcap", "wb") as f: for packet in cap: f.write(packet.data) if cap.count() % packets_per_file == 0: file_number += 1 f.close() with open(f"{output_prefix}{file_number}.pcap", "wb") as f: continue
# 调用函数 split_pcap('large.pcap', 'part', 50000)

Wireshark

== ! && or

1
tcp.port==80 && ip.src == 192.168.56.116

find查找搜索

查找

find [OPTIONS] [查找起始路径] [查找条件] [处理动作]

[OPTIONS] 忽略

路径

相对 ./

绝对 /

条件

名称

name find / -name mysql

iname find / -iname cmake 忽略大小写

regex find / -regex /docker* 正则模糊查询

size 大小

top排查服务器

top -M

top -c

top -p $pid

排序默认从大到小,R反向排序

M:根据内存排序

P:根据CPU使用排序

T:根据使用时间排序

>:向右移动一列排序

<:向左移动一列排序

界面shift+m (根据内存排序)

第一行top

等同命令uptime

1
2
cs@debian:~/go$ uptime
22:00:22 up 8:59, 1 user, load average: 0.13, 0.32, 0.36

初识jvm

调优参数

选项 Xms,Xmx,newSize,MaxSize ,PermSize, MaxPermSize

Xms(young和old区使用大小)

Xmx(young和old区最大承受大小)

newSize(young区使用大小)

MaxSize(young区最大承受大小)

PermSize(持久区使用大小)

MaxPermSize(持久区最大使用大小)

载入天数...载入时分秒... ,