建立私有的name service

本文介绍了一种轻量级的NameService设计方案,利用线程池处理DNS请求,避免阻塞函数带来的性能瓶颈。该方案支持并发处理大量DNS请求,并通过自定义协议确保请求响应的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言: 

  提到dns, 让我们想起了 gethostbyname, gethostbyaddr 相关函数(线程安全的使用 getaddrinfo, getnameinfo), 不过他们都是阻塞函数, 在服务器端我们还需要额外构建一个异步环境来支撑这些阻塞函数运行.

 

需求:

   这几天因为这些阻塞函数导致我想编写一个内部的name service, 开始想得是直接在引擎里开多个线程可以并发的处理大量的dns请求, 不过后来发现这样不但和引擎耦合起来, 还导致了引擎不必要的臃肿(每个引擎额外的开了几个线程), 干脆独立出来, 也方便了其他引擎使用 :)

 

实现原理:

   实现起来非常简单, 大体说下思路, 首先创建好一个线程池, 视CPU核心个数调整线程数量, 可以稍微多一些, 毕竟这些函数都是阻塞函数, 多开几条线程也无所谓并不会引起过高的上下文切换, 线程池自带一个队列缓冲未能执行的请求.

 

   诸如getaddrinfo返回的结果通过协议封装发回给原请求端即可, 不过这里需要注意的是, 协议的定制时需要额外增加一个参数用来记录请求的ID, 因为请求端的逻辑为异步, 为了保证能正确唤醒具体的corotinue, 引擎在发送请求时需要为每次请求生成一个ID, 这里使用内部自增ID或者uuid均可.

 

   协议方面, 引擎使用c+lua搭建, 支持4种协议格式: byte, word, dword, string. 像dns这种复杂的结构直接转换成JSON格式传递过去, 对端再解析即可~ , 这样做的好处是既简化了协议层的复杂度, 又让协议层具备了良好的扩展能力.

   因为name service是上下文无关, 所以其逻辑具备高度并行性,  完全无锁, ok, 简单精巧, 稳定高效.

### 如何搭建 Gitea 私有仓库 #### 安装依赖项 为了确保顺利安装 Gitea,在开始前需确认已安装必要的软件包。对于基于 Debian 的系统,如 Ubuntu 或 Raspbian,可以通过以下命令安装所需依赖: ```bash sudo apt update && sudo apt install -y curl git sqlite3 ``` 这一步骤确保了 Git 和数据库支持已经到位[^1]。 #### 下载并安装 Gitea 获取最新版本的 Gitea 可执行文件,并将其放置于合适位置以便全局调用。以 Raspberry Pi (ARM 架构) 为例: ```bash wget -O gitea https://dl.gitea.io/gitea/1.19.0/gitea-1.19.0-linux-armv6 chmod +x gitea sudo mv gitea /usr/local/bin/ ``` 上述操作下载了适用于 ARM v6 处理器架构的预编译二进制文件,并赋予其可执行权限[^4]。 #### 初始化配置向导 首次启动 Gitea 将触发 Web 浏览器中的初始设置流程。通过浏览器访问 `http://<your-ip>:3000` 来完成基本参数设定,比如 SSH 地址应填写 IP 或者域名而非 URL 形式的 HTTP 路径。 #### 设置为服务自动运行 为了让 Gitea 在重启后能继续工作,建议创建 systemd service 文件实现开机自启功能。编辑 `/etc/systemd/system/gitea.service` 并加入如下内容: ```ini [Unit] Description=Gitea (Git with a cup of tea) After=syslog.target After=network.target After=mysql.service mariadb.service mysqld.service postgresql.service [Service] RestartSec=2s Type=simple User=git Group=git WorkingDirectory=/home/git ExecStart=/usr/local/bin/gitea web -c /home/git/custom/conf/app.ini Environment=USER=git HOME=/home/git Restart=always [Install] WantedBy=multi-user.target ``` 保存退出后启用该服务单元: ```bash sudo systemctl daemon-reload sudo systemctl enable --now gitea ``` 此过程使得 Gitea 成功注册成为 Linux 系统的服务之一,从而保障长期稳定运作。 #### 配置 Nginx 反向代理(可选) 如果希望使用更友好的网址代替默认端口号,则可通过 Nginx 实现反向代理。编辑站点配置文件 `/etc/nginx/sites-available/default` 添加相应规则指向 Gitea 后台监听地址: ```nginx server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:3000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` 最后记得测试语法正确性并重新加载 Nginx 生效变更: ```bash sudo nginx -t sudo systemctl reload nginx ``` 这样便完成了从外部网络到内部应用层之间的安全连接建立
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值