Go 后端 SDK 架构与起步
Go 后端 SDK 架构与起步
架构说明
新版极目桌面已全面推荐采用 Go 语言模板(如 c8rv-master)作为微应用后端。
后端作为独立常驻进程运行,通过 Unix Domain Socket 与极目桌面主进程建立长连接,并通过 JSON-RPC 2.0 协议对外暴露服务。
1. 核心工作原理
+-----------------------------+
| 极目桌面前端 (Vue3 / $gm) |
+-----------------------------+
| (内部桥接)
v
+-----------------------------+
| 极目桌面桌面核心主进程 |
+-----------------------------+
| (Unix Domain Socket)
v
+-----------------------------+
| Go 后端进程 (simplejrpc-go) |
| c8rv-master 架构 |
+-----------------------------+- 服务启动与握手:极目桌面负责拉起微应用后端二进制文件,并传递 Socket 路径或监听参数。
- Ping 探活:主进程每隔固定周期调用
ping方法,后端返回"pong"保证连接健康。 - 方法分发:前端发起
$gm.request,主进程将 JSON-RPC 请求打给 Unix Socket,Go 后端路由器分发至对应Handler处理并返回响应。
2. 目录结构规范(c8rv-master 模板)
backend/
├── cmd/
│ └── main.go # 应用程序入口、Unix Socket 监听、路由装配
├── internal/
│ ├── config/ # 配置结构与解析 (YAML / ENV)
│ ├── i18n/ # 多语言国际化 (zh_CN, en_US)
│ ├── server/ # Socket 监听器与 SimpleJRPC 启动封装
│ ├── model/ # 数据结构模型
│ ├── service/ # 业务逻辑接口与具体实现
│ └── transport/
│ ├── rpc/ # JSON-RPC 请求/响应 DTO 与 Handler
│ │ ├── dto/ # 校验规则与入参定义
│ │ └── handler/ # JSON-RPC 路由与方法绑定
│ └── adapter/ # 协议适配与错误映射
├── conf/
│ └── config.yaml # 运行时默认配置
├── go.mod # 依赖管理
└── Makefile # 多平台静态编译与交叉编译脚本3. main.go 入口核心实现
package main
import (
"context"
"flag"
"log"
"os"
"os/signal"
"syscall"
"github.com/dushixiang/simplejrpc-go"
"app/internal/config"
"app/internal/service"
"app/internal/transport/rpc/handler"
)
var (
socketPath = flag.String("socket", "/tmp/gmssh-app.sock", "Unix domain socket path")
confPath = flag.String("conf", "./conf/config.yaml", "Path to config file")
)
func main() {
flag.Parse()
// 1. 加载应用配置
cfg, err := config.Load(*confPath)
if err != nil {
log.Fatalf("failed to load config: %v", err)
}
// 2. 初始化核心业务服务
demoSvc := service.NewDemoService(cfg)
// 3. 注册 JSON-RPC 路由与处理函数
s := simplejrpc.NewServer()
// 必选:极目桌面心跳探活
s.RegisterFunc("ping", func(ctx context.Context) (string, error) {
return "pong", nil
})
// 业务接口注入
handler.RegisterAppHandlers(s, demoSvc)
// 4. 监听 Unix Domain Socket 并处理优雅退出
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
go func() {
<-sigChan
log.Println("shutting down backend server...")
_ = os.Remove(*socketPath)
os.Exit(0)
}()
log.Printf("backend listening on unix://%s\n", *socketPath)
if err := s.ListenUnix(*socketPath); err != nil {
log.Fatalf("server exited: %v", err)
}
}4. 开发与调试快速步骤
# 1. 进入后端工程
cd backend
# 2. 检查依赖
go mod tidy
# 3. 本地编译
make build
# 产出二进制文件 build/backend
# 4. 手动运行测试(传入调试 socket)
./build/backend -socket /tmp/test-app.sock下一步请查阅:
