日期: 2021/12/14 天气:晴

    1. 'use strict';
    2. const cluster = require('cluster');
    3. const app = require('../app');
    4. const debug = require('debug')('pay-api:server');
    5. const http = require('http');
    6. // 可用CPU数量
    7. const workers = require('os').cpus().length;
    8. let server;
    9. const Application = {
    10. start: function () {
    11. if (cluster.isMaster) {
    12. // 启动集群
    13. for (let i = 0; i < workers; i++) {
    14. cluster.fork();
    15. }
    16. cluster.on('listening', function (worker, address) {
    17. console.log(`listening: worker ${worker.process.pid} ${address.port}`);
    18. });
    19. cluster.on('exit', function (worker, code, signal) {
    20. console.log('worker %s died, restarting...', worker.process.pid);
    21. cluster.fork();
    22. });
    23. } else {
    24. // 启动线程
    25. // 设置端口
    26. let port = normalizePort(process.env.PORT || '3000');
    27. app.set('port', port);
    28. // 创建服务器
    29. server = http.createServer(app);
    30. // 监听端口
    31. server.listen(port);
    32. server.on('error', onError);
    33. server.on('listening', onListening);
    34. }
    35. }
    36. };
    37. /**
    38. * 序列化端口号
    39. */
    40. function normalizePort (val) {
    41. let port = parseInt(val, 10);
    42. if (isNaN(port)) {
    43. // named pipe
    44. return val;
    45. }
    46. if (port >= 0) {
    47. // port number
    48. return port;
    49. }
    50. return false;
    51. }
    52. /**
    53. * 错误处理
    54. */
    55. function onError (error) {
    56. if (error.syscall !== 'listen') {
    57. throw error;
    58. }
    59. let bind = typeof port === 'string'
    60. ? 'Pipe ' + port
    61. : 'Port ' + port;
    62. // handle specific listen errors with friendly messages
    63. switch (error.code) {
    64. case 'EACCES':
    65. console.error(bind + ' requires elevated privileges');
    66. process.exit(1);
    67. break;
    68. case 'EADDRINUSE':
    69. console.error(bind + ' is already in use');
    70. process.exit(1);
    71. break;
    72. default:
    73. throw error;
    74. }
    75. }
    76. /**
    77. * 监听服务
    78. */
    79. function onListening () {
    80. let addr = server.address();
    81. let bind = typeof addr === 'string'
    82. ? 'pipe ' + addr
    83. : 'port ' + addr.port;
    84. debug('Listening on ' + bind);
    85. }
    86. Application.start();