基于 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 

640?wx_fmt=png

可以看到已经有 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 了:

640?wx_fmt=png


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 程序,引入 AbpAbp.AspNetCoreAbp.Grpc.Server 包,项目取名为 Abp.Grpc.Server.Demo,类型选择空项目,在我们的 Startup 类当中编写如下代码:

640?wx_fmt=png

2.1.2 建立项目启动模块

新建一个 AbpGrpcServerDemoModule 类,并编写以下代码:

640?wx_fmt=png

2.1.3 编写健康检查控制器

640?wx_fmt=png

新建一个文件夹叫做 Controllers ,并且新建一个 HealthController 类,其内容如下:

640?wx_fmt=png

2.1.4 编写 RPC 服务

640?wx_fmt=png

新建一个 RpcServices 文件夹,并且新建一个 TestGrpcService 文件,其内容如下:

640?wx_fmt=png

可以看到我们编写了一个简单的 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 界面查看效果:

640?wx_fmt=png

可以看到已经成功注册,说明已经成功了。


2.2 Grpc 客户端编写

2.2.1 Abp 集成

首先建立一个标准的 .Net Console 程序,引入 Abp.Grpc.Client 包,在我们的 Program 类当中编写如下代码:

640?wx_fmt=png

2.2.2 建立项目启动模块

然后我们新建一个 AbpGrpcClientDemoModule 类,该类一样是一个启动模块,用于配置连接信息:

640?wx_fmt=png

很简单,直接配置 Consul 注册的 IP 与端口号即可。

2.2.3 建立 RPC 接口定义

要调用我们 Server 提供的 RPC 端口的话,得编写一个接口定义,就是我们在 Server 项目里面写的那个,新建一个 ITestGrpcService 接口,内容如下:

640?wx_fmt=png

2.2.4 调用 RPC 接口

640?wx_fmt=png

调用接口的话,需要注入 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!

640?wx_fmt=png


3.代码分析

抛开 ABP 框架部分的代码,其实要实现服务注册很简单,核心就是 ConsulClient 这个类,

下面就来分析一下 Abp.Grpc 库里面的代码。


3.1 注册服务

注册服务其核心就在于 ConsulClient.Agent.ServiceRegister() 方法,通过传入一个构造好的 AgentServiceRegistration 对象就可以成功注册一个服务到 Consul。

例如:

640?wx_fmt=png

构建成功后通过 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 服务注册与服务发现

  • 在Windows 下如何使用 AspNetCore Api 和 consul

原文地址: https://www.cnblogs.com/myzony/p/9168851.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2017 ACM Jordanian Collegiate J.Efficiency Test 动态规划、类倍增

题目 题目链接 题解及代码 #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N 1e57; int f[2*N][55],a[2*N],sum[2*N],ans[2*N],pb[2*N]; int T,n,k; #define pr(x) cout<<#x<<":"&…

P3041-[USACO12JAN]Video Game G【AC自动机,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3041 题目大意 输入nnn个只有ABCABCABC的字符串&#xff0c;求一个长度为LLL的字符串中最多包含多少个子串是nnn个字符串中的一个 解题思路 考虑ACACAC自动机是如何进行匹配的&#xff0c;对于下一个字符&#xff0c;如果有…

【DFS】排排坐

排排坐 题目大意&#xff1a; 有n个方块&#xff0c;有一些是黑色&#xff0c;有一些是白色&#xff0c;可以点击一个方块使它和它旁边的方块反转颜色&#xff08;黑变白&#xff0c;白变黑&#xff09;&#xff0c;问最少要点多少次才能将方块 们 变成目标的方块们&#xff…

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

预备知识: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) 准备项目建立成熟度2级的 API请看这里&#xff1a;用ASP.NET Core 2.0 建立规范的 REST API -- GET 和 POST, 用ASP.NET Core 2.0 建立规范的 REST AP…

CERC2017 Gambling Guide,最短路变形,期望dp

题目链接 题面链接 题意 给定一个无向图&#xff0c;你需要从11点出发到达n" role="presentation" style="position: relative;">nn点&#xff0c;你在每一点的时候&#xff0c;使用11个单位的代价,随机得到相邻点的票,但是你可以选择留在原地…

P4045-[JSOI2009]密码【AC自动机,状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4045 题目大意 给nnn个字符串&#xff0c;求有多少个长度为lll的字符串包含所有给出的字符串 解题思路 因为nnn很小&#xff0c;考虑状压dpdpdp&#xff0c;因为是包含所有字符串&#xff0c;考虑在ACACAC自动机上dpdpdp。…

华为资深工程师:码农很多,但程序员并不多......

“春节假期&#xff0c;与几位友人小聚&#xff0c;大家互道工作顺利、平安健康云云......期间一位驰骋商界多年的老友问&#xff1a;“你现在在华为做什么工作呀?”我很骄傲地说&#xff1a;”系统架构师“&#xff0c;可是他却愣了很久。但当我老婆在旁边补上一句“码农“时…

【DP】【递归】分离与合体

分离与合体 题目大意&#xff1a; 有n个区域&#xff0c;可以把它们分为两个区间&#xff0c;结果加上左边区间的最左区域的数和最右区域的数还有右边区间的最右区域的数&#xff0c;就这样不停分&#xff0c;使结果最大&#xff0c;并输出各分界线的位置&#xff08;按1/2,2…

NEERC2017 Laminar Family 树链剖分+LCA

题目链接 http://codeforces.com/gym/101630/attachments/download/6401/20172018-acmicpc-northeastern-european-regional-contest-neerc-17-en.pdf 题意 给出一棵树和一组操作&#xff0c;操作的格式是给出u、vu、v两个节点&#xff0c;并将该节点所确定的路径上的节点全…

CF1009F-Dominant Indices【长链剖分】

正题 题目链接:https://www.luogu.com.cn/problem/CF1009F 题目大意 以1为根的一棵树&#xff0c;对于每个节点xxx求一个最小的kkk使得以xxx为根的子树中第kkk层的结点最多。 解题思路 我们先进行一次长链剖分&#xff0c;对于一个长链我们可以发现如果每次往下做的话&#…

VS2017 15.8第二个预览版本提升了对CPU Profiling和F#的支持

VS2017 15.8第一个预览版本的特性包括对ARM64构建的支持、ASP.NET Core对Docker的支持以及重新引入LibMan。在15.8的第二个预览版本中&#xff0c;微软发布了一个新Google Android模拟器的预览功能&#xff0c;它能够与Hyper-V兼容。这样的话&#xff0c;最新的Android模拟器就…

【SPFA】腾讯大战360

腾讯大战360 题目大意&#xff1a; 有n个点&#xff0c;还有m条线连接着这些点&#xff0c;有两个人在其中两个点上&#xff0c;让这两个人相遇最快要多久 原题&#xff1a; 题目描述 2010年11月3日&#xff0c;是一个难忘的日子。 腾讯发布消息&#xff1a;存360则&#…

一道有趣的最短路 NEERC2017 Journey from Petersburg to Moscow

题目链接 http://codeforces.com/gym/101630/attachments/download/6401/20172018-acmicpc-northeastern-european-regional-contest-neerc-17-en.pdf 题意 求11到n" role="presentation" style="position: relative;">nn的最短路&#xff0c;最…

P5904-[POI2014]HOT-Hotels加强版【长链剖分,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P5904 题目大意 nnn个点的一棵树&#xff0c;求有多少个点对(i,j,k)(i,j,k)(i,j,k)使得这三个点距离相等。 解题思路 有两种情况&#xff0c;一是iii是j,kj,kj,k的祖先&#xff0c;二是i,j,ki,j,ki,j,k互相没有祖先关系 考虑…

初一级模拟试题总结(2019.3.2)

成绩 rank算上了其他大佬 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf400400400100100100100100100100100100100100100111wjjwjjwjj280280280100100100808080000100100100111tjhtjhtjh200200200100100100000000100100100111fyfyfy200200200…

ASP.NET Core Razor生成Html静态文件

一、前言最近做项目的时候&#xff0c;使用Util进行开发&#xff0c;使用Razor写前端页面。初次使用感觉还是不大习惯&#xff0c;之前都是前后端分离的方式开发的&#xff0c;但是使用Util封装后的Angular后&#xff0c;感觉开发效率还是杠杠滴。二、问题在发布代码的时候&…

NEERC2017 Archery Tournament 线段树 新套路

题目链接 http://codeforces.com/gym/101630/attachments/download/6401/20172018-acmicpc-northeastern-european-regional-contest-neerc-17-en.pdf 题意 给出一些圆&#xff0c;这些圆圆心在x轴上方&#xff0c;且与x轴相切&#xff0c;任意时刻&#xff0c;不存在图上的…

P2178-[NOI2015]品酒大会【SA,并查集】

正题 题目链接:https://www.luogu.com.cn/problem/P2178 题目大意 长度为nnn的字符串&#xff0c;每个位置有一个权值。 如果对于q,pq,pq,p有sq,qr−1sp,pr−1s_{q,qr-1}s_{p,pr-1}sq,qr−1​sp,pr−1​那么就称q,pq,pq,p为rrr相似。 对于每个rrr求有多少对q,pq,pq,p是rrr相似…

【Floyed】【最短路】商店选址问题(ssl 1760)

商店选址问题 ssl 1760 题目大意&#xff1a; 有一些点&#xff0c;在一个点上按医院&#xff0c;有一个值就是这个点到其他点的最短路之和&#xff0c;问这个值最小是多少 原题&#xff1a; Description 给出一个城市的地图&#xff08;用邻接矩阵表示&#xff09;&…

一文看懂.NET的各种变体

曾几何时&#xff0c;我们只有一个.NET&#xff0c;叫作.NET Framework。如果想要开发.NET应用程序&#xff0c;只要使用.NET Framework即可&#xff0c;非常简单。几年之后&#xff0c;出现了.NET变种的寒武纪大爆发&#xff08;我们称之为“.NET大爆炸”&#xff09;&#xf…