Ria*_*ith 15 google-app-engine node.js socket.io google-cloud-platform
我使用socket.io创建了我的第一个node.js应用程序.具体来说,我实现了socket.io发布的聊天示例.它在当地完美运作.然后我尝试将其部署到Google App Engine(对节点进行一些代码调整).
一切都显示出节点部分运行良好.但是,聊天不起作用,表明socket.io部分无法正常工作.您可以在此处查看已部署的应用(和页面源).
我还需要做什么吗?yaml或json文件中有什么东西?
yaml内容:
runtime: nodejs
vm: true
skip_files:
- ^(.*/)?.*/node_modules/.*$
Run Code Online (Sandbox Code Playgroud)
json内容:
{
"name": "Chaty",
"description": "chatrooms app",
"version": "0.0.1",
"private": true,
"license": "Apache Version 2.0",
"author": "McChatface",
"engines": {
"node": "~4.2"
},
"scripts": {
"start": "node app.js",
"monitor": "nodemon app.js",
"deploy": "gcloud preview app deploy"
},
"dependencies": {
"express": "^4.13.4",
"socket.io": "^1.4.6"
}
}
Run Code Online (Sandbox Code Playgroud)
简而言之,这不能在生产中完成,而且似乎正在进行中.正确的架构是在谷歌计算引擎上有一个聊天服务器,如这里所述.
但是作为在谷歌应用程序引擎上使用socket.io的概念证明非常类似于webockets的google appengine示例中所示.
如果是socket.io,请在服务器端执行以下步骤.下面的代码片段.
socket.io在服务器端更改
var app_chat = require('express')();
var server1 = require('http').Server(app_chat);
var io = require('socket.io')(server1);
server1.listen(65080);
io.on('connection', function (socket) {
console.log('user connected');
socket.on('chat_message', function (data) {
console.log('client sent:',data);
socket.emit('chat_message', 'Server is echoing your message: ' + data);
});
});
Run Code Online (Sandbox Code Playgroud)
按命令打开防火墙
gcloud compute firewall-rules create default-allow-websockets \
--allow tcp:65080 \
--target-tags websocket \
--description "Allow websocket traffic on port 65080"
Run Code Online (Sandbox Code Playgroud)
我希望Google很快能够提供一个可立即投入生产的解决方案,因为这将成为任何PaaS-arsenal的关键装备.
谷歌已经使用的WebSockets的示例应用在这里,你需要做到以下几点得到它正常工作:
这应该是它(不要相信我的话,这是我在对文档进行一些研究后能够找到的),希望它有所帮助!
var METADATA_NETWORK_INTERFACE_URL = 'http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip';
function getExternalIp (cb) {
var options = {
url: METADATA_NETWORK_INTERFACE_URL,
headers: {
'Metadata-Flavor': 'Google'
}
};
request(options, function (err, resp, body) {
if (err || resp.statusCode !== 200) {
console.log('Error while talking to metadata server, assuming localhost');
return cb('localhost');
}
return cb(body);
});
}
Run Code Online (Sandbox Code Playgroud)
gcloud compute firewall-rules create default-allow-websockets \
--allow tcp:65080 \
--target-tags websocket \
--description "Allow websocket traffic on port 65080"
Run Code Online (Sandbox Code Playgroud)
GAE 对持久套接字连接的支持已于 2019 年 2 月推出!
为了使这项工作,你需要使用flex
环境并修改你app.yaml
的包括session_affinity
:
network:
session_affinity: true
Run Code Online (Sandbox Code Playgroud)
请注意,我仍然需要打开端口 65080 才能使其正常工作,但我不需要其他任何更改。
阅读 deets:
https://cloud.google.com/appengine/docs/flexible/nodejs/using-websockets-and-session-affinity
小智 6
这个 app.yaml 配置对我有用:
runtime: nodejs
env: flex
manual_scaling:
instances: 1
network:
session_affinity: true
Run Code Online (Sandbox Code Playgroud)
我通过这个命令启用了防火墙规则:
gcloud compute firewall-rules create default-allow-websockets --allow
tcp:65080 --target-tags websocket --description "Allow websocket
traffic on port 65080"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9281 次 |
最近记录: |