egg icon indicating copy to clipboard operation
egg copied to clipboard

Single mode 启动没有端口可以访问服务

Open wanqiuz opened this issue 4 years ago • 6 comments

What happens?

因为应用要run在容器之中,所以希望用单进程模型运行。 启动single mode,但是没有端口可以访问服务。

const egg = require('egg');
egg.start();

Mini Showcase Repository(REQUIRED)

https://github.com/wanqiuz/single-mode-egg

Context

  • Node Version: 10.16.0
  • Egg Version: 2.25.0
  • Plugin Name:
  • Plugin Version:
  • Platform: Linux

wanqiuz avatar Dec 29 '19 10:12 wanqiuz

`翻了一下egg和egg-core的代码,没找到启动server监听端口的代码,记得启动服务监听端口是egg-cluster实现的,直接egg.start()的话好像就是简单地实例化了一个application,话说我有点好奇为什么应用run在容器里面,所以就希望用单进程模型运行。

dark-tone avatar Dec 30 '19 15:12 dark-tone

`翻了一下egg和egg-core的代码,没找到启动server监听端口的代码,记得启动服务监听端口是egg-cluster实现的,直接egg.start()的话好像就是简单地实例化了一个application,话说我有点好奇为什么应用run在容器里面,所以就希望用单进程模型运行。

查过端口号了,直接egg.start()的话确实不会监听端口。所以阅读代码后,直接用Application创建服务并监听端口了。 不好意思,可能没有讲清楚。因为我们的应用是在k8s环境中运行,所以诸如利用多核处理器,负载均衡,健康检查,失败重启都被sidecar的组件给取代了。而且其他schedule job之类的也可以用k8s原生的功能去做。所以希望使用的框架尽可能轻量化。

wanqiuz avatar Dec 31 '19 09:12 wanqiuz

是的,这块比较粗糙,现在需要自己来启动,k8s 里面如果作为一号进程就不需要 egg-cluster 这样的守护进程了。

popomore avatar Jan 03 '20 12:01 popomore

`翻了一下egg和egg-core的代码,没找到启动server监听端口的代码,记得启动服务监听端口是egg-cluster实现的,直接egg.start()的话好像就是简单地实例化了一个application,话说我有点好奇为什么应用run在容器里面,所以就希望用单进程模型运行。

查过端口号了,直接egg.start()的话确实不会监听端口。所以阅读代码后,直接用Application创建服务并监听端口了。 不好意思,可能没有讲清楚。因为我们的应用是在k8s环境中运行,所以诸如利用多核处理器,负载均衡,健康检查,失败重启都被sidecar的组件给取代了。而且其他schedule job之类的也可以用k8s原生的功能去做。所以希望使用的框架尽可能轻量化。

@wanqiuz 请问你最后是如何实现监听的?

zjy01 avatar Mar 16 '20 04:03 zjy01

`翻了一下egg和egg-core的代码,没找到启动server监听端口的代码,记得启动服务监听端口是egg-cluster实现的,直接egg.start()的话好像就是简单地实例化了一个application,话说我有点好奇为什么应用run在容器里面,所以就希望用单进程模型运行。

查过端口号了,直接egg.start()的话确实不会监听端口。所以阅读代码后,直接用Application创建服务并监听端口了。 不好意思,可能没有讲清楚。因为我们的应用是在k8s环境中运行,所以诸如利用多核处理器,负载均衡,健康检查,失败重启都被sidecar的组件给取代了。而且其他schedule job之类的也可以用k8s原生的功能去做。所以希望使用的框架尽可能轻量化。

@wanqiuz 请问你最后是如何实现监听的?

@zjy01 下面这样子的(省去了一些)

async function start(options = {}) {
  const Application = require('egg').Application;
  options.baseDir = options.baseDir || process.cwd();
  options.mode = 'single';
  options.port = options.port || 8080;

  const application = new Application(Object.assign({}, options));
  application.ready(() => application.listen(options.port, '0.0.0.0', () => {
    console.log(`Server started in ${process.argv[2]} environment, and listened at ${options.port}.`);
  }));
  await application.ready();

  // emit egg-ready message in agent and application
  application.messenger.broadcast('egg-ready');
}

wanqiuz avatar Mar 17 '20 02:03 wanqiuz

关键参考: https://cloud.tencent.com/document/product/583/37278

这里记录一下阿里云Severless(CustomRuntime) + Nas的调用方式:

boostrap(需要可执行权限)

#!/bin/bash
path=/mnt/**/alpha/  # `**`内填写函数计算服务绑定的Nas地址
export EGG_HOME=$path # 一定要写这个环境变量, 否则会报错
export EGG_SERVER_ENV=alpha # 指定env
node $path/index.js

index.js

'use strict';
const egg = require('egg');

egg.startCluster({
  baseDir: __dirname,
  mode: 'single',
  port: 9000
})

ronesam avatar Mar 26 '20 09:03 ronesam