- A+
媒介
我个人以为,中间件的布置与运用是异常难影象的;也就是说,假如两次运用中间件的时刻距离比较长,那基本上即是要重新进修运用。
所以,我以为进修中间件的文章,越细致越好;由于,这对作者而言也是一份名贵的备忘材料。
Consul简介
Consul一个什么,我想人人经由过程搜刮引擎肯定能够搜刮到;所以,我就不在反复他的官方形貌了。
这里,我为人人供应一个更加好明白的形貌。
Consul是什么?
Consul实质上是一个Socket通讯中间件。
它重要完成了两个功用,效劳注册与发明与本身的负载平衡的集群。
我们能够把他明白为一个没有界面的应用顺序,由于没有界面,所以想启动Consul就只能运用敕令行了;也由于没有界面,一旦运用敕令行启动了Consul,那末,实行该敕令行的cmd.exe顺序,就成了Consul的宿主了;一旦封闭Cmd窗口,Consul就住手运转了。
效劳注册与发明的实质是什么?
实在效劳注册与发明的道理很简朴。
当我们在本机运转Consul时,他会自动监听8500端口;然后我们经由过程一个开源类库(这个开源类库能够在nuget上检索到,文章下面会引见),挪用其下差别的要领来向这个Consul历程发送TCP音讯,来注册效劳或许发明效劳。
Consul历程在接收到注册音讯时,就把注册的效劳信息存储到当地磁盘或内存(由于我没有详细去观察Consul存储数据是不是运用了数据库,但我们都晓得数据库的数据也是保留在当地磁盘的,所以,它肯定是把数据存进磁盘或许内存中了)。
数据中间
Consul存储数据的处所,官方为其命名为数据中间,也就是上面说的保留我们注册的效劳信息的当地磁盘或许内存。
Consul供应负载平衡的集群
Consul的集群也很好明白,在我们胜利启动Consul今后,它除了监听8500端口之外,它还监听了一个8031端口。
这个8031端口就是用于Consul集群互相通讯的。
我们都晓得集群是要两台以上的电脑的,所以,我们就必需找到两台或以上的电脑装置Consul中间件。
然后,运用Consul的敕令行,将两台电脑连接到一同,如许集群就形成了。
在集群内每台电脑上装置的Consul中间件,我们统称为效劳器代办(Agent);当集群启动后,会在多个代办效劳器之间推举出一个Leader。
推举Leader天然就是效劳器代办之间的通讯了,也就是经由过程上面提到的8031端口通讯的。
推举了Leader,效劳器代办就能够将本身的负载信息发送给Leader了,如许客户端挪用Consul检索效劳数据时,就能够去机能最优的那台机械上猎取信息了。(注:这个就是举例说明,并不是Consul的负载平衡的实在处置惩罚情势)
Consul代办效劳器装置
起首,去官网下载Consul,官网下载地点https://www.consul.io/downloads.html
拉到网站的最下方,挑选Window64-bit的Consul下载,以下图:
下载完成后,我们取得一个压缩包consul_1.6.2_windows_amd64.zip;解压缩后,取得consul.exe文件,以下图:
由于我们要运用敕令行来运转consul,所以,我们将consul.exe地点的目次添加进环境变量,如许,当我们在CMD窗口中实行consul的相干敕令时,体系就会自动将这个些敕令发送给consul.exe文件实行了。
设置环境变量以下图所示:
设置完环境变量,我们翻开一个cmd的敕令行窗口,然后输入consul来确认我们的环境变量是不是设置胜利,以下图:
看到图中的信息,就代表我们的consul的环境变量设置胜利了,已能够运转了。
接下来,我们在这个cmd窗体中输入consul的敕令来启动consul效劳器代办,敕令以下:
consul agent -server -ui -bootstrap-expect=1 -data-dir=/tmp/consul -node=consul-1 -client=0.0.0.0 -bind=192.168.1.111 -datacenter=dc1
敕令诠释以下:
实在consul敕令人人是能够在收集上搜到它们的定义的,不过我以为诠释的照样太官方,所以,我在这里供应了一份我以为更好的诠释。
consul agent:敕令头,必须要有。
-server:外表我们如今要启动效劳器代办(agent)是效劳情势的。Consul Agent的运转情势有两种,Server情势和Client情势。其区分简朴来讲就是Server情势的Agent能够被推举为Leader,而Client情势的不能够,固然另有其他区分,有兴致人人能够自行相识。
-ui:consul运转后,会供应一个http://127.0.0.1:8500/ui/的网站,内里存储了Consul Agent各个节点以及注册的效劳等相干信息,即数据中间的网页情势表现。这个参数代表是不是建立这个网站,这个参数与这个数据中间网站有关。
bind:本机的ip地点,集群内其他代办效劳器能够经由过程这个ip来接见这台电脑的consul代办效劳器。
bootstrap-expect:是集群启动前提,指当效劳器端情势(Server情势)的代办到达这个数量后,才入手下手运转。
data-dir:是寄存数据中间数据的,该目次必需是稳固的,体系重启后也继承存在的。
datacenter:当前agent的中间数据的称号,默许是dc1。
node:节点在集群中的称号,在一个集群中必需是唯一的,默许是该节点的主机名(代表一个机械)。
client:当地ip地点,这里运用 0.0.0.0 ,就示意这个效劳器一切IP都能够,即当这台电脑有俩ip,192.168.1.111和192.168.1.112,那末经由过程这俩IP都能够接见到这台机械的consul代办效劳器。
----------------------------------------------------------------------------------------------------
运转该敕令,以下图所示:
能够看到,我们的Consul代办效劳已胜利运转了。
如今,我们在去另一台电脑,翻开cmd窗口,运转以下consul敕令:
consul agent -server -ui -bootstrap-expect=1 -data-dir=d:\consul -node=consul-2 -client=0.0.0.0 -bind=192.168.80.112 -datacenter=dc1 -join 192.168.80.111
能够看到,我们在敕令行最后面追加了一个join 192.168.80.111;经由过程这个敕令,我们把这台电脑的代办效劳器胜利的到场到了上文中的consul集群。
效劳注册与发明
Consul的效劳注册
起首,我们建立一个WebAPI,这里为运用了Core框架建立了一个Web API,为了轻易测试,我就直接拿当地的VisualStudio启动测试了。
建立WebAPI后,我们在Nuget中查找Consul的Net版本类库。
在Nuget中搜刮Consul,然后选中下图中的选项举行装置。
然后,我们在Startup文件中,增添一个函数,以下:
public static void RegisterConsul() { var consulClient = new ConsulClient(p => { p.Address = new Uri($"http://127.0.0.1:8500"); });//要求注册的 Consul 地点 //这里的这个ip 就是本机的ip,这个端口8500 这个是默许注册效劳端口 var httpCheck = new AgentServiceCheck() { DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//效劳启动多久后注册 Interval = TimeSpan.FromSeconds(10),//距离牢固的时刻接见一次,https://localhost:44308/api/Health HTTP = $"https://localhost:44308/api/Health",//健康检查地点 44308是visualstudio启动的端口 Timeout = TimeSpan.FromSeconds(5) }; var registration = new AgentServiceRegistration() { Checks = new[] { httpCheck }, ID = Guid.NewGuid().ToString(), Name = "test1", Address = "https://localhost/", Port = 44308, }; consulClient.Agent.ServiceRegister(registration).Wait();//注册效劳 //consulClient.Agent.ServiceDeregister(registration.ID).Wait();//registration.ID是guid //当效劳住手时须要作废效劳注册,不然,下次启动效劳时,会再注册一个效劳。 //然则,假如该效劳历久不启动,那consul会自动删除这个效劳,约莫2,3分钟就会删了 }
然后在Configure中挪用这个要领,如许,当我们调试或运转这个项目时,就会自动将这个Webapi注册到Consul里了。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); RegisterConsul();//注册本效劳到consul集群 }
效劳注册完后,能够接见当地数据中间的网站【http://127.0.0.1:8500/ui/dc1/services】来检察注册效劳的状况。
Consul效劳发明
效劳注册完成后,我们再建立一个控制台项目来举行效劳发明。
建立完成项目后,也须要援用consul类库,同效劳端一样在Nuget中搜刮。
编写代码以下:
static void Main(string[] args) { var consulClient = new ConsulClient(x => x.Address = new Uri($"http://192.168.1.178:8500"));//要求注册的 Consul 地点 var ret = consulClient.Agent.Services(); var allServer = ret.GetAwaiter().GetResult(); //这个是个dictionary的返回值,他的key是string范例,就是8500/ui上services的instance的id var allServerDic = allServer.Response; var test1 = allServerDic.First(); string name = test1.Value.Service;//效劳名,就是注册的谁人test1 string serverAddress = test1.Value.Address; int serverPort = test1.Value.Port; Console.WriteLine($"serverAddress:{serverAddress}==serverPort{serverPort}"); //我们能够在客户端启动的时刻,挪用一下consul来查找效劳 //比方,我们能够在效劳鸠合里查找 效劳名叫test1的效劳 然后在挪用它 //如许,当效劳器改变了test1的ip和端口,我们依旧能够在集群里找他test1新的ip和端口了 Console.ReadKey(); }
运转效果以下:
能够看到,我们已胜利挪用了Consul,也胜利的猎取到了效劳信息。
----------------------------------------------------------------------------------------------------
实在Consul除了效劳注册与查询,还能够举行Key-Value存储,也就是说,这个是一个分布式Key-Value存储集群。
Key-Value存储的用法在Github已有例子了,网址:https://github.com/PlayFab/consuldotnet。
----------------------------------------------------------------------------------------------------
C#运用Consul举行效劳注册与发明就讲完了。
代码已传到Github上了,迎接人人下载。
Github地点:https://github.com/kiba518/KibaConsul
----------------------------------------------------------------------------------------------------
注:此文章为原创,任何情势的转载都请联络作者取得受权并说明出处!
若您以为这篇文章还不错,请点击下方的【引荐】,异常感谢!
https://www.cnblogs.com/kiba/p/11703073.html