• 當前位置:首頁 > IT技術 > Web編程 > 正文

    .NET Core(.NET6)中gRPC注冊到Consul
    2022-04-18 10:52:01

    一、簡介

    上一篇文章介紹了.NET Core 中使用gRPC,在微服務中,我們通常要把服務做成服務注冊,服務發現的方式,那么這里來說一下gRPC是如何注冊到Consul中的。

    Consul的安裝這里就不介紹了,在之前的篇文章中已經寫過:Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服務注冊,服務發現

    這里Consul已經安裝好。

    ?

    ?

    ?二、gRPC注冊到Consul

    1.擴展gRPC注冊到Consul封裝類

    這里沿用上一篇的gRPC的代碼,如果服務帶api和gRPC的話用http的方式或gRPC的方式注冊到可以,http的方式上面文章中的Consul注冊和發現中已經有,這里介紹單gRPC的服務的注冊。

    先在appsettings.json中加入Consul信息代碼

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*",
      "Kestrel": {
        "EndpointDefaults": {
          "Protocols": "Http2"
        }
      },
      "Consul": {
        "consulAddress": "http://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,//支持http
                        Timeout = TimeSpan.FromSeconds(5),//超時時間
                        DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5) //服務停止多久后注銷服務
                    }
    
                }).Wait();
                //應用程序終止時,注銷服務
                lifetime.ApplicationStopping.Register(() =>
                {
                    client.Agent.ServiceDeregister(serviceId).Wait();
                });
                return app;
            }
        }

    Program.cs增加使用這個擴展類

    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 https://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: https://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 https://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: https://go.microsoft.com/fwlink/?linkid=2086909");
    
    app.UseConsul(_configuration);
    app.Run();

    到這里服務注冊就完成了,服務發現和上面簡介的鏈接文章中一模一樣,啟動項目查看效果。

    ?

    ?

    ?

    本文摘自 :https://www.cnblogs.com/

    開通會員,享受整站包年服務
    国产呦精品一区二区三区网站|久久www免费人咸|精品无码人妻一区二区|久99久热只有精品国产15|中文字幕亚洲无线码