.NET6中如何将gRPC服务注册至Consul?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1087个文字,预计阅读时间需要5分钟。
一、简介本文介绍了.NET Core中使用gRPC,以及在微服务中将服务注册到Consul的方式。
二、gRPC服务注册到Consul
在微服务架构中,我们通常需要将服务注册到服务发现系统中,以便其他服务可以找到并调用它们。Consul是一个流行的服务发现和配置工具,可以与gRPC配合使用。下面将介绍如何将gRPC服务注册到Consul中。
1. 安装ConsulConsul的安装过程请参考官方文档。
2. 配置Consul在Consul的配置文件中,需要添加以下内容:consul-template -config-file /path/to/consul-template.json其中,`consul-template.json`文件内容如下:{ services: [ { name: gRPC_service, address: 127.0.0.1, port: 50051 } ]}这里配置了名为`gRPC_service`的服务,监听在本机的50051端口。
3. 在gRPC服务中集成Consul
(1)添加Consul客户端依赖在gRPC服务的项目中,添加Consul客户端的NuGet包:Install-Package Grpc.Core -Version 1.31.0Install-Package Grpc.Net.Client -Version 1.31.0Install-Package Consul -Version 1.8.0
(2)创建Consul客户端在gRPC服务的代码中,创建Consul客户端实例:csharpvar consulClient=new ConsulClient(k=> k.Address=new Uri(http://127.0.0.1:8500));
(3)注册服务在启动gRPC服务时,使用Consul客户端注册服务:csharpconsulClient.Agent.ServiceRegister(new AgentServiceRegistration(){ ID=Guid.NewGuid().ToString(), Name=gRPC_service, Address=127.0.0.1, Port=50051, Checks=new List() { new AgentServiceCheck() { HTTP=http://127.0.0.1:50051/health, Interval=TimeSpan.FromSeconds(10), Timeout=TimeSpan.FromSeconds(5) } }});
(4)注销服务在关闭gRPC服务时,使用Consul客户端注销服务:csharpconsulClient.Agent.ServiceDeregister(gRPC_service);
通过以上步骤,可以将gRPC服务注册到Consul中,实现服务发现和配置。需要注意的是,Consul的安装和配置过程在这里不详细介绍。
一、简介上一篇文章介绍了.NET Core 中使用gRPC,在微服务中,我们通常要把服务做成服务注册,服务发现的方式,那么这里来说一下gRPC是如何注册到Consul中的。
Consul的安装这里就不介绍了,在之前的篇文章中已经写过:Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现
这里Consul已经安装好。
二、gRPC注册到Consul 1.扩展gRPC注册到Consul封装类这里沿用上一篇的gRPC的代码,如果服务带api和gRPC的话用127.0.0.1:8500", "serviceName": "api_gRPC", "currentIp": "127.0.0.1", "currentPort": "5246" } }
然后新建ConsulRegister.cs封装注册到Consul的类
/// <summary> /// Consul注册 /// </summary> public static class ConsulRegister { //服务注册 public static IApplicationBuilder UseConsul(this IApplicationBuilder app, IConfiguration configuration) { // 获取主机生命周期管理接口 var lifetime = app.ApplicationServices.GetRequiredService<IHostApplicationLifetime>(); ConsulClient client = new ConsulClient(c => { c.Address = new Uri(configuration["Consul:consulAddress"]); c.Datacenter = "dc1"; }); string ip = configuration["ip"]; //优先接收变量的值 string port = configuration["port"]; //优先接收变量的值 string currentIp = configuration["Consul:currentIP"]; string currentPort = configuration["Consul:currentPort"]; ip = string.IsNullOrEmpty(ip) ? currentIp : ip; //当前程序的IP port = string.IsNullOrEmpty(port) ? currentPort : port; //当前程序的端口 string serviceId = $"service:{ip}:{port}";//服务ID,一个服务是唯一的 //服务注册 client.Agent.ServiceRegister(new AgentServiceRegistration() { ID = serviceId, //唯一的 Name = configuration["Consul:serviceName"], //组名称-Group Address = ip, //ip地址 Port = int.Parse(port), //端口 Tags = new string[] { "api站点" }, Check = new AgentServiceCheck() { Interval = TimeSpan.FromSeconds(10),//多久检查一次心跳 GRPC = $"{ip}:{port}", //gRPC注册特有 GRPCUseTLS=false,//支持go.microsoft.com/fwlink/?linkid=2099682 // Add services to the container. builder.Services.AddGrpc(); var app = builder.Build(); IConfiguration _configuration = builder.Configuration; // Configure the HTTP request pipeline. app.MapGrpcService<GreeterService>(); app.MapGrpcService<OrderService>(); app.MapGrpcService<HealthCheckService>(); app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: go.microsoft.com/fwlink/?linkid=2086909"); app.UseConsul(_configuration); app.Run(); 2.创建健康检查gRPC服务
1.新建健康检查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); }
2.新建健康检查服务实现上面proto协议HealthCheckService.cs
public class HealthCheckService : Health.HealthBase { public override Task<HealthCheckResponse> Check(HealthCheckRequest request, ServerCallContext context) { Console.WriteLine($"This is {nameof(HealthCheckService)} Check "); //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.在Program.cs中把服务注册到gRPC管道
using GrpcDemo.Service.Services; using GrpcDemo.Service.Utils; var builder = WebApplication.CreateBuilder(args); // Additional configuration is required to successfully run gRPC on macOS. // For instructions on how to configure Kestrel and gRPC clients on macOS, visit go.microsoft.com/fwlink/?linkid=2099682 // Add services to the container. builder.Services.AddGrpc(); //配置获取 var app = builder.Build(); IConfiguration _configuration = builder.Configuration; // Configure the HTTP request pipeline. app.MapGrpcService<GreeterService>(); app.MapGrpcService<OrderService>(); app.MapGrpcService<HealthCheckService>(); app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: go.microsoft.com/fwlink/?linkid=2086909"); app.UseConsul(_configuration); app.Run();
到这里服务注册就完成了,服务发现和上面简介的链接文章中一模一样,启动项目查看效果。
本文共计1087个文字,预计阅读时间需要5分钟。
一、简介本文介绍了.NET Core中使用gRPC,以及在微服务中将服务注册到Consul的方式。
二、gRPC服务注册到Consul
在微服务架构中,我们通常需要将服务注册到服务发现系统中,以便其他服务可以找到并调用它们。Consul是一个流行的服务发现和配置工具,可以与gRPC配合使用。下面将介绍如何将gRPC服务注册到Consul中。
1. 安装ConsulConsul的安装过程请参考官方文档。
2. 配置Consul在Consul的配置文件中,需要添加以下内容:consul-template -config-file /path/to/consul-template.json其中,`consul-template.json`文件内容如下:{ services: [ { name: gRPC_service, address: 127.0.0.1, port: 50051 } ]}这里配置了名为`gRPC_service`的服务,监听在本机的50051端口。
3. 在gRPC服务中集成Consul
(1)添加Consul客户端依赖在gRPC服务的项目中,添加Consul客户端的NuGet包:Install-Package Grpc.Core -Version 1.31.0Install-Package Grpc.Net.Client -Version 1.31.0Install-Package Consul -Version 1.8.0
(2)创建Consul客户端在gRPC服务的代码中,创建Consul客户端实例:csharpvar consulClient=new ConsulClient(k=> k.Address=new Uri(http://127.0.0.1:8500));
(3)注册服务在启动gRPC服务时,使用Consul客户端注册服务:csharpconsulClient.Agent.ServiceRegister(new AgentServiceRegistration(){ ID=Guid.NewGuid().ToString(), Name=gRPC_service, Address=127.0.0.1, Port=50051, Checks=new List() { new AgentServiceCheck() { HTTP=http://127.0.0.1:50051/health, Interval=TimeSpan.FromSeconds(10), Timeout=TimeSpan.FromSeconds(5) } }});
(4)注销服务在关闭gRPC服务时,使用Consul客户端注销服务:csharpconsulClient.Agent.ServiceDeregister(gRPC_service);
通过以上步骤,可以将gRPC服务注册到Consul中,实现服务发现和配置。需要注意的是,Consul的安装和配置过程在这里不详细介绍。
一、简介上一篇文章介绍了.NET Core 中使用gRPC,在微服务中,我们通常要把服务做成服务注册,服务发现的方式,那么这里来说一下gRPC是如何注册到Consul中的。
Consul的安装这里就不介绍了,在之前的篇文章中已经写过:Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现
这里Consul已经安装好。
二、gRPC注册到Consul 1.扩展gRPC注册到Consul封装类这里沿用上一篇的gRPC的代码,如果服务带api和gRPC的话用127.0.0.1:8500", "serviceName": "api_gRPC", "currentIp": "127.0.0.1", "currentPort": "5246" } }
然后新建ConsulRegister.cs封装注册到Consul的类
/// <summary> /// Consul注册 /// </summary> public static class ConsulRegister { //服务注册 public static IApplicationBuilder UseConsul(this IApplicationBuilder app, IConfiguration configuration) { // 获取主机生命周期管理接口 var lifetime = app.ApplicationServices.GetRequiredService<IHostApplicationLifetime>(); ConsulClient client = new ConsulClient(c => { c.Address = new Uri(configuration["Consul:consulAddress"]); c.Datacenter = "dc1"; }); string ip = configuration["ip"]; //优先接收变量的值 string port = configuration["port"]; //优先接收变量的值 string currentIp = configuration["Consul:currentIP"]; string currentPort = configuration["Consul:currentPort"]; ip = string.IsNullOrEmpty(ip) ? currentIp : ip; //当前程序的IP port = string.IsNullOrEmpty(port) ? currentPort : port; //当前程序的端口 string serviceId = $"service:{ip}:{port}";//服务ID,一个服务是唯一的 //服务注册 client.Agent.ServiceRegister(new AgentServiceRegistration() { ID = serviceId, //唯一的 Name = configuration["Consul:serviceName"], //组名称-Group Address = ip, //ip地址 Port = int.Parse(port), //端口 Tags = new string[] { "api站点" }, Check = new AgentServiceCheck() { Interval = TimeSpan.FromSeconds(10),//多久检查一次心跳 GRPC = $"{ip}:{port}", //gRPC注册特有 GRPCUseTLS=false,//支持go.microsoft.com/fwlink/?linkid=2099682 // Add services to the container. builder.Services.AddGrpc(); var app = builder.Build(); IConfiguration _configuration = builder.Configuration; // Configure the HTTP request pipeline. app.MapGrpcService<GreeterService>(); app.MapGrpcService<OrderService>(); app.MapGrpcService<HealthCheckService>(); app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: go.microsoft.com/fwlink/?linkid=2086909"); app.UseConsul(_configuration); app.Run(); 2.创建健康检查gRPC服务
1.新建健康检查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); }
2.新建健康检查服务实现上面proto协议HealthCheckService.cs
public class HealthCheckService : Health.HealthBase { public override Task<HealthCheckResponse> Check(HealthCheckRequest request, ServerCallContext context) { Console.WriteLine($"This is {nameof(HealthCheckService)} Check "); //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.在Program.cs中把服务注册到gRPC管道
using GrpcDemo.Service.Services; using GrpcDemo.Service.Utils; var builder = WebApplication.CreateBuilder(args); // Additional configuration is required to successfully run gRPC on macOS. // For instructions on how to configure Kestrel and gRPC clients on macOS, visit go.microsoft.com/fwlink/?linkid=2099682 // Add services to the container. builder.Services.AddGrpc(); //配置获取 var app = builder.Build(); IConfiguration _configuration = builder.Configuration; // Configure the HTTP request pipeline. app.MapGrpcService<GreeterService>(); app.MapGrpcService<OrderService>(); app.MapGrpcService<HealthCheckService>(); app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: go.microsoft.com/fwlink/?linkid=2086909"); app.UseConsul(_configuration); app.Run();
到这里服务注册就完成了,服务发现和上面简介的链接文章中一模一样,启动项目查看效果。

