DevilKing's blog

冷灯看剑,剑上几分功名?炉香无需计苍生,纵一穿烟逝,万丈云埋,孤阳还照古陵

0%

原文链接

采用go.mod文件进行管理

GO111MODULE环境变量的设置

  • off,不使用新特性,继续使用gopath
  • on,使用新特性,只根据go.mod来查找
  • auto或未设定,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
qiang@DESKTOP-2A835P9 MINGW64 /d/code/gopath/src/gitlab.luojilab.com/zeroteam/ddkafka (module)
$ export GO111MODULE=on #開啟modules

qiang@DESKTOP-2A835P9 MINGW64 /d/code/gopath/src/gitlab.luojilab.com/zeroteam/ddkafka (module)
$ go mod init gitlab.luojilab.com/zeroteam/ddkafka # 建立go.mod
go: creating new go.mod: module gitlab.luojilab.com/zeroteam/ddkafka

qiang@DESKTOP-2A835P9 MINGW64 /d/code/gopath/src/gitlab.luojilab.com/zeroteam/ddkafka (module)
$ ls # 真的建立了,google大法好呀
README.md go.mod models.go mq_interface.go sarama segmentio
qiang@DESKTOP-2A835P9 MINGW64 /d/code/gopath/src/gitlab.luojilab.com/zeroteam/ddkafka (module)
$ cat go.mod # 看看裡面什麼東西
module gitlab.luojilab.com/zeroteam/ddkafka
qiang@DESKTOP-2A835P9 MINGW64 /d/code/gopath/src/gitlab.luojilab.com/zeroteam/ddkafka (module)
$ cd segmentio/
qiang@DESKTOP-2A835P9 MINGW64 /d/code/gopath/src/gitlab.luojilab.com/zeroteam/ddkafka/segmentio (module)
$ go test # 執行一下看看
go: finding github.com/segmentio/kafka-go latest
go: finding github.com/golang/glog latest
go: downloading github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
go: downloading github.com/segmentio/kafka-go v0.0.0-20180716203113-48c37f796910
qiang@DESKTOP-2A835P9 MINGW64 /d/code/gopath/src/gitlab.luojilab.com/zeroteam/ddkafka/segmentio (module)
$ go list -m
gitlab.luojilab.com/zeroteam/ddkafka

go.mod文件可以通過require,replace和exclude語句使用的精確軟體包集。

  • require語句指定的依賴項模組
  • replace語句可以替換依賴項模組
  • exclude語句可以忽略依賴項模組

go mod的一些命令

  • go mod init:初始化modules
  • go mod download:下載modules到本地cache
  • go mod edit:編輯go.mod文件,選項有-json、-require和-exclude,可以使用幫助go help mod edit
  • go mod graph:以文字模式列印模組需求圖
  • go mod tidy:刪除錯誤或者不使用的modules
  • go mod vendor:生成vendor目錄
  • go mod verify:驗證依賴是否正確
  • go mod why:查詢依賴

可以看出,还是兼容了vendor的用法,同时慢慢支持一些依赖树的构成

原文链接

优雅关闭部分:

就是服务器要关闭了, 会拒绝新的连接,但是老的连接不会被强制关闭,而是 会等待一定时间, 等待客户端主动关闭, 除非客户端一直没有关闭, 到了预设的超时时间才进行服务器端关闭.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func (srv *Server) shutdown(shutdown chan chan struct{}, kill chan struct{}) {
// Request done notification
done := make(chan struct{})
shutdown <- done

srv.stopLock.Lock()
defer srv.stopLock.Unlock()
if srv.Timeout > 0 {
select {
case <-done:
case <-time.After(srv.Timeout):
close(kill)
}
} else {
<-done
}
// Close the stopChan to wake up any blocked goroutines.
srv.chanLock.Lock()
if srv.stopChan != nil {
close(srv.stopChan)
}
srv.chanLock.Unlock()
}

当进行shutdown部分,会关闭stopChan这个channel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
func main() { // goroutine 0
goAway := false
go func() { // goroutine 1
sig := <-sigs
fmt.Println("I have to go...", sig)
goAway = true
srv.Stop(10 * time.Second)
}()

for{
if (goAway){
break
}
fmt.Println("Started")
srv = &graceful.Server{
Timeout: 10 * time.Second,
NoSignalHandling: true,

ConnState: func(conn net.Conn, state http.ConnState) {
fmt.Println( "Connection ", state)
},

Server: &http.Server{
Addr: ":8001",
Handler: userRouter,
},
}

go srv.ListenAndServe() // goroutine 2
<- srv.StopChan() // goroutine 0
fmt.Println("Stopped")
}
}

得到stopChan channel关闭的消息,这样for循环又可以启动,重新接收相关的请求,重新初始化部分

可以在同一个socket对上, 共享同一个监听套接字地址, 然后在多个goroutine中执行accept函数,也就是http server中的accept操作

1
2
3
4
5
6
l := ln.(*net.TCPListener)
newFile, _ := l.File()
fmt.Println(newFile.Fd())

anotherListener, _ := net.FileListener(newFile)

套接字部分,转换给文件描述符

关于fork部分的操作

1
2
3
4
cmd := exec.Command(os.Args[0], "-graceful")
cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
cmd.ExtraFiles = []*os.File{newFD}
cmd.Run()

原文链接

关于一些机器的优化部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
sudo cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sudo sysctl -p /etc/sysctl.d/kubernetes.conf

设置系统时区部分

1
2
3
4
5
6
7
8
9
# 调整系统 TimeZone
sudo timedatectl set-timezone Asia/Shanghai

# 将当前的 UTC 时间写入硬件时钟
sudo timedatectl set-local-rtc 0

# 重启依赖于系统时间的服务
sudo systemctl restart rsyslog
sudo systemctl restart crond