说明
最近官方出了统一网关,经过一段时间的探索,也是有了一些简单的认识,可以将第三方应用适配成 http://192.168.1.10:5666/app/{appname}这种格式,也就是不走tcp没有端口号,而是生成Unix Socket文件来监听,这个文件是程序自己生成的,每次启动都会删除旧的socket文件,然后生成新的socket给飞牛的统一网关来监听转发,同时这个也支持了websocket这种方式,避免了长轮询这种落后方式,本来是想做一版用systemctl或docker的code-server的适配,但是遇到的坑太多就放弃了。
过程
刚开始时我也觉得很简单,它的code-server有一个--socket参数只要指定路径,然后用飞牛的统一网关加载一下就可以,然后就报GET http://192.168.x.xxx:5666/app/coder 404(Not Found)的错误,查问了Ai好久终于得到原因是:code-serv它默认认为自己运行在/目录下,所以加载的前面加了个app/coder就找不到静态文件了,然后用一个中间层socket来转发,代码如下:
const http = require("http");
const httpProxy = require("http-proxy");
const fs = require("fs");
const BASE_PATH = '/app/coder';
const GATEWAY_SOCKET ="/var/apps/coder/target/gateway.sock";
const CODESERVER_SOCKET ="/var/apps/coder/target/code-server.sock";
// 如果旧socket存在则删除
if (fs.existsSync(GATEWAY_SOCKET)) {
fs.unlinkSync(GATEWAY_SOCKET);
}
//创建代理对象,把收到的请求转发给 code-server.sock
const proxy = httpProxy.createProxyServer({
target: { socketPath: CODESERVER_SOCKET },
ws: true
});
//创建HTTP Server
const server = http.createServer((req, res) => {
// 解析 URL
const parsedUrl = new URL(req.url, 'http://localhost');
let pathname;
try {
pathname = decodeURIComponent(parsedUrl.pathname);
} catch (e) {
res.writeHead(400, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'URL解码失败' }));
return;
}
// 路径规范化
if (pathname === BASE_PATH) {
res.writeHead(301, { 'Location': BASE_PATH + '/' });
res.end();
return;
}
console.log(`[coder] 收到请求: ${pathname}`);
if (pathname.startsWith(BASE_PATH)) {
req.url = pathname.substring(BASE_PATH.length) || '/';
console.log(`[coder] 去掉前缀后路径: ${ req.url}`);
}
proxy.web(req, res);//转发 HTTP 到code-server.sock
});
// 监听文件路径而非端口
server.listen(GATEWAY_SOCKET, () => {
// 赋予权限
fs.chmodSync(GATEWAY_SOCKET, '0666');
console.log(`Server listening on ${GATEWAY_SOCKET}`);
});
成功的解决了静态文件加载失败的问题,然而code-server用的大多是websocket,然后就出现了下面的情况,有页面但是websocket连接不了,可以是我菜的问题,问了ai半天都不能解决,连接始终不成功,如下所示:

后面我又找到了openvscode,官网是https://github.com/gitpod-io/openvscode-server,它与code-server类似,它支持base-path也就是运行目录可以改变--socket-path xxx.sock与--server-base-path /app/openvscode这样就可以跑通了。
成果
可以在这https://github.com/ctllo-bit/openvscode的build目录下载fpk,这是一个docker版本,将宿主机的target目录映射给容器,然后容器在这目录写入socket文件,目前只可以target目录,其实我觉得如果映射给target\server目录下更方便一点,这样子就可以用到飞牛的统一网关了,在不登录的情况下,就如下图所示:

登陆成功,就和官方应用一样同用5556端口了

完。。