首页 > 解决方案 > 带有 3 个 springboot 应用程序的 Ha Proxy

问题描述

我有 3 个 Spring Boot 应用程序,每个应用程序都在不同的端口上运行。有人可以指导我如何设置 Ha Proxy 来演示 3 个应用程序之间的负载平衡(可以创建多个实例)。Spring Boot 中是否有任何集成 Ha Proxy 的功能?我必须在 Ha Proxy 的配置文件中更改哪些内容?

标签: spring-boothaproxy

解决方案


实际上,有几种方法可以实现这一点。但是,我认为 Spring Boot 中没有任何东西可以与 HAProxy 集成,因为它们两个是不同的进程,并且它们两个独立工作并且没有任何关联,因为您可能知道 Spring Boot 的作用。HAProxy 是一个负载均衡器,也是分布在多个服务器上的 TCP 和 HTTP 进程的代理服务器。

这解释了你问题的第一部分。

现在实际上,您如何实现这一点完全取决于您要如何设置它。

  1. 像您一样将单个应用程序作为服务运行,并根据 url 将流量路由到每个应用程序。

  2. 另一种方法是在单个 tomcat 上部署单个应用程序并借助应用程序属性中的上下文路径,您可以将流量从外部世界路由到 tomcat,而 tomcat 会处理所有事情。

可能还有其他方法可以做到这一点,将来有人可以添加到这个答案中。但无论哪种方式,您都需要使用代理服务器来执行此操作,它可以是 HAProxy、Nginx 或任何适合目的的东西。

因此,采用您的方法,假设您在端口 8081、8082、8083 上运行应用程序。您的 HAProxy 设置应如下所示。

frontend www_http
    mode            http
    bind            *:80
    bind            *:443 ssl crt /etc/ssl/certs/mycompany.pem

    # passing on that browser is using https
    reqadd X-Forwarded-Proto:\ https
    # for Clickjacking
    rspadd X-Frame-Options:\ SAMEORIGIN

    # prevent browser from using non-secure
    rspadd Strict-Transport-Security:\ max-age=15768000
    redirect        scheme https code 301 if !{ ssl_fc }

    stats enable
    stats refresh 30s
    stats show-node
    stats realm Haproxy\ Statistics
    stats uri /haproxy?stats

    acl app1 hdr(host) -i app1.mycompany.com
    acl app2 hdr(host) -i app2.mycompany.com
    acl app3 hdr(host) -i app3.mycompany.com

    # Just incase if you are using path instead of subdomain. But it's commented.
    # acl app1 url_beg /app1
    # acl app2 url_beg /app2
    # acl app3 url_beg /app3

    use_backend app_1_backend if app1
    use_backend app_2_backend if app2
    use_backend app_3_backend if app3

# backend for app 1
backend app_1_backend
    timeout client  300000
    timeout server  300000
    redirect scheme https if !{ ssl_fc }
    server app-1 127.0.0.1:8081 check
    http-response set-header X-TS-Server-ID %s

# backend for app 2
backend app_2_backend
    timeout client  300000
    timeout server  300000
    redirect scheme https if !{ ssl_fc }
    server app-2 127.0.0.1:8082 check
    http-response set-header X-TS-Server-ID %s

# backend for app 3
backend app_3_backend
    timeout client  300000
    timeout server  300000
    redirect scheme https if !{ ssl_fc }
    server app-3 127.0.0.1:8083 check
    http-response set-header X-TS-Server-ID %s

这是一些基本设置,但您可以添加选项并根据需要更改所有内容。

希望这可以帮助。


推荐阅读