spring-boot - Haproxy 与 3 个 Spring Boot 应用程序

标签 spring-boot haproxy

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

最佳答案

实际上,有多种方法可以实现这一目标。但是,我认为 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

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

希望这有帮助。

关于spring-boot - Haproxy 与 3 个 Spring Boot 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59708422/

相关文章:

spring - 带有 spring boot 的 Redis 缓存 docker 容器在我的本地机器上不工作

apache - HAProxy - 将一个域的流量重定向到 https,其他域仅重定向到 http

amazon-web-services - 如何在 AWS 上的 Application Load Balancer(容器服务)上使用唯一的健康检查端口?

java - 是否可以使用 java 12 创建 spring boot maven 项目?

mysql - 使用 HAProxy 负载保护多数据库 mariadb 集群

linux - 如何在 Haproxy 后面添加/删除新服务器且中断最少

ssl - 解析切换规则时检测到 HAProxy 错误 : no such ACL : '{hdr(host)'

java - MockMvc 后期测试失败

java - Spring 启动 : Load @Value from YAML file

java - Spring Integration FileReadingMessageSource 使用 UseWatchService