应用健康检查

一:背景

   我们的应用是都是走自动化脚本发布的,当发布完成后,通常的做法可能是直接看发布日志是否有报错,但这需要人工去操作,所以我们写了一个健康检查的页面,在发布完成后用脚本去访问这个健康页面,看是否能正常访问,从而确定应用是否正常启动。

二:实现

  •   写一个servlet去作为健康检查的页面,如果能正常访问,说明应用启动成功
  •   写一个filter做安全检查,禁止访问其他资源

三:代码

       servlet
public class AppHealthCheckServlet extends HttpServlet {


    /**
     * 
     */
    private static final long serialVersionUID = -1828845486756970600L;
    /** 默认健康检查页面 */
    private static final String DEFAULT_LOCATION = "/web/templates/screen/ok.html";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.设置编码
        resp.setCharacterEncoding("UTF-8");
        //2.获取健康检查页面的location
        //        String location = req.getServletContext().getInitParameter("health");
        String location = req.getSession().getServletContext().getInitParameter("health");
        location = StringUtils.isBlank(location) ? DEFAULT_LOCATION : location;
        //3.跳转页面
        //        resp.sendRedirect(location);
        req.getRequestDispatcher(location).forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }

    filter
public class AccessControlFilter implements Filter {

    /** 无权限默认访问的路径 */
    private static final String ERRORLOCATION = "/web/templates/screen/access.html";

    /** 有权限访问的路径 */
    private static final String ACCESS_URI    = "/ok";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        String URI = req.getRequestURI();
        if (ACCESS_URI.equals(URI)) {
            chain.doFilter(request, response);
        } else {
            String selfLocation = req.getSession().getServletContext().getInitParameter("access");
            selfLocation = StringUtils.isBlank(selfLocation) ? ERRORLOCATION : selfLocation;
            request.getRequestDispatcher(selfLocation).forward(request, response);
        }
    }

    @Override
    public void destroy() {

    }

    web.xml配置
<servlet>
		<servlet-name>health</servlet-name>
		<servlet-class>com.xxxx.core.bridge.servlet.AppHealthCheckServlet</servlet-class>
		<init-param>
			<param-name>health</param-name>
			<param-value>/web/templates/screen/ok.html</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>health</servlet-name>
		<url-pattern>/ok</url-pattern>
	</servlet-mapping>
	
	<filter>
		<filter-name>access</filter-name>
		<filter-class> com.xxxx.core.bridge.filter.AccessControlFilter</filter-class>
		<init-param>
			<param-name>access</param-name>
			<param-value>/web/templates/screen/access.html</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>access</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker健康检查是用于监控Docker容器状态的一种机制。它可以定期检查容器内部的服务或应用程序是否处于预期的正常工作状态,以帮助确保应用程序的稳定性和可靠性。 在Docker中,健康检查通过在容器中运行一个命令或发送一个请求来进行。如果命令成功执行或请求返回成功响应,容器将被视为健康状态。如果命令执行失败或请求返回错误响应,容器将被视为不健康状态。 可以通过在Dockerfile中使用HEALTHCHECK指令来定义容器的健康检查。例如,可以使用以下方式来定义一个基于命令的健康检查: ``` HEALTHCHECK --interval=5s --timeout=3s \ CMD curl -f http://localhost/ || exit 1 ``` 上述例子中,健康检查命令是通过curl命令发送一个GET请求到http://localhost/,如果请求返回成功响应,则容器被视为健康状态。检查间隔为5秒,超时时间为3秒。 另外,还可以使用Docker命令行工具来管理和查看容器的健康状态。例如,可以使用以下命令来查看某个容器的健康状态: ``` docker inspect --format='{{json .State.Health}}' <container_id> ``` 这将返回一个JSON格式的健康状态信息,包括健康状态、健康检查命令、检查间隔和超时时间等。 需要注意的是,健康检查功能在Docker 1.12及更高版本中可用。在使用健康检查时,建议根据应用程序的特性和需求来选择合适的健康检查方式,以确保容器的可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值