作者:李宏训,前端工程师,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配置
首先我们需要创建一个 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。
配置server
首先打开 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 即可。
配置 client
部署好 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 在本地连接 redis,命令如下
redis-cli -p 7998 -a xxxxx
其中 xxxx 是 redis 的密码,看到如下信息表示我们连接成功:
然后可以在 redis-cli 中进行测试:
获取 ph
ph 是一个由GE工程师开发的应用,暂时没有开源,有需要的童鞋可以联系 hongxun.li@ge.com,有任何其他问题都可以邮件交流,感谢。
本文介绍了一种在Predix平台上通过部署代理应用实现本地访问数据服务如Postgres和Redis的方法。利用ph-connectivity-node-service服务,通过配置server和client两端实现数据服务的安全访问。
3114

被折叠的 条评论
为什么被折叠?



