失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > .net core grpc consul 实现服务注册 服务发现 负载均衡(二)

.net core grpc consul 实现服务注册 服务发现 负载均衡(二)

时间:2018-10-04 14:21:17

相关推荐

.net core grpc consul 实现服务注册 服务发现 负载均衡(二)

在上一篇.net core grpc 实现通信(一)中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在.net core grpc 通信 的基础上加上 服务注册,服务发现,负载均衡。

如对.net core grpc 通信不太熟悉的,可以看上一篇.net core grpc 实现通信(一),然后再看本篇。

grpc(https://grpc.io/)是google发布的一个开源、高性能、通用RPC(Remote Procedure Call)框架,使用HTTP/2协议,支持多路复用,并用ProtoBuf作为序列化工具,提供跨语言、跨平台支持。

Consul(https://www.consul.io)是一个分布式,高可用、支持多数据中心的服务注册、发现、健康检查和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发。

本次服务注册、发现 通过ConsulApi 来实现,开发过程中结合.net core 依赖注入,切面管道思想等。

软件版本

.net Core:2.0

grpc:1.11.0

Consul:1.1.0

ConsulNuget注册组件:0.7.2.5

项目结构

.net core 代码部分:

Snai.GrpcClient 客户端 .net core 2.0控制台程序

Snai.GrpcService.Hosting 服务端宿主,Api服务注册, core 2.0网站程序

Snai.GrpcService.Impl 协议方法实现 .net standard 2.0类库

Snai.GrpcService.Protocol 生成协议方法.net standard 2.0类库

Consul:

conf 配置目录,本次用api注册服务,可以删除

data 缓存数据目录,可清空里面内容

dist Consul UI目录,本次用默认的UI,可以删除

consul.exe 注册软件

startup.bat 执行脚本

项目实现

一、服务端

服务端主要包括Grpc服务端,Consul Api服务注册、健康检查等。

新建Snai.GrpcService解决方案,由于这次加入了 Consul Api 服务注册,所以我们先从 Api 服务注册开始。

1、实现Consul Api 服务注册

新建Snai.GrpcService.Hosting基于 Core 2.0空网站,在 依赖项 右击 管理NuGet程序包 浏览 找到Consul 版本0.7.2.5安装,用于Api服务注册使用

新建 appsettings.json 配置文件,配置 GrpcService Grpc服务端IP和端口,HealthService健康检测名称、IP和地址,ConsulServiceConsul的IP和端口,代码如下

新建Consul目录,用于放Api注册相关代码

在Consul目录下新建Entity目录,在Entity目录下新建HealthService.cs,ConsulService.cs类,分别对应HealthService,ConsulService两个配置项,代码如下

HealthService.cs

ConsulService.cs

Consul 目录下新建 AppRregister.cs 类,添加 IApplicationBuilder 扩展方法RegisterConsul,来调用 Consul Api 实现服务注册,代码如下

修改 Startup.cs 代码

加入 Startup(IConfiguration configuration) 构造函数,实现配置注入,如果建的是Web Api或MVC网站,默认是有的

修改 ConfigureServices(IServiceCollection services) 方法,注册全局配置

修改 Configure() 方法,添加健康检查路由地址 app.Map("/health", HealthMap),调用RegisterConsul 扩展方法实现服务注册

添加 HealthMap(IApplicationBuilder app) 实现health路由。由于只有一个健康检查地址,所以没有建Web Api网站,只建了个空网站

代码如下,注册配置GrpcService 、注册Rpc服务、启动Rpc服务 后面用到等下讲

修改 Program.cs 代码,调置网站地址为 .UseUrls("http://localhost:5021"),代码如下

到此 Consul Api 服务注册 已完成,最终项目结构如下:

2、协议编写,将协议生成C#代码

由于在上一篇.net core grpc 实现通信(一)有过介绍,这里就简单说下

新建 Snai.GrpcService.Protocol协议类库项目,在 依赖项 右击 管理NuGet程序包 浏览 找到 Grpc.Core 版本1.11.0,Google.Protobuf 版本3.5.1 包下载安装

在根目录下新建msg.proto 文件,编写基于proto3语言的协议代码,用于生成各语言协议,msg.proto 代码如下

新建.net framework项目类库,引用安装 Grpc.Tools、Google.Protobuf.Tools 组件程序包,分别得到grpc_csharp_plugin.exe、protoc.exe 工具

protoc.exe

在Snai.GrpcService.Protocol根目录下新建ProtocGenerate.cmd 文件,在其中输入以下指令

protoc -I . --csharp_out . --grpc_out . --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe msg.proto

然后直接双击运行,项目下生成了“Msg.cs”和“MsgGrpc.cs”两个文件,这样协议部分的所有工作就完成了,最终项目结构如下:

3、编写协议实现代码

新建 Snai.GrpcService.Impl 实现类库项目,在 依赖项 下载安装Grpc.Core 包,项目引用 Snai.GrpcService.Protocol

Entity目录下新建 GrpcService.cs 类,对应 Snai.GrpcService.Hosting 项目下 appsettings.json 配置文件的 GrpcService 配置项,代码如下

在根目录下RpcService 目录下新建,在RpcService 目录下新建MsgServiceImpl.cs 类,继承 MsgService.MsgServiceBase 协议类,实现服务方法,代码如下

在根目录下新建IRpcConfig.cs接口,定义 Start() 用于Rpc启动基方法,代码如下

在根目录下新建 RpcConfig.cs 类,用于实现 IRpcConfig.cs 接口,启动Rpc服务,代码如下

在回到Snai.GrpcService.Hosting项目中,在 Startup.cs 中 ConfigureServices 中注册GrpcService配置、注册Rpc服务,在 Configure 中 启动Rpc服务 就是上面说到的蓝色字体标识的,如图

最终项目结构如下:

到此服务端的代码实现已完成,下面我们启动Consul和服务端,验证 Api 注册和Grpc启动。

二、Consul和服务端启动

启动Consul,启动Grpc服务、注册服务到Consul

1、启动Consul

由于本次用Api注册,用Consul默认自带UI,所以conf和dist可删除

Consul,本项目测试时一台机器,所以把 本机IP 改成 127.0.0.1

consul agent -server -datacenter=grpc-consul -bootstrap -data-dir ./data -ui -node=grpc-consul1 -bind本机IP -client=0.0.0.0

再在Consul目录下启动另一个cmd命令行窗口,输入命令:consul operator raft list-peers 查看状态查看状态,结果如下

打开Consul UI:http://localhost:8500 查看情况

Consul 启动成功。

在.net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡中后面 Consul 部分,有 Consul 集群搭建等其他介绍,可以去参考看下。

2、启动服务端,启动Grpc服务、注册服务到Consul

由于客户端要实现负载,所以把 Snai.GrpcService.Hosting 项目生成两次,启动两个一样的服务端,只是端口不同

服务5021 地址为5021: .UseUrls("http://localhost:5021"),GrpcService:5031,如下图

服务5022 修改地址为5022: .UseUrls("http://localhost:5022"),GrpcService:5032,如下图

启动 服务5021和服务5022两个服务端,如下面

看到 Grpc ServerListening On Port 5031,Grpc ServerListening On Port 5032 说明 Grpc 服务端启动成功

看到 Request starting HTTP/1.1 GET http://localhost:5021/health 说明 Consul 健康检查成功

打开Consul服务查看地址 http://localhost:8500/ui/#/grpc-consul/services/GrpcService 查看,两个GrpcService注册成功,健康检查状态正常

到此,Grpc启动正常,Consul Api服务注册、健康检查都正常,下面开始实现Grpc客户端

三、客户端

客户端主要包括Grpc客户端,Consul Api服务发现、负载均衡等。

新建Snai.GrpcClient 控制台程序,在 依赖项 下载安装Grpc.Core 包,项目引用Snai.GrpcService.Protocol,在依赖项下载安装下面工具组件包

用于读取 json配置:Microsoft.Extensions.Configuration,Microsoft.Extensions.Configuration.Json

用于依赖注入:Microsoft.Extensions.DependencyInjection

用于注入全局配置:Microsoft.Extensions.Options,Microsoft.Extensions.Options.ConfigurationExtensions

在项目根目录下新建Utils 目录,在Utils目录下新建HttpHelper.cs 类,用于程序内发送http请求,代码如下

在项目根目录下新建Consul 目录,在 Consul 目录下新建 Entity 目录,在Entity 目录下新建 HealthCheck.cs 类,用于接收 Consul Api发现的信息实体,代码如下

在Consul目录下新建 IAppFind.cs 接口,定义 FindConsul() 用于Consul 服务发现基方法,代码如下

在Consul目录下新建AppFind.cs 类,用于实现IAppFind.cs 接口,实现Consul 服务发现方法,代码如下

在项目根目录下新建LoadBalance 目录,在LoadBalance 目录下新建ILoadBalance.cs 接口,定义 GetGrpcService() 用于负载均衡基方法,代码如下

在LoadBalance目录下新建WeightRoundBalance.cs 类,用于实现ILoadBalance.cs 接口,实现GetGrpcService()负载均衡方法,本次负载均衡实现权重轮询算法,代码如下

在项目根目录下新建RpcClient 目录,在RpcClient 目录下新建IMsgClient.cs 接口,定义 GetSum() 用于Grpc客户端调用基方法,代码如下

在RpcClient目录下新建MsgClient.cs 类,用于实现IMsgClient.cs 接口,实现GetSum()方法用于Grpc客户端调用,代码如下

在项目根目录下新建Framework 目录,在Framework目录下新建Entity 目录,在Entity 目录下新建ConsulService.cs 和GrpcServiceSettings.cs 类,分别对应配置appsettings.json的 ConsulService,GrpcServiceSettings 两个配置项,代码如下

ConsulService.cs

GrpcServiceSettings.cs

在Framework目录下新建DependencyInitialize.cs 类,定义 AddImplement() 方法用于注册全局配置和类到容器,实现依赖注入,代码如下

在根目录下新建 appsettings.json 配置文件,配置 GrpcServiceSettings 的 GrpcServices 为服务端发布的两个服务5021和5022,LoadBalancer 负载均衡为 WeightRound权重轮询(如实现其他负载方法可做相应配置,注册负载均衡时也做相应修改),ConsulServiceIP和端口,代码如下

GrpcServicesGrpc服务列表

ServiceName:服务名称,负载同一服务名称相同

ServiceID:服务ID,保持唯一

IP:服务IP

Port:端口

Weight:服务权重

修改 Program.cs 的 Main() 方法,调用 AddImplement(),注册全局配置和类到容器,注入使用 MsgClient 类的 GetSum() 方法,实现 Grpc 调用,代码如下

右击项目生成,最终项目结构如下:

到此客户端的代码实现已完成,下面运行测试 Grpc+Consul 服务注册、服务发现和负载均衡。

四、运行测试 Grpc+Consul 服务注册、服务发现和负载均衡

双击 startup.bat 启动 Consul,再启动服务5021和5022,启动成功打开 http://localhost:8500/ui/#/grpc-consul/services/GrpcService 查看服务情况

启动 Snai.GrpcClient 客户端

输入 c 调用Grpc服务,调用3次,5031调用2次,5032调用1次,成功实现负载均衡

关掉服务5022,等10秒左右(因为设置健康检查时间间隔10秒),再输入 c 调用Grpc服务,只调用5031

打开 http://localhost:8500/ui/#/grpc-consul/services/GrpcService 查看,5022 状态失败,或消失

Grpc+Consul实现服务注册、服务发现、健康检查和负载均衡已完成

源码访问地址:/Liu-Alan/Grpc-Consul

相关文章:

入门干货之Grpc的.Net 封装-MagicOnion

基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现

Abp + Grpc 如何实现用户会话状态传递

gRPC官方快速上手学习笔记(c#版)

.net core grpc 实现通信(一)

原文地址:/alan-lin/p/9403762.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总

如果觉得《.net core grpc consul 实现服务注册 服务发现 负载均衡(二)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。