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的微服务系列
相关文章:
网易伏羲论文入选 CVPR:AI 感知表情能力或实现巨大突破!
出品 | AI科技大本营(ID:rgznai100)2月28日,人工智能顶级会议CVPR 2021(国际计算机视觉与模式识别会议,Conference onComputer Vision and Pattern Recognition)公布论文录取结果,网易伏羲共有3…

asp.net/c#字符格式化大总结
一、用{0:?}格式化可通过 String.Format 方法或通过 Console.Write 方法格式化数值结果,其中后一种方法调用 String.Format。使用格式字符串指定格式。下表包含受支持的标准格式字符串。格式字符串采用的形式为 Axx,其中 A 为“格式说明符”,…

小鱼提问1 类中嵌套public修饰的枚举,外部访问的时候却只能Class.Enum这样访问,这是为何?...
/// <summary>/// 常量等定义/// </summary>public class General{/// <summary>/// 文件类型/// </summary>public enum FileType{}}小鱼提问:都是public修饰,为何外部只能General.FileType这样访问?既然外部都不能…

radio根据name 获取选中值及判断是否被选中
$(input:radio[name"fjscfs"]:checked).val();根据id判断是否被选中if($("#A26").is(":checked")){}根据class判断是否被选中if($(".A26").is(":checked")){}转载于:https://blog.51cto.com/ty2538402559/1949828

ASP.NET中用healthMonitor属性用
在ASP.NET 2.0中,可以使用healthMonitoring属性监测事件。healthMonitoring属性是一个基于方法的provider,在这里可以构造自己的provider。利用healthMonitoring属性,我们可以诸如记录错语、成功的事件等,对不同的数据源ÿ…

用 Python 动态可视化,看看比特币这几年
作者 | 刘早起来源 | 早起Python头图 | 下载于视觉中国最近几年,一直站在风口浪尖的比特币被追捧为最佳的投资产品,拥护者们认为这种加密货币是一种类似于黄金的储值工具,可以对冲通胀和美元疲软。其他人则认为,比特币的暴涨只是一…

违规用户处理办法
2019独角兽企业重金招聘Python工程师标准>>> 1.简单设置用户信赖状态 给用户设置信任字段,0不可信任,1默认许可(默认值),2可信赖用户 当用户违规后,对其进行惩罚并设置其为 不可信赖状态&#…

linux同步软件
linux同步软件:scp,rsync,inotify,sersync一、scpscp就是secure copy,是用来进行远程文件拷贝的。数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 。 与rcp 不同的是,scp 在需要进行验证时会要求你…

C语言内联函数
内联函数也称内嵌函数,它主要解决程序的运行效率。 #####################问题######################################### 函数调用需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些转移都需要时间开销。 有些函数在程序…

Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum 6. Code: class Solution { public:int …

从Python到AI,这条路好走吗?
大家都在学Python的时候,怎么才能让自己更有竞争力?Python 的应用方向有很多,基本每个方向都是大热门,但至今为止,人工智能行业仍处于人才稀缺的情况。正因这样,近几年来,AI 成为了广大 Python …

微信小程序server-1-搭建HTTPS server
一.使用 Node 和 Express 搭建一个 HTTP 服务器 1.在app.js修改小程序通信域名 App({config: {host: // 这个地方填写你的域名},onLaunch () {console.log(App.onLaunch());} }); 2.安装 NodeJS 和 NPM yum install nodejs npm -y node -v 3.编写HTTP服务源码 touch package.j…

被“钱”困住的开源开发者们!
「Given enough eyeballs,all bugs are shallow.」(只要有足够多的眼睛,就可以让所有 Bug 浮现)1997 年,随着《大教堂与集市》的到来,开源新时代的号角正式吹响,也将 Linus 法则深深地烙印在开源…

PHP连接MySQL的2种方法以及防止乱码
PHP的MySQL配置 报错信息:Class mysqli not found in Answer: 1.在conf/php.ini中,在vim用"/php_mysql"搜索到extensionphp_mysql.dll,去掉前面的";", 同时在下面增加extensionphp_mysqli.dll; 注意后面那个dll多了个i 2."/extension_dir&…

nodejs npm install -g 全局安装和非全局安装的区别
1. npm install xxx -g 时, 模块将被下载安装到【全局目录】中。 【全局目录】通过 npm config set prefix "目录路径" 来设置。 比如说,当我们使用了npm install -g express安装了express框架后, 我们就可以在电脑里的某一个文件夹…

Windows平台上实现P2P服务(三)
2019独角兽企业重金招聘Python工程师标准>>> 我们已经建立好一个UDP的服务程序了,下面我们要给这个服务程序添加服务内容了。 其服务内容将根据通讯的客户端请求来进行定义和处理。首先我们再回顾一下通讯内容的定义: /// <summary>信息…

ASP.NET 2.0数据处理之高级分页/排序
GridView控件中的"选择"操作纯粹是一个UI概念,它的SelectedIndex属性与表格的可视数据行中的当前被选中的行的索引相对应。如果你启用了表格的分页和排序功能,在执行分页或排序操作之后,SelectedIndex的值仍然不会变化,…

rpcgen的简单讲解及例子程序
rpcgen 简介 rpcgen可以自动生成RPC服务器程序的大多数代码,它的输入为一个规格说明文件,它的输出为一个C语言的源程序。规格文件(*.x)包含常量、全局数据类型以及远程过程的声明。Rpcgen产生的代码包含了实现客户机和服务器程序所…

Python 捕获警告
来源 | 写代码的明哥责编 | 寇雪芹头图 | 下载于视觉中国警告不是异常你是不是经常在使用一些系统库或者第三方模块的时候,发现一些既不是异常也不是错误的警告信息?这些经常出现的警告信息,容易让新手造成一些误判,以为是程序出错…

python装饰器+迭代器+生成器
1.函数嵌套:在调用一个函数的过程中,调用了其他函数 def f1():x1def f2():print(from f2)f2() f1() 2.名称空间与作用域 a. 名称空间:存放名字与变量值绑定关系的地方 (1)内置名称空间:在python解释器启动…

ASP.NET中绑定枚举类型
在项目开发中好多地方用了枚举,要把枚举显示到下拉列表框中我们平常的方法就是在下拉列表控件中一个一个添加进去!这样做也行但如果我的枚举类型中的枚举值一旦改变,那么你就得满世界的去找然后再修改很麻烦。这里我有反射动态的绑定枚举值就…

Java 领域offer收割:程序员黄金 5 年进阶心得!
怎样才能拿到大厂的offer?没有掌握绝对的技术,那么就要不断的学习。如何拿下阿里等大厂的offer的呢,今天分享一个秘密武器,资深架构师整理的Java核心知识点,面试时面试官必问的知识点,篇章包括了很多知识点…

视频专辑:Photoshop基础视频教程
为什么80%的码农都做不了架构师?>>> 专辑:Photoshop基础视频教程 简介:Photoshop基础视频教程 1 1. 软件界面介绍 [photoshop基础教程] 2013-10-31 11:56 | 播放(6) | 评论(0) | 时长:42:44 2 2. 工行LOGO分析及制作1 [photoshop基础教程…

linux运维如何月薪过万?(收藏自用)
作者:汤哥在北京链接:https://www.zhihu.com/question/27505552来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。IT行业,是近些年相当火的一个专业,从事于IT行业的工作人员也…

当深度学习遇上图: 图神经网络的兴起 | 赠书
什么是图也许我们从来没有意识到,我们正生活在一个充满图的世界。例如,我们最熟悉的社交网络(如下图所示),就是一个最典型的图。在计算机领域,我们通常用图指代一种广义的抽象结构,用来表示一堆…

Asp.net 2.0 中将网站首页生成静态页的一个比较好的方法
做网站时,有时为了提高性能会将网站首页生成静态页(当然, Asp.net中页面缓存也是一个不错的选择了 将页面生成静态的方法有多中,据不完全统计有N种(N>1) 呵呵 以下的方法来自 "孟子E " 解释的方法 代码如下 protected override void Render(HtmlTextWriter wri…

[转]解决Eclipse中编辑xml文件的智能提示问题
转自:http://hi.baidu.com/cghroom/item/48fd2d0dc1fc23c675cd3c3e 摘要: Eclipse for Android xml 文件代码自动提示功能,介绍Eclipse 编辑器中实现xml 文件代码自动智能提示功能,解决eclipse 代码提示失效、eclipse 不能自动提…

温水里的程序员,技术将淘汰一切。
七月,炎炎的夏日,疯狂的暴雨不分昼夜,侵袭着这座城。早上七点,我骑着摩拜单车出发去往地铁站,誓死如归一般的,挤进地铁。像往常一样,骑车、挤地铁、打卡上班。相 信大家都跟我一样,未…

ASP.net 2.0下应用程序离线信息
ASP.net 2.0 有一个新特性,就是支持应用程序离线信息。 什么是离线信息呢?以前我们在更新应用程序,导至asp.net应用程序重启,应用程序的用户通常会显示不友好的错误信息,或者IE一直显示加载状态。 ASP.net 2.0支持您…

Lync server 2013 之office web apps server 搭建步骤
office web apps server 搭建步骤:一、.NET Framework 4.5 节点下的HTTP 激活.NET Framework 3.5Windows Identity Foundation 3.5Add-WindowsFeature Web-Server,Web-Mgmt-Tools,Web-Mgmt-Console,Web-WebServer,Web-Common-Http,Web-Default-Doc,Web-Static-Conte…