一. 前言

gRPC 在当前最常见的应用就是在微服务场景中,所以不可避免的会有服务注册与发现问题,我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心,本文主要介绍Consul。

二. Consul 介绍

Consul是一种服务网络解决方案,可跨任何运行平台以及公共或私有云来连接和保护服务。它可以让你发现服务并保护网络流量。它可以在Kubernetes中使用,实现服务发现和服务网格功能(k8s默认etcd)。 提供安全服务通讯,保护和观察服务之间的通信,而无需修改其代码。 提供动态负载平衡, 使用Consul和HAProxy,Nginx或F5自动执行负载均衡器配置。 Consul 可以用于服务发现和服务网格。

翻译自官网

三. Consul 安装配置

安装

Consul 下载地址: https://www.consul.io/downloads.html

根据自己的系统来选择,我这里选择的是 Windows 版本的,直接解压即可运行。

启动

consul agent -dev -ui

本文不详细介绍Consul使用,如需请自行查看相关资料

四. .NET Core Consul 客户端的选择

Consul 提供了 HTTP API 的方式来进行通讯,我们可以直接调用API或者是使用第三方封装好的客户端组件,通过Nuget搜索可以发现许多。

这里面我没有一一测试,但是目前使用量最多的 Consul 组件是不支持设置 GRPC 健康检查的,而且 github 也停止了更新。

所以我 Fork 了这个仓库,然后添加了 GRPC 的健康检查支持,本文也将使用这个库,欢迎大家使用:

因为原仓库已经 Archived 了,所以我才 Fork 了自己改一下,改动很小,不影响原来的稳定性。

Nuget: https://www.nuget.org/packages/NConsul/

Github:https://github.com/stulzq/NConsul

求个star

关于支持 GPRC 健康检查的好处:

偷个懒,不翻译了,摘自GRPC官方文档

五. 注册GRPC服务与健康检查

基于前文(ASP.NET Core 使用gRPC)的Demo

1.为服务端项目安装 NConsul.AspNetCore ( https://www.nuget.org/packages/NConsul.AspNetCore )

这里面对 AspNetCore 做了适配,使用简单。

2.在 Startup 的 ConfigureServices方法内进行配置

public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc(); services.AddConsul("http://localhost:8500")
.AddGRPCHealthCheck("localhost:5000")
.RegisterService("grpctest","localhost",5000,new []{"xc/grpc/test"});
}

AddConsul 添加 Consul Server 地址。

AddGRPCHealthCheck 添加 GRPC 健康检查,即健康检查走的是 GRPC 协议,该值为 GRPC 服务的地址,不需要path不需要提供 http/https

RegisterService 注册服务

到这步,还不能启动运行,如果运行健康检查是会失败的。

3.编写 Health Check 服务 **

对于 GRPC 的健康检查,官方有标准的定义,新建一个 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 异常,不能提供服务

最后别忘了注册服务:

4.测试运行

启动 GRPC 服务

然后访问 http://localhost:8500/ui 访问 Consul 控制台

可以看到服务成功注册,并且健康检查也是通过了的。通过控制台日志,还可以看到健康检查的请求:

六. 客户端使用服务发现

客户端项目安装 Consul 组件,然后改造下代码:

static async Task Main(string[] args)
{
var serviceName = "grpctest";
var consulClient = new ConsulClient(c => c.Address = new Uri("http://localhost:8500"));
var services = await consulClient.Catalog.Service(serviceName);
if (services.Response.Length == 0)
{
throw new Exception($"未发现服务 {serviceName}");
} var service = services.Response[0];
var address = $"http://{service.ServiceAddress}:{service.ServicePort}"; Console.WriteLine($"获取服务地址成功:{address}"); //启用通过http使用http2.0
AppContext.SetSwitch(
"System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
var channel = GrpcChannel.ForAddress(address);
var catClient = new LuCat.LuCatClient(channel);
var catReply = await catClient.SuckingCatAsync(new Empty());
Console.WriteLine("调用撸猫服务:"+ catReply.Message);
Console.ReadKey();
}

通过服务名称获取服务地址,然后来进行访问。

运行测试:

可以看到,成功的从Consul获取了我们的服务地址,然后调用。

六. 参考资料

ASP.NET Core gRPC 使用 Consul 服务注册发现的更多相关文章

  1. (8)ASP.NET Core3.1 Ocelot Consul服务注册与发现

    1.服务注册与发现(Service Discovery) ●服务注册:我们通过在每个服务实例写入注册代码,实例在启动的时候会先去注册中心(例如Consul.ZooKeeper.etcd.Eureka) ...

  2. Asp.Net Core入门之自定义服务注册

    谈到服务注册,首先我们先了解一下服务注册时使用的三种方式,也代表了不同的服务生命周期: AddTransient AddScoped AddSingleton AddSingleton生命周期最长,其 ...

  3. ASP.NET Core gRPC 入门全家桶

    一. 说明 本全家桶现在只包含了入门级别的资料,实战资料更新中. 二.官方文档 gRPC in Asp.Net Core :官方文档 gRPC 官网:点我跳转 三.入门全家桶 正片: ASP.NET ...

  4. ASP.NET Core gRPC 健康检查的实现方式

    一. 前言 gRPC 服务实现健康检查有两种方式,前面在此文 ASP.NET Core gRPC 使用 Consul 服务注册发现 中有提到过,这里归纳整理一下.gRPC 的健康检查,官方是定义了标准 ...

  5. spring-cloud-consul 服务注册发现与配置

    下面是 Spring Cloud 支持的服务发现软件以及特性对比(Eureka 已停止更新,取而代之的是 Consul): Feature euerka Consul zookeeper etcd 服 ...

  6. Ubuntu & Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践

    相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...

  7. Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践

    相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...

  8. python与consul 实现gRPC服务注册-发现

    背景 通过对gRPC的介绍我们知道,当正常启动服务后,我们只需要知道ip,port就可以进行gRPC的连接.可以想到,这种方式并不适合用于线上环境,因为这样直连的话就失去了扩展性,当需要多机部署的时候 ...

  9. ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系

    ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...

随机推荐

  1. 解析fiddler返回的部分数据。

    1.通过抓包获取的数据,里面包含的哪些内容是需要我们去关注的? 2.首先上图. 3.图片说明: 此图片中是利用豆瓣API提供的接口实现返回数据.内容与抓包返回的内容格式一致 url:https://a ...

  2. springboot 配置文件乱码的问题

    设置 如图 如果新建的项目直接更改第一处就可以了,如果是从github等第三方也就是项目已经存在的时候,要操作第2至3步

  3. mySQL的安装过程---二进制和源码安装

    安装 mysql 源码包安装 优化基础源 [root@db03 ~]# vim /etc/yum.repos.d/CentOS-Base.repo 安装依赖包 [root@db03 ~]# yum i ...

  4. Java网络编程(二)IP、URL和HTTP

    一.IP InetAddress类有一些静态工厂方法,可以连接到DNS服务器来解析主机名. 示例1:InetAddress address = InetAddress.getByName(" ...

  5. nginx基于uwsgi部署Django

    1.安装nginx yum install -y nginx(需要epel源) 2.安装uwsgi yum groupinstall "Development tools" yum ...

  6. postman的基本用法,请求,断言,环境变量

    postman基本用法 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件. 它提供功能强大的 Web API & HTTP 请求调试. 它能够发送任何类型的HTT ...

  7. 从函数计算架构看 Serverless 的演进与思考

    作者 | 杨皓然  阿里巴巴高级技术专家 导读:云计算之所以能够成为 DT 时代颠覆性力量,是因为其本质是打破传统架构模式.降低成本并简化体系结构,用全新的思维更好的满足了用户需求.而无服务器计算(S ...

  8. Bash 通配符、正则表达式、扩展正则表达式

    BASH中的通配符(wildcard) *:任意长度的任意字符. ?:任意单个字符 []:匹配范围 [^]:排除匹配范围 [:alnum:]:所有字母和数字 [:alpha:]:所有字母 [:digi ...

  9. 学习笔记39_EF的DAL层(精)

    通用的分页查询 public IQueryable<UserInfo> GetPage<T>(int pageSize,int pageIndex,out int total, ...

  10. golang 包依赖管理 godep 使用

    介绍: godep是解决包依赖的管理工具,目前最主流的一种,原理是扫描记录版本控制的信息,并在go命令前加壳来做到依赖管理. 1.安装: go get github.com/tools/godep 2 ...