Fastify-http-proxy无法实现动态路由随机切换后端上游服务的问题
问题根源
- 参数层级配置错误:
disableCache、cacheURLs是@fastify/http-proxy的顶层配置项,你当前将其放到replyOptions子项中,两个禁用缓存的配置完全不生效,底层依赖的@fastify/reply-from会默认缓存第一次解析得到的上游地址,导致后续请求都走第一次的上游 - 顶层
upstream参数不能为空,即使配置了动态getUpstream也需要传入合法的初始值,否则初始化阶段会产生异常缓存
修复方案
- 优先替换为官方维护的新版代理包,旧的
fastify-http-proxy已经停止维护:
npm uninstall fastify-http-proxy && npm install @fastify/http-proxy
- 调整配置的参数层级,将禁用缓存的配置移到顶层:
server.register(require('@fastify/http-proxy'), { // 填写合法的初始上游值,仅用于初始化,实际会被getUpstream的返回值覆盖 upstream: `http://localhost:${backend1Port}`, // 禁用上游地址缓存的配置放在顶层 disableCache: true, cacheURLs: 0, replyOptions: { getUpstream: (originalReq, base) => { if (Math.random() < 0.5) { console.log(`setting base to backend1`) return `http://localhost:${backend1Port}` } else { console.log(`setting base to backend2`) return `http://localhost:${backend2Port}` } } }, })
验证注意事项
- 浏览器端测试时请关闭页面缓存,或者使用无痕模式访问,避免浏览器缓存了前一次的响应资源,看起来没有切换上游
- 如果需要更可控的负载均衡策略,可以在服务端维护一个请求计数器,实现轮询、加权轮询等分配逻辑,替代随机分配的方式
内容的提问来源于stack exchange,提问作者Patrick Hwang
相关产品推荐
相关产品推荐

