Please enable Javascript to view the contents

使用 Nodejs 代理 Https 请求到依赖的研发服务

 ·  ☕ 2 分钟

1. 背景

微服务架构下,服务与服务的依赖关系复杂。在开发过程中,多个服务之间经常需要联调。此时有两种方式:

  • 将服务部署到线上开发环境 Kubernetes 集群

使用 telepresence 打通本地与线上集群的通信,这样能获得一个比较稳定的联调环境。

缺点是,需要生成足够权限的凭证、需要研发人员熟悉 Kubernetes 的使用。每人一套成本又比较高。

  • 直接在办公网开发机之间互相调用

内网是互通的,直接调用也是可行的。但有些服务依赖是写死 Https 和 域名的,这样就需要在本地搭建一个 Https 代理服务。

本篇主要是介绍如何使用 Nodejs 搭建一个 Https 代理服务,用于转发依赖的服务请求。

2. 代理逻辑

如上图,是代理 Https 请求的示意图。主要步骤如下:

  1. 生成 CA 证书

  2. 签发服务域名证书

  3. 配置代理服务

  4. 设备信任 CA 证书

  5. 配置 Hosts 或 DNS 访问

生成 CA 证书、签发服务域名证书的具体操作,可以参考 Harbor 使用自签证书支持 Https 访问

3. 配置代理

  • 安装依赖
1
npm install express http-proxy-middleware
  • 配置 proxy.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const https = require("https");
const express = require("express");
const { createProxyMiddleware } = require("http-proxy-middleware");
const fs = require("fs");

const options = {
  cert: fs.readFileSync("www.baidu.com.cert"),
  key: fs.readFileSync("www.baidu.com.key"),
};

const app = express();

app.use(
  "/",
  createProxyMiddleware({
    target: "http://2.2.2.2:8080",
    changeOrigin: true,
  })
);

https.createServer(options, app).listen(443, () => {
  console.log("Proxy server listening on port 443");
});
  • 启动代理服务
1
node proxy.js

此时,通过配置 Hosts 或 DNS (1.1.1.1 www.baidu.com) 访问 https://www.baidu.com,就能访问到 http://2.2.2.2:8080 服务了。

  • 指定 target 域名及解析

如果你想 tagert 配置成域名,并且解析也自行指定,那么可以加上 DNS 片段,仅在当前服务生效。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
const dns = require("dns");

const customLookup = (hostname, options, callback) => {
  const customIP = "2.2.2.2";
  const family = options.family || 4;

  if (hostname === "target.domain.com") {
    const address = family === 6 ? "::1" : customIP;
    return callback(null, address, family);
  }
  dns.lookup(hostname, options, callback);
};
dns.lookup = customLookup;

微信公众号
作者
微信公众号