Marahon-lb的服务发现/负载均衡

本文介绍了Marathon-lb在DC/OS环境中的服务发现及负载均衡能力,详细阐述了三种应用访问方式:Virtualhosts模式、VirtualIP模式和服务端口模式,并强调了它们在内外网环境下的适用场景。

Marahon-lb向DC/OS环境提供服务发现即负载均衡能力,不同的使用场景可以利用其不同的发现机制。

Marahon-lb安装以后,针对应用程序部署过程中,需要配置一个特殊标签HAPROXY_GROUP=external,这个标签通知 marathon-lb是否需要暴露这个应用。
有三种方式通过marathon-lb来实现发现并访问一个应用。

(1)Virtual hosts模式

在应用的配置项中,添加特殊标签HAPROXY_GROUP和HAPROXY_0_VHOST并启动应用实例,而后在访问按照域名的方式访问Marahon-lb所在地址(如果在本地可以配置hosts中域名和ip的对应关系),便会自动实现服务的发现,并按照实例的访问负载访问到其中一个实例当中。这种方式是自动按照80和443端口访问应用的映射后端口。

 "labels":{
    "HAPROXY_GROUP":"external",
    "HAPROXY_0_VHOST":"testapp1.mesos.info"
  }

(2)Virtual IP模式

在应用的配置项中,添加特殊标签HAPROXY_GROUP,并且在端口映射时,填写固定的虚拟IP:PORT后,在DC/OS环境的任何Node下,都可以直接以该IP:PORT形式访问到该应用的对应端口服务。

(2)服务端口(Service Port)模式

在应用的配置项中,添加特殊标签HAPROXY_GROUP,并且在端口映射时,配置各映射端口的Service Port,访问Marahon-lb所在的 IPServicePort便会自动实现服务的发现,并按照实例的访问负载访问到其中一个实例当中。这种方式对应于该应用的映射端口


上述三种方法的应用访问,都会实现一个应用被开启多个实例,而且跨越多个Agnet的情况,对于访问端,不需要考虑应用的具体事例位置所在Agnet的位置、以及有多少个实例等信息,Marahon-lb会自己做到服务发现,以及访问时的负载情况,自动的、动态的指定到某一个合适的实例上、并且做好了端口匹配。

第一和第二个方法更适合DC/OS内部应用之间的访问,而第三个方式,适合DC/OS被通向外网的硬件BL配置使用。这样便能实现外网访问某一端口,自动适应匹配到DC/OS环境中具体的一个应用实例服务做到了对外负载均衡和高可用,对内弹性扩展、资源统一化调度、管理、和服务的自恢复能力


这段日志是 **Spring Cloud Gateway** 或类似 API 网关的动态路由配置加载记录,展示了多个路由规则的定义。以下是详细解析: --- ### **日志内容分析** 1. **核心信息** - **时间戳**:`2025-07-02 08:25:00.542` - **日志级别**:`INFO` - **线程**:`reactor-http-epoll-1`(基于 Netty 的 Reactor 线程) - **类名**:`DatabaseRouteDefinitionRepository` 表明路由配置是从数据库(或其他持久化存储)动态加载的。 2. **路由规则格式** 每行格式为: `<路由ID> ===> lb://<服务名称>/<服务路径>` - **`lb://`**:表示使用 **负载均衡(Load Balancer)** 调用下游服务(如 Ribbon 或 Spring Cloud LoadBalancer)。 - **重复路径问题**: 所有目标路径均包含冗余的 `/eap-service`(如 `/eap-service/v1/changePortAccessMode`),可能是配置错误或服务注册时的上下文路径设置问题。 --- ### **路由配置示例** | 路由ID (`MES.xxx` 或 `AED.xxx`) | 目标服务地址 | 潜在问题 | |-------------------------------|-------------|---------| | `MES.ChangePortAccessMode` | `lb://eap-service/eap-service/v1/changePortAccessMode` | 路径冗余 | | `MES.QueryEqpRTInfo` | `lb://eap-service/eap-service/v1/queryEqpRTInfo` | 路径冗余 | | `AED.StopQueue` | `lb://eap-service/eap-service/v1/stopQueue` | 路径冗余 | --- ### **关键点说明** 1. **动态路由** - 路由规则通过 `DatabaseRouteDefinitionRepository` 从数据库加载,支持运行时更新(无需重启网关)。 - 类似功能可通过 Spring Cloud Gateway 的 `RouteDefinitionLocator` 实现。 2. **负载均衡调用** - `lb://eap-service` 表示请求会被转发到注册中心(如 Eureka、Nacos)中名为 `eap-service` 的服务实例。 - 实际路径应为 `/v1/xxx`,但当前配置多了一层 `/eap-service`,可能导致 404 错误。 3. **冗余路径问题** - **可能原因**: - 服务 `eap-service` 在注册中心配置了 `spring.cloud.gateway.discovery.locator.lower-case-service-id=true` 或类似参数,自动添加了服务名前缀。 - 网关的 `predicates` 或 `filters` 配置错误,重复拼接了路径。 - **解决方案**: 检查网关的 `application.yml` 或数据库路由表,修正目标路径为 `lb://eap-service/v1/xxx`。 --- ### **配置优化建议** #### 1. **修正路径冗余** ```yaml # 示例:Spring Cloud Gateway 的 application.yml 配置 spring: cloud: gateway: routes: - id: MES.ChangePortAccessMode uri: lb://eap-service predicates: - Path=/api/v1/changePortAccessMode filters: - RewritePath=/api/v1/(?<segment>.*), /v1/$\{segment} ``` 通过 `RewritePath` 过滤器去除冗余前缀。 #### 2. **检查服务注册配置** 确保 `eap-service` 的注册信息不包含重复路径: ```yaml # eap-service 的 application.yml spring: application: name: eap-service cloud: loadbalancer: enabled: true ``` #### 3. **动态路由数据库表设计** 如果路由存储在数据库,表结构可能如下: ```sql CREATE TABLE gateway_routes ( id VARCHAR(100) PRIMARY KEY, service_name VARCHAR(100), -- 如 "eap-service" path_pattern VARCHAR(255), -- 如 "/api/v1/changePortAccessMode" target_path VARCHAR(255), -- 如 "/v1/changePortAccessMode" enabled BOOLEAN ); ``` --- ### **相关技术栈** 1. **Spring Cloud Gateway**:基于 Reactor 的 API 网关。 2. **Reactive 编程**:使用 `reactor-http-epoll` 线程模型(Netty 底层)。 3. **服务发现**:通过 `lb://` 集成 Eureka/Nacos 等注册中心。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值