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

异常,不能提供服务

最后别忘了注册服务:

健康检查服务访问日志

三. 方法二

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

通过 Nuget 安装 Grpc.HealthCheck

然后添加一个实现类 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 });
    }
}

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

四. 参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

如何设计一个牛逼的文件搬运工?

之前讨论零拷贝的时候,我们知道,两台机器之间传输文件,最快的方式就是 send file,众所周知,在 Java 中,该技术对应的则是 FileChannel ...

7510
来自专栏码匠的流水账

聊聊rocketmq的AclClientRPCHook

rocketmq-remoting-4.5.2-sources.jar!/org/apache/rocketmq/remoting/RPCHook.java

8020
来自专栏学院君的专栏

Go 语言网络编程系列(六)—— RPC 编程篇:服务端与客户端 RPC 调用实现

关于 HTTP 编程我们先简单介绍到这里,后面介绍 Web 编程时还会详细展开。今天,我们来简单介绍下 Go 语言的 RPC 编程,这在微服务开发中很有用。

9030
来自专栏瓜农老梁

gRPC示例初探【实战笔记】

备注:Will try to greet world ...这条日志在Client端访问Server前打印;Greeting: Hello world 这条日志...

7010
来自专栏测试技术圈

门面出租-测试工具中的设计模式实例谈之门面模式

本文将以TestLinkAPI为案例,介绍门面模式(Facader Pattern)以及在TestLinkAPI中利用此模式提供统一对外服务接口,提高用户使用便...

7210
来自专栏学院君的专栏

Go 语言网络编程系列(七)—— RPC 编程篇:默认编解码工具 Gob

Gob 是 Go 语言的一个序列化数据结构的编码解码工具,在 Go 标准库中内置了 encoding/gob 包以供使用。一个数据结构使用 Gob 进行序列化之...

10660
来自专栏猿天地

我所经历的一次Dubbo服务雪崩,这是一个漫长的故事

这周,笔者经历了一次服务雪崩。服务雪崩,听到这个词就能想到问题的严重性。是的,整个项目,整条业务线都挂了,从该业务线延伸出来的下游业务线也跟着凉了。笔者是连续三...

9530
来自专栏码匠的流水账

聊聊rocketmq的AclClientRPCHook

rocketmq-remoting-4.5.2-sources.jar!/org/apache/rocketmq/remoting/RPCHook.java

3600
来自专栏可能是东半球最正规的API社区

连续研发【附近的人】---swoole love thrift 3000 ci第二篇(十)

连续研发【附近的人】---swoole love thrift 3000 ci(十)

5820
来自专栏搜云库技术团队

从零开始搭建创业公司后台技术栈

有点眼晕,以上只是我们会用到的一些语言的合集,而且只是语言层面的一部分,就整个后台技术栈来说,这只是一个开始,从语言开始,还有很多很多的内容。今天要说的后台是大...

14110

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励