Health Check in eShop -- 解析微软微服务架构Demo(五)

引言

What is the Health Check

Health Check(健康状态检查)不仅是对自己应用程序内部检测各个项目之间的健康状态(各项目的运行情况、项目之间的连接情况等),还包括了应用程序对外部或者第三方依赖库的状态检测。

Why use Health Check

现在我们的项目越来越多的从单体多层架构转换成多项目多层架构即现在流行的微服务架构。

原来我们的App把各个模块分层分项目处理,比如Users项目仅仅处理User的一些业务需求,但在整个项目使用的时候,我们仅仅需要引用其类库即可,不用担心项目与类库之间的不兼容问题,如果不兼容在编译期已经会有提示。但如今,业务规模越来越庞大的时候,我们单独把Users作为一个service来做,所有一切都在其内部处理,对于外部来说仅仅公开几个api即可,但与项目之间的连接就从单纯的物理引用关系转换成了网络调用关系。

当我们架构从单体架构到微服务架构的时候,我们会发现越来越多的引用从物理转向了网络,在原来我们不需要考虑之间是否调用成功,但现在我们必须考虑进去,网络因素、服务器因素、其他因素等都会影响各服务之间的调用,因此Health Check孕育而生,它在微服务架构中是举足轻重的。

Health Check’s Feathure

Health Check的功能有哪些?在微服务架构中很简单,就是检查各services的运行状态是否正常。在微服务的架构中,所有的一切都是service,db is service,rabbitmq is service,auth is service, shoppingcart is server……我们的架构能够根据业务需求,横向的扩容,多个db,多个rabbitmq,多个auth,多个shoppingcart。我们总结下,微服务架构下的Health Check是通过网络检查各services是否正常运行,它的功能是:

1、提供外部调用Health Check接口,反馈自身状态

2、检测相关service状态是否正常(比如db server,能否连接到db,能否打开数据库等)

3、UnHealthly时处理机制

Health Check in eShop

Why in eShop?

之前我们一直都在介绍eShop是微软基于微服务架构的.Net Core Demo,为了保障各个services之间的调用正常,所以Health Check是必不可少的。

Where is it?

在Demo中,我们可以在各个services中都能看到HealthCheck,可以说是无处不在,在系列【】和【】中我们都有见过。在eShop项目中,我们可以看到有个HealthChecks目录,其中包含了与HealthChecks相关的几个项目:

Microsoft.Extensions.HealthChecks   ------------     Health Check的核心代码

Microsoft.AspNetCore.HealthChecks   ------------     Asp.Net Core注册扩展类库

Microsoft.Extensions.HealthChecks.AzureStorage ----- 扩展对Azure Blob Storage的支持

Microsoft.Extensions.HealthChecks.SqlServer ------   扩展对MsSql Server的支持

通过代码了解,在eShop中实现了对各Api的通讯检测和SqlServer、AzureBlobStorage的检测,但其中并没有看到对重试机制和UnHealthy时的处理,相信以后会加入这些,目前微软已经单独为HealthChecks开了一个Repository,这样你就可以单独引用到自己的项目中,非常棒的东西。

在项目中,我们一般只会在Program.cs和Startup.cs看到跟HealthChecks相关的代码。目前仅在客户端(其他service或者我们的app)请求我们的HealthChecks的时候,我们会进行相关service的检测,然后再返回自身的一个状态码。

How use the Healthchecks?

接下来我们看下在eShop中代码是如何使用的,我们以Identity.Api为例,在之前的文章中我们提到过,在Program.cs中,有一段UseHealthChecks("/hc"),我们跟踪下代码,你会看到它会先判断path是否负责规则,如果符合的话就会通过IWebHostBuilder注册一个HealthCheckStartupFilter,Filter则会把相应的HealthCheckMiddleware注册到管道中,我们看下主要源码:

public async Task Invoke(HttpContext context)
{
    if (IsHealthCheckRequest(context))
    {
        var timeoutTokenSource = new CancellationTokenSource(_timeout);
        var result = await _service.CheckHealthAsync(timeoutTokenSource.Token);
        var status = result.CheckStatus;

        if (status != CheckStatus.Healthy)
            context.Response.StatusCode = 503;

        context.Response.Headers.Add("content-type", "application/json");
        await context.Response.WriteAsync(JsonConvert.SerializeObject(new { status = status.ToString() }));
        return;
    }
    else
    {
        await _next.Invoke(context);
    }
}

private bool IsHealthCheckRequest(HttpContext context)
{
    if (_port.HasValue)
    {
        var connInfo = context.Features.Get<IHttpConnectionFeature>();
        if (connInfo.LocalPort == _port)
            return true;
    }

    if (context.Request.Path == _path)
    {
        return true;
    }

    return false;
}

它会先检测这个请求是不是HealthCheck请求,如果不是则走下面的步骤,如果是,则会进一步进行对相关service的HealthChecks。对相关service的Config实在Startup.cs中进行的:

services.AddHealthChecks(checks =>
{
    var minutes = 1;
    if (int.TryParse(Configuration["HealthCheck:Timeout"], out var minutesParsed))
    {
        minutes = minutesParsed;
    }
    checks.AddSqlCheck("Identity_Db", Configuration.GetConnectionString("DefaultConnection"), TimeSpan.FromMinutes(minutes));
});

这里可以看到,在Identity.Api中,仅仅配置了对数据库的检测。

ok,我们非常简单的在项目中引用了HealthCheck,当我们的api运行后,我们只需要通过 http://xxx/hc 就能对这个api进行Health Check了。

写在最后

今天我们了解了Health Check,并简单看了它在eShop中的使用。目前看来还不是很完善,只在其他service或者app调用其Health Check接口的时候才能进行检测,当然我们可以改造下,使其在程序运行的时候先检测一次。在eShop中我们并没有看到在UnHealth的时候的处理,这个扩展起来很简单,你可以通过自身需求,进行日志,email,短信都可以,后面可以找机会实现下。

乘着不忙的时候赶紧学习,如果大家有兴趣学习.Net Core的话,可以加QQ群:376248054(通关密码:cnblogs)。另外喜欢微服务的朋友可以看下园中大神Savorboard的微服务系列

时间: 2024-07-31 20:38:21

Health Check in eShop -- 解析微软微服务架构Demo(五)的相关文章

Catalog Service - 解析微软微服务架构eShopOnContainers(三)

上一篇我们说了Identity Service,因为其基于IdentityServer4开发的,所以知识点不是很多,今天我们来看下Catalog Service,今后的讲解都会把不同的.重点的拿出来讲,希望大家明白. 源码分析 我们先看下它的目录结构,很标准的webapi目录: 首先看下Program,跟IdentityService类似,多了一个UseWebRoot("Pics"),把pics这个目录设置成了webroot,其他都一样. 在Startup的构造方法中,我们也看到了使用

Spring Cloud构建微服务架构(五)服务网关

通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实现了服务注册中心以及服务注册与发现:而服务间通过Ribbon或Feign实现服务的消费以及均衡负载:通过Spring Cloud Config实现了应用多环境的外部化配置以及版本管理.为了使得服务集群更为健壮,使用Hystrix的融断机制来避免在微服务架构中个别服务出现异常时引起的故障蔓延. 在该架

从 0 开始的微服务架构:(五)代码给你,看如何用Docker支撑微服务

很好的一篇文章,全面.系统. 虽然已经红了很久,但是"微服务架构"正变得越来越重要,也将继续火下去.各个公司与技术人员都在分享微服务架构的相关知识与实践经验,但我们发现,目前网上的这些相关文章中,要么上来就是很有借鉴意义的干货,要么就是以高端的专业术语来讲述何为微服务架构.就是没有一个做到成熟地将技术传播出来,同时完美地照顾"初入微服务领域人员",从 0 开始,采用通俗易懂的语言去讲解微服务架构的系列.所以,我们邀请青柳云的苏槐与 InfoQ 一起共建微服务架构专题

pring Cloud构建微服务架构

SpringCloud-Learning 本项目内容为Spring Cloud教程的程序样例. 作者博客:http://blog.didispace.com Spring Cloud系列博文:http://blog.didispace.com/categories/Spring-Cloud/ Spring Cloud中文社区:http://bbs.springcloud.com.cn/ GitHub:https://github.com/dyc87112/SpringCloud-Learning

解析微服务架构(三):微服务重构应用及IBM解决方案

解析微服务架构系列文章将分几篇描述微服务的定义.特点.应用场景.企业集成架构的演进以及微服务转型思路和技术决策考虑等内容,并以IBM技术为例介绍如何实现微服务架构转型. 上一篇文章介绍了融入微服务的企业集成架构的演进,并介绍交互式系统的微服务模式及技术决策例子. 本篇文章将介绍已有IT应用如何进行微服务重构的转型,以及IBM微服务相关解决方案的介绍. 微服务转型 采用微服务架构意味着以更复杂的运维环境为代价,实现更高速的应用交付及更快推出市场.因此企业需要在更快的交付与更复杂的运维之间进行权衡.

分布式系统(微服务架构)的一致性和幂等性问题相关概念解析

目录 前言 1. 分布式系统的数据一致性 1.1 分布式存储系统中的一致性问题 1.2 微服务应用的分布式一致性问题 1.3 对于一致性的正确理解 2.分布式一致性模型 3. 追求强一致性的约束--CAP定理 3.1 如何理解CAP三要素不可兼得 3.2 如何正确理解CAP定理 4. 一致性的妥协--最终一致性和Base原则 4.1 CAP,BASE以及ACID的关系 5. 分布式系统的幂等性 6.微服务架构的分布式一致性和幂等性问题 6.1 微服务架构下的分布式一致性问题 6.2 微服务架构下

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们应该如何进行网络请求的优化与处理呢? 到底有没有一些好的建议与方案呢? 下面这个文章将揭晓上面的问题,让你对SpringCloud微服务网络请求性能有一个全新的认识. 目录简介 01.网络请求异常分类 02.开发中注意问题 03.原始的处理方式 04.如何减少代码耦合性 05.异常统一处理步骤 06

ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现

这个EventBus的实现是基于微软微服务https://github.com/dotnet-architecture/eShopOnContainers项目的,我把它从项目中抽离出来,打包成nuget包方便大家快速集成到项目中 从Nuget.org中安装 PM> Install-Package Toosame.EventBus.RabbitMQ -Version 1.1.2 使用 共3步: 添加事件 添加事件处理器 从控制器发布事件 1.添加事件 创建YourEvent.cs文件 1 publ

解析微服务架构(二):融入微服务的企业集成架构

上一篇文章介绍了微服务架构的起源.定义.通用特性.常见概念误区.微服务架构与SOA架构比较.微服务架构收益以及企业引入微服务架构的策略. 本文将介绍融入微服务的企业集成架构的演进,并描述交互式系统的微服务模式及相关技术决策,然后给出了一个具体的微服务架构业务应用的例子. 交互型系统(System of Engagement)与记录型系统(System of Record) 随着移动互联网的快速发展,企业除了需要提供传统核心IT系统能力之外,还需提供客户与合作伙伴友好型的以交互为重点的创新及交互式