信阳网站建设找汉狮,搭建网站知识,福州住房和建设局网站,城乡建设厅官方网站办事大厅一. 前言gRPC 在当前最常见的应用就是在微服务场景中#xff0c;所以不可避免的会有服务注册与发现问题#xff0c;我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心#xff0c;本文主要介绍Consul。二. Consul 介绍Consul是一种服务网络解决方案所以不可避免的会有服务注册与发现问题我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心本文主要介绍Consul。二. Consul 介绍Consul是一种服务网络解决方案可跨任何运行平台以及公共或私有云来连接和保护服务。它可以让你发现服务并保护网络流量。它可以在Kubernetes中使用实现服务发现和服务网格功能k8s默认etcd。提供安全服务通讯保护和观察服务之间的通信而无需修改其代码。提供动态负载平衡 使用Consul和HAProxyNginx或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 了自己改一下改动很小不影响原来的稳定性。Nugethttps://www.nuget.org/packages/NConsul/Githubhttps://github.com/stulzq/NConsul求个star 关于支持 GPRC 健康检查的好处偷个懒不翻译了摘自GRPC官方文档五. 注册GRPC服务与健康检查基于前文ASP.NET Core 使用gRPC的Demo1.为服务端项目安装 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/httpsRegisterService 注册服务到这步还不能启动运行如果运行健康检查是会失败的。3.编写 Health Check 服务 **对于 GRPC 的健康检查官方有标准的定义新建一个 proto 文件命名为 HealthCheck.protosyntax 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);}这里面的内容不得更改是官方标准资料见后文这里编译一下项目以便自动生成代码。然后添加一个服务的实现类 HealthCheckServicepublic class HealthCheckService:Health.HealthBase{ public override TaskHealthCheckResponse Check(HealthCheckRequest request, ServerCallContext context) { //TODO:检查逻辑 return Task.FromResult(new HealthCheckResponse(){Status HealthCheckResponse.Types.ServingStatus.Serving}); } public override async Task Watch(HealthCheckRequest request, IServerStreamWriterHealthCheckResponse 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点我本系列文章目录点我NConsulhttps://github.com/stulzq/NConsul.NET Core微服务之基于Consul实现服务治理 by Edison Zhou