我正在尝试获取网关后面同一个域上的一堆单独的服务器。目前,这些服务器都可以通过多个名称从外部世界访问。我们的销售团队希望为客户提供一个唯一的url,因此如果一台服务器为10个客户提供服务,我们就会有10个CNAME记录指向它。
正如您所看到的,对于5到6台服务器,apiEndpoints的数量是相当大的。最重要的是,可以在任何给定的时间创建新的apiEndpoints,这使得硬编码的CNAME很难管理。
有可能有一个动态的serviceEndpoint url吗?我的想法是这样的:
apiEndpoints:
legacy:
host: '*.mydomain.com'
paths: '/v1/*'
serviceEndpoints:
legacyEndPoint:
url: '${someVarWithValueofStar}.internal.com'
pipelines:
default:
apiEndpoints:
- legacy:
policies:
- proxy:
- action:
serviceEndpoint: legacyEndPoint基本上,我想要实现的是将所有的x.mydomain.com重定向到x.internal.com,其中x可以是任何东西。
我可以在url字符串中使用变量吗?有没有办法获得与主机中的通配符匹配的字符串?有没有其他选择来解决这个问题?
发布于 2018-05-23 07:22:57
我最终根据自己的需要修改了一个代理插件。非常基础,需要更多的工作和测试,但这是我开始的:
代理插件(my-)
const httpProxy = require("http-proxy");
/**
* This is a very rudimentary proxy plugin for the express gateway framework.
* Basically it will redirect requests xxx.external.com to xxx.internal.com
* Where xxx can be any name and the destination comes from providing a
* service endpoint with a http://*.destination.com url
* @param {*} params
* @param {*} config
*/
module.exports = function (params, config) {
const serviceEndpointKey = params.serviceEndpoint;
const changeOrigin = params.changeOrigin;
const endpoint = config.gatewayConfig.serviceEndpoints[serviceEndpointKey];
const url = endpoint.url;
const reg = /(\/\/\*\.)(\S+)/;
const match = reg.exec(url);
const domain = match[2];
const proxy = httpProxy.createProxyServer({changeOrigin : changeOrigin});
proxy.on("error", (err, req, res) => {
console.error(err);
if (!res.headersSent) {
res.status(502).send('Bad gateway.');
} else {
res.end();
}
});
return (req, res, next) => {
const hostname = req.hostname;
const regex = /^(.*?)\./
const tokens = regex.exec(hostname)
const serverName = tokens[1];
const destination = req.protocol + "://" + serverName + "." + domain;
proxy.web(req, res, {target : destination});
};
};gateway.config.xml
http:
port: 8080
apiEndpoints:
legacy:
host: '*.external.com'
paths: '/v1/*'
serviceEndpoints:
legacy_end_point:
url: 'https://*.internal.com'
policies:
- my-proxy
pipelines:
default:
apiEndpoints:
- legacy
policies:
- my-proxy:
- action:
serviceEndpoint: legacy_end_point
changeOrigin: true这一切都归结为正则表达式解析apiEndpoints和serviceEndpoints主机和urls中的通配符,到目前为止还没有什么新奇的东西。我看了内置代理插件的源代码,我不认为我的幼稚方法会很好地适应,但它适用于我需要的东西。
发布于 2018-05-18 16:41:47
谢谢你的问题,我认为在接下来的几个月里,这个问题会被问得很多。
Express Gateway支持环境变量;不幸的是,目前apiEndpoint只能是一个定义良好的端点,没有任何替代功能。
在不久的将来,我们可能会改变这一点--使用Proxy Table API,它可以让你插入一些更难的模板。
如果这对你来说很紧迫,我会邀请你加入open an issue,这样团队中的每个人都能意识到这一特性,我们可以有效地确定它的优先级。
不幸的是,在此期间,您将不得不处理大量的ApiEndpoints
V。
https://stackoverflow.com/questions/50394406
复制相似问题