使用PH实现本地访问Predix数据库

作者:李宏训,前端工程师,GE 数字集团

场景

在Predix上由于安全性考虑,数据服务都是没有外部ip和端口的,因此我们只能在predix上部署的app才能访问,这样会造成一些开发上的不方便。比如我们可能需要把本地的数据导入到postgres上,或者想看一下redis中的数据,这样就会变得很麻烦。

通过代理实现本地访问

我们虽然不能直接在本地访问postgres和redis,但是我们部署到predix上的app是可以访问的,因此我们可以部署一个proxy在predix上,通过这个proxy代理到本地(本地是指自己的电脑),这样就可以实现在本地访问。

这里有一个现成的代理 ph-connectivity-node-service可以直接使用,只需要修改少量配置并部署即可。下面把这个app简称为 ph

ph 的基本工作原理如下图所示,他包含两部分 serverclient ,我们需要把 server 部署到 predix 上,他会直接连接 postgresredis,然后我们在本地启动 clientclient 会通过 socketserver 连接,然后在本地打开 79997998 端口,分别对应 postgresredis,我们可以在本地使用客户端直接连接这两个端口即可。

ph工作原理

下面我们以 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, portpassword

配置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,把其中的 remoteHostremotePort 改成上一步中的 hostport 的值。注意这里的 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是一样的。这里我们只需要把 clientIdsecret 改成和 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,有任何其他问题都可以邮件交流,感谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值