zoukankan      html  css  js  c++  java
  • ASP.NET Core gRPC 健康检查的实现方式

    一. 前言

    gRPC 服务实现健康检查有两种方式,前面在此文 ASP.NET Core gRPC 使用 Consul 服务注册发现 中有提到过,这里归纳整理一下。gRPC 的健康检查,官方是定义了标准的规则也就是 proto 的,所以这两种方式都大同小异。

    二. 方法一

    自己手动添加 proto 文件,然后自己实现健康检查服务。

    新建一个 proto 文件,命名为 HealthCheck.proto

    syntax = "proto3";
    
    package grpc.health.v1;
    
    message HealthCheckRequest {
    	string service = 1;
    }
    
    message HealthCheckResponse {
    	enum ServingStatus {
    		UNKNOWN = 0;
    		SERVING = 1;
    		NOT_SERVING = 2;
    	}
    	ServingStatus status = 1;
    }
    
    service Health {
    	rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
    
    	rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
    }
    

    这里面的内容不得更改,是官方标准,资料见后文

    这里编译一下项目,以便自动生成代码。

    然后,添加一个服务的实现类 HealthCheckService

    public class HealthCheckService:Health.HealthBase
    {
        public override Task<HealthCheckResponse> Check(HealthCheckRequest request, ServerCallContext context)
        {
            //TODO:检查逻辑
            return Task.FromResult(new HealthCheckResponse(){Status = HealthCheckResponse.Types.ServingStatus.Serving});
        }
    
        public override async Task Watch(HealthCheckRequest request, IServerStreamWriter<HealthCheckResponse> responseStream, ServerCallContext context)
        {
            //TODO:检查逻辑
            await responseStream.WriteAsync(new HealthCheckResponse()
                {Status = HealthCheckResponse.Types.ServingStatus.Serving});
        }
    }
    

    示例代码直接返回了检查结果,实际使用中应该在这里编写检查逻辑,然后根据情况返回相应的检查结果。检查结果有3种情况:

    结果类型 说明
    Unknown 未知状态
    Serving 正常
    NotServing 异常,不能提供服务

    最后别忘了注册服务:

    image-20191127151059008

    健康检查服务访问日志

    image-20191127151727397

    三. 方法二

    不用手动创建 proto 文件,直接安装官方的现成组件,这里面包含了通过上面的标准 proto 文件生成的类。所以重写实现类就行了。

    通过 Nuget 安装 Grpc.HealthCheck

    image-20191128130433269

    然后添加一个实现类 HealthCheckService 继承 HealthServiceImpl 最后重写方法,然后主要代码都适合上面一致的:

    public class HealthCheckService:HealthServiceImpl
    {
        public override Task<HealthCheckResponse> Check(HealthCheckRequest request, ServerCallContext context)
        {
            //TODO:检查逻辑
            return Task.FromResult(new HealthCheckResponse() { Status = HealthCheckResponse.Types.ServingStatus.Serving });
        }
    
        public override async Task Watch(HealthCheckRequest request, IServerStreamWriter<HealthCheckResponse> responseStream, ServerCallContext context)
        {
            //TODO:检查逻辑
            await responseStream.WriteAsync(new HealthCheckResponse()
                { Status = HealthCheckResponse.Types.ServingStatus.Serving });
        }
    }
    

    后面操作步骤和方式一完全一样,此处省略。

    四. 参考资料

  • 相关阅读:
    ASP.NET MVC 重点教程一周年版 第二回 UrlRouting
    ASP.NET MVC 重点教程一周年版 第三回 Controller与View
    DynamicData for Asp.net Mvc留言本实例 下篇 更新
    Asp.net MVC视频教程 18 单选与复选框
    使用ASP.NET MVC Futures 中的异步Action
    ASP.NET MVC RC 升级要注意的几点
    ATL、MFC、WTL CString 的今生前世
    msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
    关于Windows内存的一些参考文章
    Windows访问令牌相关使用方法
  • 原文地址:https://www.cnblogs.com/stulzq/p/11949338.html
Copyright © 2011-2022 走看看