# 服务间内网调用

云托管支持服务间以内网域名的方式进行内网调用,提供安全性高、时延低、效率高的内网通讯服务。每个服务开启内网访问后,均会分配一个内网域名。因分配内网域名需当前服务重新部署发布才能生效,故在开启内网方式时,将自动触发一次部署发布。

# 操作路径

# 1.新建服务

新建服务时,可直接开启内网访问,部署发布后将自动分配内网域名。

# 2.已有服务

前往「服务列表-目标服务-服务设置」中进行开启 点击开启,二次弹窗确认后,将自动触发一次服务的部署发布,不需要再次点击页面下方的「保存」按钮。发布完成后,将自动获取内网域名。

# 示例

注意:本示例中部署的 Redis 仅保留在容器临时存储中,不具有持久化能力,重新部署/扩缩容后会丢失数据,请勿在有持久化存储需求场景下使用。

在本教程中会展示如何结合内网调用能力,在云托管中部署一个 Redis 数据库,并使用其作为 Express 服务器的 Session 存储。

# 第一步:创建项目

创建一个文件夹(express-redis-session),并初始化 npm 项目。

mkdir express-redis-session && cd express-redis-session
npm init -y

# 第二步:安装 Redis 和 Express 依赖

直接执行安装命令,等待依赖安装完成。

npm i -S express redis connect-redis express-session

# 第三步:创建 Redis 服务并调整规格

在云托管控制台,点击「新建服务」,创建一个名为 redis 的服务,开启内网访问,关闭公网访问。

部署时,选择「从地址拉取镜像」,镜像地址填 redis:latest,端口填 6379

点击发布,发布完成后,点击「服务设置」,修改容器规格为 0.25 CPU,修改实例数量为 1-1,保存修改,等待发布完成即可。

# 第四步:复制内网域名,创建 index.js

redis 服务内复制内网域名,在第一步创建的文件夹内创建 index.js 并填入如下内容,将下面代码中的内网域名替换为第三步中复制的内网域名:

var express = require('express')
var parseurl = require('parseurl')
var session = require('express-session')
const redis = require('redis')
const RedisStore = require('connect-redis').default

var client = redis.createClient({
  url: 'redis://替换为内网域名:6379',
})
client.connect().catch(console.error)

var app = express()

app.use(
  session({
    store: new RedisStore({ client: client }),
    secret: 'forest squirrel',
    resave: false,
    saveUninitialized: true,
  })
)

app.use(function (req, res, next) {
  if (!req.session.views) {
    req.session.views = {}
  }

  // get the url pathname
  var pathname = parseurl(req).pathname

  // count the views
  req.session.views[pathname] = (req.session.views[pathname] || 0) + 1
  next()
})

app.get('/', function (req, res, next) {
  res.send('you viewed this page ' + req.session.views['/'] + ' times')
})

app.get('/foo', function (req, res, next) {
  res.send('you viewed this page ' + req.session.views['/foo'] + ' times')
})

app.get('/bar', function (req, res, next) {
  res.send('you viewed this page ' + req.session.views['/bar'] + ' times')
})

app.listen(80, function () {
  console.log('Example app listening on port 80!')
})

创建 Dockerfile,内容如下:

使用 @wxcloud/cli 能够更快更方便的容器化项目,只需要执行 wxcloud migrate 即可一键完成 Dockerfile 的编写,前往 https://cloud.weixin.qq.com/cli/ 了解更多。

FROM node:lts-alpine

# 设置容器内的当前目录
WORKDIR /app

# 使用速度更快的国内镜像源
RUN npm config set registry https://registry.npmmirror.com

# 将这些文件拷贝到容器中
COPY package.json package-lock.json ./

# 安装依赖
RUN npm ci

# 将包括源文件在内的所有文件拷贝到容器中(在 .dockerignore 中的文件除外)
COPY . .

# 设置环境变量
ENV NODE_ENV=production HOST=0.0.0.0

# 运行项目
CMD ["node", "index.js"]

# 服务暴露的端口
EXPOSE 80

在微信云托管中新建一个服务,开启「公网访问」,使用代码包上传部署,上传文件夹,等待部署完成。

# 第五步:查看页面效果

部署完成后,点击公网链接,即可查看效果:

可以看到,访问次数已被写入到 Redis 数据库中,刷新时,可见到次数增加。

# 注意事项

服务间内网调用,端口为服务部署发布时填写的端口,其他端口不可使用。