基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现
0.简介
0.1 什么是 Consul
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。
这里所谓的服务,不仅仅包括常用的 Api 这些服务,也包括软件开发过程当中所需要的诸如 Rpc、Redis、Mysql 等需要调用的资源。
简而言之 Consul 就是根据 Key/Value 存储了一套所有服务的 IP/Port 集合,当你 Grpc 客户端需要请求某种服务的时候,具体的 IP 与端口不需要你自己来进行指定,而是通过与 Consul Agent 通信获得某个服务下面可用的 IP/Port 集合。
而 Consul 还提供了健康检查等附加的功能,你可以通过对可用服务节点的遍历来自己进行负载均衡或者服务选择。
0.2 为什么要用 Consul
没用 Consul 之前的情况是,我 new 一个 Channel 的话,需要指定 Grpc Server 的地址与端口,一单服务挂掉或者 Grpc Server 的 IP 地址或者端口有变更,那么我还得重新更改 setting 才能够使用我的服务。
使用了 Consul 之后我只需要去 Consul Agent 里面查询我指定的服务有哪些节点可用,返回给我对应的 IP 地址和端口,我就可以进行连接了。
1.准备工作
1.1 Consul 集群安装与配置
Consul 我是直接使用 Docker 的官方 Consul 镜像来进行安装的,直接执行以下命令 pull 到最新的镜像:
docker pull consul
拿到之后我们先运行一个服务:
docker run -d --name=dev-consul-server1 -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -bootstrap
之后我们再运行两个 Consul Server:
docker run -d --name=dev-consul-server2 -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -retry-join 172.17.0.20
这里 172.17.0.20 是之前 dev-consul-server1 的 IP 地址。
docker run -d --name=dev-consul-server3 -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -retry-join 172.17.0.20
我们可以运行 consul members
命令来查看 Consul 集群信息:
docker exec -t dev-consul-server1 consul members
可以看到已经有 3 个 Consul Server 启动了。
下面我们再来运行一个 Consul Client 作为服务注册与发现的端口:
docker run -d -p 8500:8500 --name=dev-consul-client -e CONSUL_BIND_INTERFACE=eth0 -e CONSUL_UI_BETA=true consul agent -retry-join 172.17.0.20 -bind 0.0.0.0 -ui -client 0.0.0.0
这里注意 -bind
与 -client
命令是你绑定的 IP 地址,这里我直接将其与 0.0.0.0 绑定,而 -e CONSUL_UI_BETA=true
则是用于启动新版本的 WebUI 界面,-ui
是启用 WebUI 界面。
启动完成之后我们可以访问已经启动的 Client Agent 了:
2.客户端与服务端编写
在这里我以 Abp 框架作为演示,如何编写一个支持 Consul 的 Grpc 服务端与 Grpc 客户端,在演示当中所使用到的 Abp.Grpc.Server
包与 Abp.Grpc.Client
包可以从 NuGet 站点当中搜索安装,其源代码我托管到 GitHub 上面的,地址为:https://github.com/GameBelial/Abp.Grpc,欢迎 Star。
2.1 Grpc 服务端编写
2.1.1 Abp 集成
首先建立一个标准的 ASP.NET Core Web Application 程序,引入 Abp
、Abp.AspNetCore
、Abp.Grpc.Server
包,项目取名为 Abp.Grpc.Server.Demo,类型选择空项目,在我们的 Startup 类当中编写如下代码:
2.1.2 建立项目启动模块
新建一个 AbpGrpcServerDemoModule
类,并编写以下代码:
2.1.3 编写健康检查控制器
新建一个文件夹叫做 Controllers ,并且新建一个 HealthController
类,其内容如下:
2.1.4 编写 RPC 服务
新建一个 RpcServices 文件夹,并且新建一个 TestGrpcService 文件,其内容如下:
可以看到我们编写了一个简单的 Sum
方法,该方法接收两个 int
类型的参数,计算其和并返回。
2.1.5 编写 Dockerfile 文件
因为我们的 Consul 是放在 Docker 容器当中的,所以我们将我们的站点发布出去,并且编写一个 Dockerfile 文件,内容如下:
FROM microsoft/dotnetENV ASPNETCORE_URLS http://+:5000## 开放 5000 网站端口EXPOSE 5000## 开放 5001 RPC 端口EXPOSE 5001WORKDIR /appCOPY ./ .ENTRYPOINT [ "dotnet","Abp.Grpc.Server.Demo.dll" ]
将其拷贝到发布好的站点,并且执行 docker build 命令:
PS D:\Project\DEMO\Abp.Grpc.Server.Demo\Abp.Grpc.Server.Demo\bin\Release\netcoreapp2.1\publish> docker build -t grpc-server-demo .
Sending build context to Docker daemon 29.9MB
Step 1/7 : FROM microsoft/dotnet---> d8381e1175a1Step 2/7 : ENV ASPNETCORE_URLS http://+:5000---> Using cache---> da7659cff6d2Step 3/7 : EXPOSE 5000---> Using cache---> 7ecfc480ad43Step 4/7 : EXPOSE 5001---> Using cache---> 75f10934ad1eStep 5/7 : WORKDIR /app ---> Using cache---> dee9739da4cdStep 6/7 : COPY ./ . ---> 1a5acc1f0298Step 7/7 : ENTRYPOINT [ "dotnet","Abp.Grpc.Server.Demo.dll" ] ---> Running in a46efbabc7fcRemoving intermediate container a46efbabc7fc ---> 321201373ecfSuccessfully built 321201373ecf
Successfully tagged grpc-server-demo:latestSECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories
构建完镜像之后,我们运行该镜像:
docker run -d -p 5000:5000 -p 5001:5001 --name=grpc-server-demo grpc-server-demo
2.1.6 查看 Consul
来到 Consul 的 UI 界面查看效果:
可以看到已经成功注册,说明已经成功了。
2.2 Grpc 客户端编写
2.2.1 Abp 集成
首先建立一个标准的 .Net Console 程序,引入 Abp.Grpc.Client
包,在我们的 Program 类当中编写如下代码:
2.2.2 建立项目启动模块
然后我们新建一个 AbpGrpcClientDemoModule
类,该类一样是一个启动模块,用于配置连接信息:
很简单,直接配置 Consul 注册的 IP 与端口号即可。
2.2.3 建立 RPC 接口定义
要调用我们 Server 提供的 RPC 端口的话,得编写一个接口定义,就是我们在 Server 项目里面写的那个,新建一个 ITestGrpcService
接口,内容如下:
2.2.4 调用 RPC 接口
调用接口的话,需要注入 IGRpcConnectionUtility
工具类,使用其 GetRemoteService
方法就可以调用你的远程方法,记住一定要传入有效的服务名称。
2.2.5 编写 Dockerfile 文件
一样的,我们新建一个 Dockerfile 文件,将我们的 client 也打包成镜像:
FROM microsoft/dotnetWORKDIR /app
COPY ./ .ENTRYPOINT [ "dotnet","Abp.Grpc.Client.Demo.dll" ]
内容很简单,一样的复制到发布成功的文件夹,构建镜像:
docker build -t grpc-client-demo .
构建之后运行:
docker run grpc-client-demo
不出意外的话会看到如下输出:
PS D:\Project\DEMO\Abp.Grpc.Client.Demo\Abp.Grpc.Client.Demo\bin\Release\netcoreapp2.1\publish> docker run grpc-client-demoResult:15Press enter to stop application...Hello World!
3.代码分析
抛开 ABP 框架部分的代码,其实要实现服务注册很简单,核心就是 ConsulClient 这个类,
下面就来分析一下 Abp.Grpc 库里面的代码。
3.1 注册服务
注册服务其核心就在于 ConsulClient.Agent.ServiceRegister()
方法,通过传入一个构造好的 AgentServiceRegistration
对象就可以成功注册一个服务到 Consul。
例如:
构建成功后通过 ConsulClient.Agent.ServiceRegister()
方法即可注册到 Consul。
取消注册则是通过 ConsulClient.Agent.ServiceDeregister
方法。
3.2 发现服务
服务发现相较于服务注册简单得多,只需要通过 ConsulClient.Catalog.Services
遍历其结果即可获得所有节点,并且通过 LINQ 来筛选出指定 tag 的服务。
4.其他相关参考资料
田园里的蟋蟀:Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践)
Edison Chou:.NET Core微服务之基于Consul实现服务治理
Cecilphillip:Using Consul for Service Discovery with ASP.NET Core
5.所使用到的代码
Abp.Grpc 库代码:https://github.com/GameBelial/Abp.Grpc
DEMO 代码:
https://github.com/GameBelial/Abp.Grpc.Server.Demo
https://github.com/GameBelial/Abp.Grpc.Client.Demo
相关文章:
.NET Core微服务之基于Consul实现服务治理
.NET Core微服务之基于Consul实现服务治理(续)
Ocelot + Consul实践
青客宝团队Consul内部分享ppt
搭建consul 集群
Redola.Rpc 集成 Consul 服务发现
Consul 服务注册与服务发现
原文地址: https://www.cnblogs.com/myzony/p/9168851.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现相关推荐
- 服务注册与发现的原理和实现
什么是服务注册发现? 对于搞微服务的同学来说,服务注册.服务发现的概念应该不会太陌生. 简单来说,当服务A需要依赖服务B时,我们就需要告诉服务A,哪里可以调用到服务B,这就是服务注册发现要解决的问题. ...
- Zookeeper服务注册与发现
Zookeeper作为服务注册与发现的解决方案,它有如下优点: 1. 它提供的简单API 2. 已有互联网公司(例如:Pinterest,Airbnb)使用它来进行服务注册与发现 3. 支持多语言的客 ...
- Spring Cloud 基于Consul 实现服务注册与发现
Spring Cloud自己体系中的注册中心为Eureka,同时也支持其它服务来进行服务注册与发现.本文介绍使用Consul来实现服务注册与发现,并整合进Spring Cloud项目中进行使用. 本文 ...
- 一个故事,一段代码告诉你如何使用不同语言(GolangC#)提供相同的能力基于Consul做服务注册与发现
文章目录 引言 什么是微服务 传统服务 微服务 什么是服务注册与服务发现 为什么要使用不同的语言提供相同的服务能力 服务协调器 服务注册 Golang C#(.NetCore3.1) 服务发现 通过H ...
- C# net6微服务架构之服务注册与发现工具Consul的下载与安装(for windows)
C# net6微服务架构之服务注册与发现工具Consul的下载与安装(for windows) 0.背景 1.Consul简介 2.Consul的主要功能 3.Consul下载与安装 4.Consul ...
- zookeeper与grpc集成实现服务注册与发现
Zookeeper介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一 ...
- gRPC服务注册发现及负载均衡的实现方案与源码解析
今天聊一下gRPC的服务发现和负载均衡原理相关的话题,不同于Nginx.Lvs或者F5这些服务端的负载均衡策略,gRPC采用的是客户端实现的负载均衡.什么意思呢,对于使用服务端负载均衡的系统,客户端会 ...
- 《深入理解 Spring Cloud 与微服务构建》第十二章 服务注册和发现 Consul
<深入理解 Spring Cloud 与微服务构建>第十二章 服务注册和发现 Consul 文章目录 <深入理解 Spring Cloud 与微服务构建>第十二章 服务注册和发 ...
- SpringCloud核心教程 | 第四篇:服务注册与发现 Consul篇
Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...
最新文章
- 2021-09-22
- simple java mail
- 汇总Web前端开发工程师需要注意的一些开发规范
- EasyUI加载树控件自动展开所有目录
- java jnlp 签名_JAVA JNLP组件数字签名制作步骤
- Linux驱动编程--基于I2C子系统的I2C驱动
- socat命令如何监听Linux串口设备通讯报文
- 第四十六讲 ASP.NET实例编程(五)
- 翻车了!StackOverflow上复制最多的代码存在缺陷!
- 5款免费的WordPress备份解决方案
- ubuntu 搭建 smtp 邮件服务器
- python3简单爬取妹纸图网站图片
- OPNsense用户手册-用户界面
- 2008年国外最漂亮的50个网站欣赏
- java列举生活中类和对象_趣味解读Python面向对象编程 (类和对象)
- 计算机视觉领域的一些牛人博客,研究机构等的网站链接 机器学习算法中文视频教程
- 要不要启用苹果wapi_苹果“史上最强”系统ios13来了,要不要升级?
- 思维导图Java篇(一)
- 证明:因为矩阵A非0,所以AA'也非零
- 【ECCV 2020】UDA with Noise Resistible Mutual-Training for Person Re-identification (NRMT)