日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core gRPC 使用 Consul 服务注册发现

發布時間:2023/12/4 asp.net 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core gRPC 使用 Consul 服务注册发现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 前言

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獲取了我們的服務地址,然后調用。

六. 參考資料

  • gRPC in Asp.Net Core :官方文檔

  • GPRC Health Check Doc:點我

  • 本文 Demo:點我

  • 本系列文章目錄:點我

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

  • .NET Core微服務之基于Consul實現服務治理?by Edison Zhou

總結

以上是生活随笔為你收集整理的ASP.NET Core gRPC 使用 Consul 服务注册发现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。