tengine—主动式后端服务器健康检查配置(kill服务,nginx的upstream没移除)

环境:

  • SpringCloud微服务(eureka注册中心);
  • nginx作为负载均衡;

场景:

nginx-->A服务

  1. 当流量高峰期时,kill A服务
  2. A服务还没有挂掉,但是注册中心状态为OUT_OF_SERVICE,但是服务在nginxupstream中。
  3. nginx的流量还是会到达A服务,但是A服务Fegin接口调用其他服务时,会出现异常情况。

解决方案:

  1. tengine主动式调用服务器端的接口(自定义的监控检查接口)。
  2. 自定义检查接口:查询Eureka的状态,若状态不是up状态,那么返回500异常。
  3. nginx收到500异常后,自动将ip:port在upstream中摘除。

代码实现:

健康检查接口:

@RestController
@Slf4j
public class HealthController {

    @Autowired
    private EurekaClient eurekaClient;

    @RequestMapping(value = "/health/check/status", method = {RequestMethod.HEAD, RequestMethod.GET})
    public boolean checkStatus(HttpServletResponse response) {
        try {
            InstanceInfo.InstanceStatus instanceRemoteStatus = eurekaClient.getInstanceRemoteStatus();
            boolean up = InstanceInfo.InstanceStatus.UP.equals(instanceRemoteStatus);
            //设置http的响应码
            if (!up) {
                response.setStatus(500);
            }
            return up;
        } catch (Exception e) {
            return true;
        }
    }

}

nginx配置:

upstream student-service-api {
        server 172.26.34.101:9050;
        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_http_send "HEAD /health/check/status HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
}
  1. interval表示每隔3000毫秒向后端发送健康检查包;
  2. rise表示如果连续成功次数达到2 服务器就被认为是up;
  3. fail表示如果连续失败次数达到5 服务器就被认为是down;
  4. timeout表示后端健康请求的超时时间是1000毫秒;
  5. type表示发送的健康检查包是http请求;
  6. check_http_send 表示http健康检查包发送的请求内容。为了减少传输数据量,推荐采用“head”方法;
  7. check_http_expect_alive 指定HTTP回复的成功状态,默认认为2XX和3XX的状态是健康的;

配置location,查看服务器的健康状态

location ~* /status {
    check_status;
    access_log   off;
}

重启nginx

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容