Tôi cũng cần làm như vậy và sau một số không tối ưu với bộ điều khiển Spring và RestTemplate, tôi đã tìm thấy giải pháp tốt hơn: Smiley's HTTP Proxy Servlet. Lợi ích là, nó thực sự thực hiện AS-IS proxy, giống như Apache mod_proxy
, và nó thực hiện nó theo một cách trực tuyến, mà không cần lưu trữ toàn bộ yêu cầu/đáp ứng trong bộ nhớ.
Đơn giản, bạn đăng ký một servlet mới vào đường dẫn bạn muốn proxy đến một máy chủ khác, và cung cấp cho servlet này máy chủ đích làm tham số init. Nếu bạn đang sử dụng một ứng dụng web truyền thống với một web.xml, bạn có thể cấu hình nó như sau:
<servlet>
<servlet-name>proxy</servlet-name>
<servlet-class>org.mitre.dsmiley.httpproxy.ProxyServlet</servlet-class>
<init-param>
<param-name>targetUri</param-name>
<param-value>http://target.uri/target.path</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>proxy</servlet-name>
<url-pattern>/mapping-path/*</url-pattern>
</servlet-mapping>
hoặc, tất nhiên, bạn có thể đi với annotation config.
Nếu bạn đang sử dụng Spring Boot, nó thậm chí còn dễ dàng hơn: Bạn chỉ cần tạo một bean loại ServletRegistrationBean
, với cấu hình yêu cầu:
@Bean
public ServletRegistrationBean proxyServletRegistrationBean() {
ServletRegistrationBean bean = new ServletRegistrationBean(
new ProxyServlet(), "/mapping-path/*");
bean.addInitParameter("targetUri", "http://target.uri/target.path");
return bean;
}
Bằng cách này, bạn cũng có thể sử dụng các tính chất mùa xuân mà có sẵn trong môi trường.
Bạn thậm chí có thể mở rộng lớp ProxyServlet
và ghi đè phương pháp của nó để tùy chỉnh yêu cầu/tiêu đề phản hồi, v.v. trong trường hợp bạn cần.
Cập nhật: Sau khi sử dụng servlet proxy của Smiley một thời gian, chúng tôi gặp phải một số sự cố hết thời gian, nó không hoạt động đáng tin cậy. Đã chuyển sang Zuul từ Netflix, không gặp bất kỳ sự cố nào sau đó. Một hướng dẫn về cấu hình nó với Spring Boot có thể được tìm thấy trên this link.
Tôi có một khách hàng, một máy chủ trung gian và một vài máy chủ chính. Máy khách chỉ nói chuyện với máy chủ trung gian gửi cuộc gọi đến máy chủ. Máy chủ trả về một phản hồi cho máy chủ trung gian mà sau đó nó xử lý và sau đó trả về phản hồi cho máy khách. – user1144031
không nên sao chép tiêu đề yêu cầu (3) và nội dung (4) bù đắp cho các tham số yêu cầu sao chép (2) (vì tham số bài là một phần của phần thân yêu cầu, vì chúng là một phần của url)? Nó sẽ được reduntant (trong http yêu cầu) nếu tôi thực hiện cả hai bước – mickeymoon