使用仓颉开发一个简单的http服务
使用仓颉开发一个简单的http服务
- linux下安装仓颉
- 新建项目
- 运行一下
- 构建一下
- 引入stdx
- 编写代码
- 改造
- 增加controller/user.cj
- 在main.cj中使用
- 构建
- nginx代理
linux下安装仓颉
之前在windows下体验了下。
linux安装文档
tar xvg cangjie-sdk-linux-x64-1.0.1.tar.gz
等待完成后
执行
source cangjie/envsetup.sh
验证
cjc -v
新建项目
新建一个文件夹,初始化cjpm项目
cjpm init
和我们之前在windows的是一样的。
运行一下
cjpm run
构建一下
cjpm build
那么构建完成后,如何运行呢?
进入bin目录下。看到有一个可执行文件,main。执行它。
引入stdx
下载构建好的stdx
https://gitcode.com/Cangjie/cangjie-stdx-bin/releases?isLogin=1
根据你的型号选择,如果你不知道,可以执行cjc -v
比如我的
下载完成后,解压。
在cjpm.toml引入使用。
stdx使用文档
这里的target.后面的就是你执行cjc -v
获取到的。如上。
"${CANGJIE_STDX_PATH}"
换成你的stdx的解压路径。
[target.x86_64-unknown-linux-gnu][target.x86_64-unknown-linux-gnu.bin-dependencies]path-option = ["${CANGJIE_STDX_PATH}"]
比如我的
[package]cjc-version = "1.0.1"name = "pj1"description = "nothing here"version = "1.0.0"target-dir = ""src-dir = ""output-type = "executable"compile-option = ""override-compile-option = ""link-option = ""package-configuration = {}[dependencies][target.x86_64-unknown-linux-gnu][target.x86_64-unknown-linux-gnu.bin-dependencies]path-option = ["/www/cj/pj1/linux_x86_64_llvm/dynamic/stdx"]
编写代码
package pj1
import stdx.net.http.*
import stdx.log.*// 1. 构建 Server 实例
let server = ServerBuilder().addr("127.0.0.1").port(3000).build()func startServer(): Unit {// 2. 注册请求处理逻辑server.distributor.register("/hello", {httpContext =>httpContext.responseBuilder.body("Hello Cangjie!")})server.logger.level = LogLevel.OFF// 3. 启动服务server.serve()
}main () {spawn {startServer()}sleep(Duration.second)// 主线程无限休眠,不退出(进程保持存活,服务器持续监听)while (true) {sleep(Duration.second * 3600) // 每小时醒一次,继续循环}
}
测试请求
改造
src下新增目录
scr/controller/
新增文件
src/controller/user.cj
增加controller/user.cj
package pj1.controller
import stdx.net.http.*public func UserController (distributor:HttpRequestDistributor) {distributor.register("user", {httpContext =>let request = httpContext.requestlet username = request.form.get("username")httpContext.responseBuilder.body("{'code':2000,'message':'注册成功,欢迎您 ${username}'}")})
}
在main.cj中使用
package pj1
import stdx.net.http.*
import stdx.log.*
import pj1.controller as Controller// 1. 构建 Server 实例
let server = ServerBuilder().addr("0.0.0.0").port(3000).build()func startServer(): Unit {Controller.UserController(server.distributor);// 2. 注册请求处理逻辑server.distributor.register("/hello", {httpContext =>httpContext.responseBuilder.body("Hello Cangjie!")})server.logger.level = LogLevel.OFF// 3. 启动服务server.serve()
}main () {spawn {startServer()}sleep(Duration.second)// 主线程无限休眠,不退出(进程保持存活,服务器持续监听)while (true) {sleep(Duration.second * 3600) // 每小时醒一次,继续循环}
}
启动
cjpm run
请求
构建
cjpm build
在 target/release/bin/
目录下
新增脚本 start.sh
#!/bin/bash# 配置区:修改为你的目标执行文件路径
TARGET_EXEC="./main" # 要运行的文件(绝对路径或相对路径)
LOG_FILE="./process.log" # 程序输出日志
PID_FILE="./process.pid" # 进程PID记录文件# 检查进程是否运行
is_running() {if [ -f "$PID_FILE" ]; thenlocal pid=$(cat "$PID_FILE")# 检查PID对应的进程是否存在if ps -p "$pid" > /dev/null 2>&1; thenreturn 0 # 运行中elserm -f "$PID_FILE" # PID文件存在但进程已死,清理文件fifireturn 1 # 未运行
}# 启动进程(后台运行)
start_process() {if is_running; thenecho "程序已在运行中(PID: $(cat "$PID_FILE"))"return 0fi# 后台启动程序,重定向输出到日志,记录PIDnohup "$TARGET_EXEC" > "$LOG_FILE" 2>&1 &local pid=$! # 获取后台进程PIDecho "$pid" > "$PID_FILE"echo "程序已启动(PID: $pid),日志文件: $LOG_FILE"
}# 停止进程(强制终止)
stop_process() {if ! is_running; thenecho "程序未在运行"return 0filocal pid=$(cat "$PID_FILE")kill "$pid" # 发送终止信号# 等待进程退出(最多等5秒)for i in {1..5}; doif ! ps -p "$pid" > /dev/null 2>&1; thenrm -f "$PID_FILE"echo "程序已停止(PID: $pid)"return 0fisleep 1done# 如果5秒后仍未退出,强制杀死kill -9 "$pid"rm -f "$PID_FILE"echo "程序已强制停止(PID: $pid)"
}# 暂停进程(发送暂停信号)
pause_process() {if ! is_running; thenecho "程序未在运行"return 0filocal pid=$(cat "$PID_FILE")# 发送暂停信号(SIGSTOP)kill -19 "$pid"echo "程序已暂停(PID: $pid)"
}# 恢复进程(发送继续信号)
resume_process() {if ! is_running; thenecho "程序未在运行"return 0filocal pid=$(cat "$PID_FILE")# 发送继续信号(SIGCONT)kill -18 "$pid"echo "程序已恢复运行(PID: $pid)"
}# 重启进程(先停止再启动)
restart_process() {echo "正在重启程序..."stop_processstart_process
}# 查看进程状态
status_process() {if is_running; thenlocal pid=$(cat "$PID_FILE")# 检查进程是否处于暂停状态local state=$(ps -p "$pid" -o state --no-headers)if [ "$state" = "T" ]; thenecho "程序状态:暂停中(PID: $pid)"elseecho "程序状态:运行中(PID: $pid)"fielseecho "程序状态:未运行"fi
}# 帮助信息
show_help() {echo "用法: $0 [命令]"echo "命令列表:"echo " start - 启动程序(后台运行)"echo " stop - 停止程序"echo " restart - 重启程序"echo " pause - 暂停程序"echo " resume - 恢复暂停的程序"echo " status - 查看程序状态"echo " help - 显示帮助信息"
}# 解析参数
case "$1" instart)start_process;;stop)stop_process;;restart)restart_process;;pause)pause_process;;resume)resume_process;;status)status_process;;help)show_help;;*)echo "未知命令: $1"show_helpexit 1;;
esac
执行
./start.sh start
nginx代理
简单配置