基于 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,一经查实,立即删除!

相关文章

【DFS】排排坐

排排坐 题目大意: 有n个方块,有一些是黑色,有一些是白色,可以点击一个方块使它和它旁边的方块反转颜色(黑变白,白变黑),问最少要点多少次才能将方块 们 变成目标的方块们&#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请看这里:用ASP.NET Core 2.0 建立规范的 REST API -- GET 和 POST, 用ASP.NET Core 2.0 建立规范的 REST AP…

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

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

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

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

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

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

一文看懂.NET的各种变体

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

【最短路】【Floyed】医院设置(ssl 1614)

医院设置 ssl 1614 题目大意: 有n个点,在一个点上安医院,使这个点到其他点的最短路之和最小 原题: Description 设有一棵二叉树(如右图)。其中,圈中的数字表示结点中居民的人口。圈边上数…

拓展 NLog 优雅的输送日志到 Logstash

在上上篇博客通过对aspnetcore启动前配置做了一些更改,以及对nlog进行了自定义字段,可以把请求记录输送到mysql,正式情况可能不会这么部署。因为近期也在学习elk,所以就打算做一个实例,结合nlog把日志输送到logstash&a…

曼哈顿距离与切比雪夫距离的转化及prufer序列

目录 曼哈顿距离与切比雪夫距离的相互转化prufer序列 1. 曼哈顿距离 与 切比雪夫距离 的相互转化 曼哈顿距离 |x1−x2||y1−y2|max(x1−x2y1−y2,x1−x2−y1y2,−x1x2y1−y2,−x1x2−y1y2)|x1−x2||y1−y2|max(x1−x2y1−y2,x1−x2−y1y2,−x1x2y1−y2,−x1x2−y1y2)|x_1 - x…

[译]如何在.NET Core中使用System.Drawing?

你大概知道System.Drawing,它是一个执行图形相关任务的流行的API,同时它也不属于.NET Core的一部分。最初是把.NET Core作为云端框架设计的,它不包含非云端相关API。另一方面,.NET Core是跨平台框架,它不包含任何操作系…

关于Visual Studio 2019的前期详情

近日,来自微软公司的 John Montgomery 正式宣布,Visual Studio 2019已进入开发阶段。Montgomery 表示,之所以选择在这个时间点公开这个消息,是因为微软准备在 GitHub 上公开可见的项目(包括 .NET 和 Roslyn&#xff09…

开源的,跨平台的.NET机器学习框架ML.NET

微软在Build 2018大会上推出的一款面向.NET开发人员的开源,跨平台机器学习框架ML.NET。 ML.NET将允许.NET开发人员开发他们自己的模型,并将自定义ML集成到他们的应用程序中,而无需事先掌握开发或调整机器学习模型的专业知识。在采用通用机器学…

虚树-树上动态规划的利器

虚树 问题引入 在一类树上动态规划问题中,题目给出的询问往往包含树上的很多各节点,并保证总的点数规模小于某个值. 如果我们直接在整颗树上进行dpdp的话,时间复杂度与询问的次数有关,这显然是不可接受的,如果我们可以找到一种动态规划的方法,使其时间复杂度与询问中点的实际…

微软推出Visual Studio Kubernetes工具包预览版

微软表示,利用 Visual Studio Kubernetes 这个工具,使用者可以直接在该环境中,构建 Kubernetes 容器应用程序项目,或者让现有的 .NET 网页应用程序也兼容 Kubernetes。除了公有云基础架构环境要支持 Kubernetes,微软现…

基于docker 如何部署surging分布式微服务引擎

1、前言转眼间surging 开源已经有1年了,经过1年的打磨,surging已从最初在window 部署的分布式微服务框架,到现在的可以在docker部署利用rancher 进行服务编排的分布式微服务引擎,再把业务进行剥离, 通过配置路径就能驱…

DevOps 实践:千里之行

在上一篇 DevOps 渊源:角色消融 中我们分析了在作坊式团队中的责任重叠,也回顾了 DBA 角色的消融。那么,如今我们讲的 DevOps 又是什么角色的消融呢? 我想你已经猜到了,接下来要消融的角色就是运维人员了。那这次又是什…

约数个数

约数个数 题目大意: 求a到b之间每个数的约数的个数之和 原题: 题目描述 定义f(x)为x的约数个数,x为正整数。 f(a)f(a1)……f(b),即a,b之间每个数的约数的总和。 输入 一行两个正整数a、b,以一个空格隔开。 输出…

asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程...

最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionless的学习做下笔记!Exceptionless是什么?能做什么呢?“Exceptionless”这…

使用 IIS 在 Windows 上托管 ASP.NET Core2.0

准备:操作系统:Windows Server 2008 R2 或更高版本开发环境:VS2017回到顶部第一步:新建项目ASP.NET Core Web应用程序在 Visual Studio 中,选择“文件”>“新建”>“项目”。在新建项目对话框的左侧窗格选择“.N…

数学推导题,NTT,快速数论变换,Wannafly-导数卷积

导数卷积 题目描述 题解 参考了一下标程的推导过程,因为这个推导对我这种数学弱渣真的有点难鸭. [1]f(x)f(x)f(x)的iii次导函数: f(i)(x)ai∗i!0!ai1∗(i1)!1!∗x1...an−1∗(n−1)!(n−1−i)!∗xn−1−if^{(i)}(x) a_{i}*\frac{i!}{0!} a_{i1}*\frac{(i1)!}{1!}*x^{1} ...…