作者:李宏训,前端工程师,GE 数字集团
在Predix上由于安全性考虑,数据服务都是没有外部ip和端口的,因此我们只能在predix上部署的app才能访问,这样会造成一些开发上的不方便。比如我们可能需要把本地的数据导入到postgres上,或者想看一下redis中的数据,这样就会变得很麻烦。
我们虽然不能直接在本地访问postgres和redis,但是我们部署到predix上的app是可以访问的,因此我们可以部署一个proxy在predix上,通过这个proxy代理到本地(本地是指自己的电脑),这样就可以实现在本地访问。
这里有一个现成的代理 ph-connectivity-node-service
可以直接使用,只需要修改少量配置并部署即可。下面把这个app简称为 ph
。
ph
的基本工作原理如下图所示,他包含两部分 server
和 client
,我们需要把 server
部署到 predix 上,他会直接连接 postgres
和 redis
,然后我们在本地启动 client
,client
会通过 socket
和 server
连接,然后在本地打开 7999
和 7998
端口,分别对应 postgres
和 redis
,我们可以在本地使用客户端直接连接这两个端口即可。
下面我们以 redis 为例来介绍如何进行配置
首先我们需要创建一个 redis
服务,并绑定到自己的app上,具体方法请参阅predix相关文档。
然后通过 cf env appname
可以获取 redis
的配置信息。
{
"VCAP_SERVICES": { "redis": [ { "credentials": { "host": "10.120.x.xx", "password": "xxx-xxx-xxx", "port": 8888 }, "label": "redis", "name": "apphub-redis", "plan": "shared-vm", "provider": null, "syslog_drain_url": null, "tags": [ "pivotal", "redis" ], "volume_mounts": [] } ] } }
其中我们需要的就是 credential
中的三个字段 host
, port
和 password
。
首先打开 manifest.yml
文件,
--- applications:
- name: ph-proxy-server buildpack: https://github.com/cloudfoundry/buildpack-nodejs.git
memory: 128M
disk_quota: 128M
command: DEBUG=ph:server node example/server
stack: cflinuxfs2
把其中的 name
字段改成我们需要名字,或者不改也可以。
然后打开 example/server.js
:
var PHServer=require('./../ph-server');
//localPort 9898 represents the listener on the amazon host whereas remoteAddress/remotePort indicate the destination of the forwarding
var phs=new PHServer({
localPort: process.env.PORT || 443,
clients: {
'postgres':{
secret: '1234',
remoteHost: 'x.x.x.x',
remotePort: 8888
},
'redis':{
secret: '1234',
remoteHost: 'x.x.x.x',
remotePort: 9999
}
}
});
这里默认创建了两个连接,我们这里只看 redis
,把其中的 remoteHost
和 remotePort
改成上一步中的 host
和 port
的值。注意这里的 secret
并不是 redis 的密码,这是 server 认证 client
的密码,只要和 client.js
中对应的 secret
保持一致即可,这样可以防止别人连接你的server。
然后我们就可以把 server 部署到 predix上了,直接执行 cf push
即可。
部署好 server 之后,我们再配置 client
。打开 example/client.js
文件:
var PHClient=require('./../ph-client');
//port# 7999 is making the websocket call to amazon. the remote address is assigned to amazon with the remote port 3001
const serviceHost = 'ph-proxy-server.run.aws-jp01-pr.ice.predix.io'
var postgres = new PHClient({
localPort: 7999,
serviceHost: serviceHost,
servicePort: 443,
clientId: 'postgres',
secret: '1234',
// proxy: 'http://3.20.128.6:88' // you can config proxy here, it will read env.http_proxy by default
});
var redis = new PHClient({
localPort: 7998,
serviceHost: serviceHost,
servicePort: 443,
clientId: 'redis',
secret: '1234'
});
server部署好之后会有一个 url,请确保上面代码中的 serviceHost
和部署的url是一样的。这里我们只需要把 clientId
和 secret
改成和 server.js 中一样的值即可。
然后执行 npm run client
即可在本地启动一个代理.
然后就可以使用 redis-cli
在本地连接 redis
,命令如下
redis-cli -p 7998 -a xxxxx
其中 xxxx 是 redis 的密码,看到如下信息表示我们连接成功:
然后可以在 redis-cli
中进行测试:
ph 是一个由GE工程师开发的应用,暂时没有开源,有需要的童鞋可以联系 [email protected]
,有任何其他问题都可以邮件交流,感谢。