[转]Nginx主动式后端服务器健康检查配置

环境:

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

场景:

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

解决方案:

Nginx主动式调用服务器端的接口(自定义的监控检查接口)。
自定义检查接口:查询Eureka的状态,若状态不是up状态,那么返回500异常。
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;
}

原文:https://www.jianshu.com/p/beb9d8d26464
参考:Nginx实战系列之功能篇—-后端节点健康检查

Original: https://www.cnblogs.com/gotodsp/p/15888656.html
Author: dai.sp
Title: [转]Nginx主动式后端服务器健康检查配置

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/543037/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • TCP/IP详解 读书笔记:TCP:传输控制协议

    TCP的服务 TCP为应用层提供一种面向连接的、可靠的字节流服务。一个TCP连接中,仅有两方进行彼此通信,所以广播和多播不能用于TCP。TCP通过以下方式提供可靠性: 应用数据被切…

    Java 2023年6月7日
    090
  • 安装RocketMQ出现问题找不到主类

    解决:1、确定安装路径没有空格 2、去修改下面文件 确定这里有双引号 posted @2022-07-31 18:20 大大怪下士 阅读(37 ) 评论() 编辑 Original…

    Java 2023年6月9日
    079
  • kotlin学习二:初步认识kotlin

    kotlin中支持顶级函数(文件内直接定义函数),对比JAVA来说,JAVA的程序入口是main方法,kotlin也一样,入口为main函数 首先看下kotlin中main函数的定…

    Java 2023年6月16日
    075
  • Spring:SpringMVC一例

    文章目录 + [目录结构](#-1) + [web.xml](#webxml-4) + [SpringMVC核心配置文件:md5-servlet.xml](#springmvcmd…

    Java 2023年5月30日
    095
  • Spring Cloud 微服务优雅下线 + 灰度发布的正确姿势,写得太好了!

    前言 在生产环境中,如何保证在服务升级的时候,不影响用户的体验,这个是一个非常重要的问题。如果在我们升级服务的时候,会造成一段时间内的服务不可用,这就是不够优雅的。那什么是优雅的呢…

    Java 2023年6月15日
    0100
  • 向量判断划动方向

    向量判断划动方向 1. 背景 在当下手机游戏开发过程中.面对的不在是物理按键,一切操作都在一个可触摸的手机屏幕上.从用户按下屏幕开始,到移动手指,到结束.这段操作我们称其为滑动操作…

    Java 2023年6月13日
    095
  • 深入浅出SpringSecurity

    SpringSecurity学习 SpringSecurity简介 安全框架的概述 什么是安全框架?是为了解决安全问题的框架。如果没有安全框架,我们需要手动处理每个资源的访问控制,…

    Java 2023年6月5日
    0121
  • Spring Cloud Alibaba 使用Gateway作为服务网关

    从没有网关的角度来看后台如有N个服务,那么前端则需要对接N个服务;只要后台修改IP或者端口等任何信息那么前端也需要修改。当服务对接了网关后前端只需要统一调用网关入口即可,具体调用那…

    Java 2023年6月5日
    095
  • Java如何使用实时流式计算处理?

    我是3y,一年 CRUD经验用十年的 markdown程序员👨🏻‍💻常年被誉为职业八股文选手 最近如果拉过 austin项目代码的同学,可能就会发现多了一个 austin-stre…

    Java 2023年6月9日
    075
  • 使用Thread类和Runnable接口实现多线程的区别

    先看两种实现方式的步骤: public class ThreadDemo{ public static void main(String[] args) { for (int i …

    Java 2023年6月8日
    095
  • 1.Spring jar包依赖

    <dependency> <groupid>commons-cli</groupid> <artifactid>commons-cl…

    Java 2023年6月13日
    0101
  • 整理最近用的Mongo查询语句

    最近做了几个规则逻辑。用到mongo查询比较多,就是查询交易信息跑既定规则筛选出交易商户,使用聚合管道进行统计和取出简单处理后的数据,用SQL代替业务代码逻辑的判断。 MongoD…

    Java 2023年6月7日
    078
  • Markdown语法

    “###”+空格+内容 “####”+空格+内容(依此类推..) 斜体( + 内容 + ) 粗体( + 内容 + ) 斜体+粗体( …

    Java 2023年6月6日
    074
  • 从0到1写一款自动为Markdown标题添加序号的Jetbrains插件

    1. markdown-index 最近做了一个Jetbrains的插件,叫 markdown-index,它的作用是为Markdown文档的标题自动添加序号,效果如下: 目前已经…

    Java 2023年6月7日
    0108
  • JavaWeb详解

    一、基本概念 1.前言 web开发: web,网页的意思 静态web html,css 提供给所有人看的数据始终不会发生变化 动态web 提供给所有人看的数据始终会发生变化,每个人…

    Java 2023年6月13日
    085
  • HashMap在jdk7和jdk8中的实现原理

    HashMap在jdk7中实现原理: 1.在实例化以后,底层创建了一个长度为16的一维数组Entry[] table 在可能执行多次put后 map.put(key1,value1…

    Java 2023年5月30日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球