知行

行无限,路漫漫

简介 Air是一款Go语言热加载工具,它能实时监听文件或目录变化,并自动完成编译与重启程序操作,从而显著提升开发阶段的工作效率。 在开发过程中,要实现实时加载功能,这个困扰肯定不止你一人遇到。秉持着“一定有现成解决方案”的信念,我进行了全网搜索,并果真在GitHub上找到了一款工具——Air。它具备以下特性:  彩色日志输出 支持自定义构建或二进制命令 允许忽略子目录 启动后可继续监听新增目录 优...
阅读全文 »

有时,我们需要在容器内访问宿主机上的某个服务,例如MySQL。 方案一 使用 host 模式启动服务。 在默认情况下,Docker服务会采用桥接模式启动。这意味着Docker容器会使用Docker自建的虚拟网络,容器之间可以进行通信,但无法直接访问宿主机的网络服务。如果想要让宿主机或其他网络主机访问,Docker容器需要暴露自身服务的端口映射。 然而,如果采用host模式启动,Docker容...
阅读全文 »

 期望:脚本 + 要同步的文件名称 说明:/usr/local/bin 中存在脚本,root 用户可以在任意地方执行   编写脚本  vim /usr/local/bin/rsync-script  #!/bin/bash # 脚本说明:将指定的文件或目录同步到集群的所有或指定节点。  # 常量定义 MASTER_NUM=3  # master 节点数量 NODE_NUM=2   # node 节...
阅读全文 »

SSH 安全级别 SSH提供两种级别的安全验证 第一种级别(基于口令的安全验证)  只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。  第二种级别(基于密匙的安全验证)  需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务...
阅读全文 »

Golang

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
// 将服务启动放入协程中,当接收到终止信号后,主进程销毁,协称也会随着销毁
go func() {
zap.S().Infof("%s 服务启动! http://%s:%d", global.Config.Name, global.Config.Host, global.Config.Port)
if err := r.Run(fmt.Sprintf(":%d", global.Config.Port)); err != nil {
zap.S().Panicf("服务启动失败, port:%d,err:%s", global.Config.Port, err.Error())
}
}()

// 注册服务
registerClient := consul.NewRegistryClient(global.Config.Consul.Host, global.Config.Consul.Port)
sc := global.Config
serviceId := fmt.Sprintf("%s", uuid.NewV4())
err := registerClient.Register(sc.Host, sc.Port, sc.Name, serviceId, sc.Consul.Tags)
if err != nil {
zap.S().Fatalw("服务注册失败", err.Error())
}
zap.S().Infow("服务注册成功")

// 优雅的退出程序
quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
zap.S().Infow("服务注销中...")
// 等待信号,如果接受到信号执行以下内容
err = registerClient.DeRegister(serviceId)
if err != nil {
zap.S().Fatalw("服务注销失败", err.Error())
}
zap.S().Infow("服务注销成功")

Python

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import sys
import os

import grpc
import logging
import signal
from concurrent import futures
from loguru import logger

# 因为在终端上运行会找不到根目录所以需要指明项目根目录
BASE_PATH = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))
sys.path.insert(0, BASE_PATH)

from user_srv.proto import user_pb2, user_pb2_grpc
from user_srv.handler.user import UserService


# 处理中断函数
def on_exit(signal, frame):
logger.info("grpc server exit")

# 服务注销逻辑.......

sys.exit(0)


def serve():
logger.add("logs/user_srv_{time}.log")
# 多线程启动
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# 注册服务
user_pb2_grpc.add_UserServicer_to_server(UserService(), server)
# 端口
server.add_insecure_port("[::]:50051")
# 监听退出信号
"""
windows下支持的信号是有限的:
SIGINT ctrl+C终端
SIGTERM kill发出的软件终止
"""
signal.signal(signal.SIGINT, on_exit)
signal.signal(signal.SIGTERM, on_exit)

logger.info(f"启动服务:http://127.0.0.1:50051")
server.start()
server.wait_for_termination()


if __name__ == "__main__":
logging.basicConfig()
serve()

阅读全文 »

ja-netfilter 2023.02 我们通常会使用防火墙来阻断这些软件的恶意访问。但防火墙也不是万能的,比如:跨平台问题、https下无法精准阻断某个url访问、部分防火墙不能阻断dns访问。 于是就有了我今天开源的这个项目:ja-netfilter! 下载 ja-netfilter 链接: https://pan.baidu.com/s/12JvOGTm6wmVfuf8TB0Ro7Q?pw...
阅读全文 »

Portainer

Portainer 是 Docker 的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作 (包括上传下载镜像,创建 容器等操作)、事件日志显示、容器控制台操作、Swarm 集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

官方站点:https://www.portainer.io/

Portainer-ce 汉化

阅读全文 »
0%