cyl的博客

记录所思

创建Dockerfile

1
vim Dockerfile
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
FROM golang:latest

# 安装软件
RUN sed -i "s/deb.debian.org/repo.huaweicloud.com/" /etc/apt/sources.list && \
apt-get update && \
apt-get install -y jq unzip && \
rm -rf /var/lib/apt/lists/*

# 安装 protoc
RUN protoc_version=$(wget -qO- -t1 -T2 "https://api.github.com/repos/protocolbuffers/protobuf/releases/latest" | jq -r '.tag_name') && \
wget https://ghproxy.com/https://github.com/protocolbuffers/protobuf/releases/download/${protoc_version}/protoc-${protoc_version:1}-linux-x86_64.zip && \
unzip protoc-${protoc_version:1}-linux-x86_64.zip bin/protoc -d $(go env GOPATH) && \
rm -f protoc-${protoc_version:1}-linux-x86_64.zip

# go 代理
RUN go env -w GO111MODULE=on && go env -w GOPROXY=https://goproxy.cn,direct

# 安装 go-micro
RUN go install github.com/go-micro/cli/cmd/go-micro@latest

# go-micro 创建工程
RUN go-micro new service helloworld && \
cd helloworld && \
sed -i '/micro.Version(version),/a\\t\tmicro.Address(":8080"),' main.go && \
make init proto tidy

CMD cd helloworld && go run main.go

构建

1
docker build -t go-micro-helloworld .

运行

1
docker run -d -p 8080:8080 go-micro-helloworld

测试

1
curl -XPOST -H 'Content-Type: application/json' -H 'Micro-Endpoint: Helloworld.Call' -d '{"name": "John"}' http://localhost:8080

下载网址

Linux 安装

1
2
3
4
go_version=1.20.4
wget https://mirrors.aliyun.com/golang/go${go_version}.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go${go_version}.linux-amd64.tar.gz && rm -rf go${go_version}.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin:'$(/usr/local/go/bin/go env GOPATH)/bin/go >>~/.profile && . ~/.profile

Windows 卸载

1
2
3
4
5
6
@REM go pkg + bin
rd /s /q %USERPROFILE%\go
@REM go build cache
rd /s /q %USERPROFILE%\AppData\Local\go-build
@REM go env
rd /s /q %USERPROFILE%\AppData\Roaming\go

设置代理

1
2
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

下载 protoc

下载 protoc 并放到

Linux

1
2
3
4
5
6
7
$(go env GOPATH)/bin

# 下载命令
protoc_version=$(wget -qO- -t1 -T2 "https://api.github.com/repos/protocolbuffers/protobuf/releases/latest" | jq -r '.tag_name')
wget https://ghproxy.com/https://github.com/protocolbuffers/protobuf/releases/download/${protoc_version}/protoc-${protoc_version:1}-linux-x86_64.zip
unzip protoc-${protoc_version:1}-linux-x86_64.zip bin/protoc -d $(go env GOPATH)
rm -f protoc-${protoc_version:1}-linux-x86_64.zip

Windows

1
%GOPATH%\bin

安装 protoc-gen-go

1
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

安装 protoc-gen-micro

1
go install github.com/go-micro/generator/cmd/protoc-gen-micro@latest

生成 proto

1
protoc --proto_path=. --micro_out=. --go_out=:. proto/helloworld.proto

安装扩展

在vscode扩展中搜索并安装 Go

image-20230603112402029

安装工具

  1. 在vscode的 ctrl+shift+p 中选择 Go: Install/Update Tools

    image-20230603114021899

  2. 全选并确定

    image-20230603114000309

待全部安装成功后, vscode就变成了一个go开发的IDE了

Go Micro CLI

Go Micro CLI是一个用于开发go-micro项目的命令行工具

安装

1
go install github.com/go-micro/cli/cmd/go-micro@latest

创建项目

创建服务端项目

1
go-micro new service helloworld

准备

下载依赖

1
2
cd helloworld
make proto tidy

运行

  • go-micro

windows下会失败

1
go-micro run
  • go
1
go run main.go

测试

  • go-micro

windows下会失败

1
go-micro call helloworld Helloworld.Call '{"name": "John"}'
  • curl

windows下使用powershell/cmd会失败, 请使用 Git Bash,

1
curl -XPOST -H 'Content-Type: application/json' -H 'Micro-Endpoint: Helloworld.Call' -d '{"name": "John"}' http://localhost:xxxx

联想

2012年10月 ~ 2017年4月

支付宝二手回收100元


小米笔记本Air(13.3英寸尊享版)

2017年4月 ~ 至今

换过 键盘, 电池


感觉电脑性能很差, 但是不影响日常使用, 再等等吧

游戏服务器

游戏服务器 由于需要和客户端实时双向交互, 需要自己精细管理每一个连接

游戏服逻辑

反向代理

将海量的客户端的连接请求, 分流给后端的多个网关

网关服务器

每台服务器上都有一个网关服务器, 专门用于和客户端保持长连接, 这样部署多台服务器, 就可以分散长连接, 当地址暴露时被攻击时可以通过扩容来抵御

每个发来的消息直接转发给登录服务器

网关管理服务器

每次收到消息时验证合法性

记录每个网关的连接的用户id, 如果没有, 则只能有登录操作, 如果有并且已经登录过, 则可以通知对应网关踢号

登录后将用户基本信息告知客户端, 其他消息转发给 消息队列MQ

消息队列 MQ

消息注册分发中心, 这样一个消息, 可以被多个服务消费

游戏管理服务器

提供除游戏中的其他服务 如永不重复的房间号, 找到用对的游戏服务器进行游戏, 游戏服务器扩容后的匹配分配

如果玩家登录后发现他已在某个游戏中, 则通知对应游戏重连

游戏服务器

提供游戏的服务

reids

针对多个服对相同数据的请求, 做的缓存. 避免同一请求重复请求数据库, 比如登录时会有多个服, 多次请求同样的玩家信息

env

  • 变量保存的地方

可以保存一些 公共值变量 方便统一设置和调整

比如 域名 用户名 邮箱

k8s

cri

  • k8s 使用的 镜像

特殊的程序 将程序按照特殊方式打包后的产生

crictl

  • k8s 使用的 镜像 管理工具

如 下载, 运行, 关闭, 删除

pod

  • k8s对外提供服务的应用

包含多个镜像

通过运行多个镜像来对外提供一种服务

k3s

  • 跨服务器的 pod 管理工具

像管理一台服务器上的 pod 一样, 管理多台服务器

helm

  • chart 管理工具

一个 chart 包含多个 pod, 他们共同提供一种服务

helm 可以像管理一个 pod 一样, 管理 chart

nfs

  • 跨服务器的共享文件夹

多个服务器的共享文件夹 保持一致

kubernetes-dashboard

  • 管理看板

HTTPS

cert-manager

  • 自动生成和续签 https 证书

traefik

  • 反向代理

只需声明就能使用的反向代理

比nginx配置更简单

harbor

  • 镜像仓库

docker

  • 镜像 生成上传 的工具

平时还可以测试一些简单应用 使用和删除无痕

持续部署

jenkins

  • 自动部署工具

根据git仓库的webhook通知, 执行Jenkinsfile命令, 构建和部署对应的服务

gitea

  • git仓库

监控

prometheus

  • 服务器监控

loki

  • 日志监控

grafana

  • 监控看板

命令

生成 Makefile

1
cmake .

编译 Makefile

1
make

CMakeLists.txt 命令解释

设置项目名以及项目语言

1
project(test)

设置 cmake 版本的要求

1
cmake_minimum_required(VERSION 2.8)

打印一些信息到终端

1
message(CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR})

设置变量

1
2
3
4
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_C_COMPILER gcc)
set(CMAKE_C_FLAGS -gdwarf-2 -g -D_LINUX -DGAME_MODULE -m64 -std=c++2a -lstdc++ -lsomelibrary -fPIC)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/build/)

设置头文件路径

1
2
3
include_directories(${CMAKE_SOURCE_DIR})
include_directories(${CMAKE_SOURCE_DIR}/xxx)
include_directories(${CMAKE_SOURCE_DIR}/xxx/xxx)

指定链接库路径

1
2
3
link_directories(${CMAKE_SOURCE_DIR})
link_directories(${CMAKE_SOURCE_DIR}/xxx)
link_directories(${CMAKE_SOURCE_DIR}/xxx/xxx)

添加源文件

1
aux_source_directory(. dir_root)

链接库

1
link_libraries(MySharedLib)

生成目标文件

1
add_executable(test ${dir_root})

链接 库文件

1
target_link_libraries(test MySharedLib)

示例

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
project(test)
cmake_minimum_required(VERSION 2.8)

message (CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR})

set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_C_COMPILER gcc)
set(CMAKE_C_FLAGS -gdwarf-2 -g -D_LINUX -DGAME_MODULE -m64 -std=c++2a -lstdc++ -lsomelibrary -fPIC)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/build/)

include_directories(${CMAKE_SOURCE_DIR})
include_directories(${CMAKE_SOURCE_DIR}/include/)
include_directories(${CMAKE_SOURCE_DIR}/include/boost)
include_directories(${CMAKE_SOURCE_DIR}/LBase)
include_directories(${CMAKE_SOURCE_DIR}/LFrame)

link_directories(${CMAKE_SOURCE_DIR}/lib/linux)

aux_source_directory(. dir_root)
aux_source_directory(./Game/HandlerRobot dir_game_handler_robot)
aux_source_directory(./Game dir_game)

add_executable(test
${dir_root}
${dir_game_handler_robot}
${dir_game})

target_link_libraries(test lframe lbase -lboost_thread -lboost_system -lpthread)
0%