如何在java中实现负载均衡器
Posted
技术标签:
【中文标题】如何在java中实现负载均衡器【英文标题】:How to implement Load Balancer in java 【发布时间】:2017-09-05 01:33:07 【问题描述】:我想实现一种模式,如果错误百分比超过阈值,则自动或手动停止对外部服务(即端口)的所有请求一段时间。我有两个服务器实例在具有不同端口的同一台机器上运行(例如:2401、2402)。
现在的要求是如果端口 2401 超过错误百分比阈值,那么我想在一段时间内停止对该端口(2401)的所有请求并路由到另一个端口(2402)。我不确定哪种算法适合这个。
我阅读了一些文章,但没有得到关于 Java 代码中负载均衡器实现的完整信息。
提前致谢, 萨提什
【问题讨论】:
看看 Hystrix 的 CircuitBreaker impl(hystrix 命令)。你不需要 LB 但是当我们将断路器应用于方法时,Hystrix 会监视对该方法的失败调用,如果失败达到阈值,Hystrix 会打开电路,以便后续调用自动失败。这个锻炼我不确定。 您可以覆盖“getFallback”方法,然后您可以使用另一个命令调用第二个服务实例。 用于负载平衡(Spring Cloud Ribbon)和断路器(Hystrix)。 非常感谢您的帮助。 【参考方案1】:@Svetlin 完全正确,您可以使用 hystrix 实现这一点。这是一个示例代码。使其适应您的要求。
@HystrixCommand(fallbackMethod = "fallBackForProductDetail", groupKey = "CircuitBreaker", commandKey = "frontend-productdetail", threadPoolKey = "frontend-productdetail",
commandProperties =
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000"),//Time before which this call is supposed to complete. if not throw exception. this is Optional
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"), // Number of requests before which the cicuit is open
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "1200000"),//20 minutes circuit will be open
,
threadPoolProperties =
@HystrixProperty(name = "coreSize", value = "30"),
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "180000")// 3 minutes rolling window. i.e the errors calculated for every 3 minute window.
)
public String callProductDetail(.....)
// call server1
// Return type and arguments should be exactly same as the method for wich this is fallback. (With an optional Throwable argument to catch exception)
public String fallBackForProductDetail(...)
// call server2
现在解释行为。当对 server1 的请求失败时,计数器会增加,调用会转到回退方法 (fallBackForProductDetail) 并执行回退方法中的代码。相同的行为一直持续到达到阈值(在这种情况下为 5)。达到阈值后,控件甚至没有进入main方法(callProductDetail),而是直接进入fallback方法。这发生在sleepWindowInMilliseconds
(在这种情况下为 20 分钟)。
希望对你有帮助。
【讨论】:
非常感谢@pvpkiran 的帮助。以上是关于如何在java中实现负载均衡器的主要内容,如果未能解决你的问题,请参考以下文章