后端透传代理实现

该博客介绍了如何实现一个后端透传代理,通过在请求中添加`target`参数指定目标地址,同时保持其他query参数和header参数的透传。代码示例使用了Spring RestController和WebClient来构建代理请求,返回目标服务的响应内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

后端透传代理实现

参数设计

  • 增加的一个target参数,用于表明需要代理的目标地址
  • 其他query参数透传
  • header参数透传

代码实现

@RestController
public class HomeController {

    @GetMapping("/backend/proxy")
    public ResponseEntity<?> proxy(@RequestParam MultiValueMap<String, String> params, @RequestHeader MultiValueMap<String, String> heads) {

        if (!params.containsKey("target")) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body("{\"message\": \"target param is required\"}");
        }

        String url = params.remove("target").get(0);
        System.out.println("url: " + url);

        URI uri;
        try {
            uri = new URI(url);
        } catch (URISyntaxException ex) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body("{\"message\": \"target value invalid\"}");
        }
        String result = WebClient.create().get().uri(uriBuilder -> uriBuilder.scheme(uri.getScheme())
                .host(uri.getHost()).path(uri.getPath()).queryParams(params).build())
                .headers(headers -> headers.addAll(heads)).retrieve()
                .bodyToMono(String.class).block();
        return ResponseEntity.ok(result);
    }
}
### HAProxy实现IP配置 对于HAProxy的四层和七层负载均衡,可以分别通过不同的方式来实现实现IP。 #### 四层IP配置 为了使Web服务器能够接收到客户端的真实IP地址,在HAProxy中可以通过设置`send-proxy`选项来进行四层TCP级别的输。具体来说: - 使用`mode tcp`指定工作模式为第四层协议; - `balance roundrobin`定义了轮询算法分配请求到后端节点上; - 关键在于加入`send-proxy`指令,这会使得每一个连接建立时都附带XFF头信息给目标服务器[^3]。 ```plaintext listen web_prot_http_nodes bind 192.168.7.101:80 mode tcp balance roundrobin server web1 blogs.studylinux.net:80 send-proxy check inter 3000 fall 3 rise 5 ``` #### 后端Nginx接收处理 为了让Nginx能正确解析来自HAProxy发送过来的代理头部数据,需调整其监听语句如下所示,并开启对PROXY协议的支持: ```nginx server { listen 80 proxy_protocol; server_name blogs.studylinux.net; location / { # Your configuration here... } } ``` 此部分改动确保了即使经过多级转发之后仍然可以获得原始发起者的公网IP地址。 #### 服务重启命令 完成上述更改后,记得保存所有编辑过的文件并执行相应命令以应用新的设定。针对haproxy而言,可利用以下两种方法之一使其生效: - 对于基于Systemd管理的服务环境,推荐采用这种方式: ```bash systemctl restart haproxy.service ``` - 或者直接杀死现有进程再启动新实例(适用于某些特定场景下),不过通常建议优先考虑前一种做法[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值