.NetCore快速上手Consul,留给自己一点思考的空间

摘要:
.Net平台上使用“微服务”时做服务发现,目前来说Cosul是一个不错的选择。一张图简单了解下Consulclient节点Client表示consul的client模式,即客户端模式。server节点Server表示consul的server模式,即服务端模式。

互联网热潮下,“微服务”技术架构成为了一种高大上的技术,其顾名思义就是将传统的大的业务服务拆分成独立的小服务,当拆分的服务慢慢多起来的时候,我们会发现服务地址很难管理,传统的方式一般会通过配置文件或者数据库存储,这种手动的维护的方式显然不够灵活,如果某个服务挂了,系统得不到及时的通知,只能等维护人员处理。这个时候如果有个中间件来做服务发现的话,显然会显得很灵活。

.Net平台上使用“微服务”时做服务发现,目前来说Cosul是一个不错的选择。

什么是Consul

Consul是一种提供了服务发现,配置管理等功能的服务网格解决方案,是一种分布式,高可用的服务管理架构。

主要功能:

服务发现(Service Discovery):Consul提供了通过DNS或者HTTP API接口的方式来发现服务。服务与服务之间通过Consul中心来统一获取调用服务的地址,而不再是传统模式下服务之间调用的“硬编码”配置管理。

服务注册(Service Register):Consul提供了两种方式进行服务注册。第一种通过Http API的方式在服务启动时注册,第二种通过json配置文件的方式注册。

健康检查(Health Checking):一旦服务注册到Consul的client节点下,consul就会根据服务注册时配置的间隔时间,主动请求服务,以获取服务的健康状态,如发现不健康的服务,则将该服务从consul中注销。

Key/Value存储:应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。

一张图简单了解下Consul

.NetCore快速上手Consul,留给自己一点思考的空间第1张

client节点

Client表示consul的client模式,即客户端模式。

1)client节点负责转发请求给server节点,本身不持久化任何信息

2)提供服务健康检查

3)client节点支持任意扩展,数量不受限制。

server 节点

Server表示consul的server模式,即服务端模式。

1)server节点接收client的转发请求,并本地持久化这些信息,遇到故障后方便排查。

2)consul集群中至少有一个server,官方建议server节点的个数3个或者5个比较合适(集群管理)。server的集群解决了单点问题,server间需要选举一个ledger,由server-ledger负责server集群之间的信息同步。

3)采用Raft一致性协议,保证server节点之间数据一致

consul节点间通信

Consul使用GossIP协议管理成员关系、广播消息到整个集群,包括两个gossip pool(LAN pool和WAN pool),LAN pool是同一个数据中心内部通信的,WAN pool是多个数据中心之间通信的,LAN pool有多个,WAN pool只有一个。

通过上图我们会发现,consul推荐是以集群的形式部署。但是很多人刚开始接触学习的时候并没有那么多机器模拟(Docker模拟咱先不讨论了),server单节点模式是否可行呢

答案当然是可行的,但弊端也显而易见,首先肯定会有单点故障问题,其次如果注册的服务太多,server需要不断的向服务发送请求,进行健康检查,显然大量、高频次的请求会极大影响consul节点。

如果只有一个server节点,那么实际上它自身即充当了client又充当了server。本文我们就以server单节点的模式,以最简单的应用和大家学习一下如何在.netcore中使用consul

准备环境.netcore3.1 、consul部署包

首先下载consul,官方地址:https://www.consul.io/downloads,解压我们会发现就是一个exe程序,掌握一些常用的cmd命令即可。

本地环境consul启动CMD命令:

首先cd到consul.exe所在目录目录

然后输入consul agent -server -bootstrap-expect=1 -node=service1 -bind=127.0.0.1 -data-dir=./data -client=0.0.0.0 -ui -config-dir=./config

常用参数说明:

-server:表示consul代理模式,有两个选择-server和-client

-bootstrap-expect:在一个数据中心中期望提供的server节点数量,只有等到指定数量的server全部启动后,才会启动集群(自行选举ledger)

-node:集群中节点名称,同一集群中唯一,默认为主机名

-bind:绑定集群内部通信的地址,表示该节点监听的地址,这个地址必须是集群内部所有节点可达的。默认是0.0.0.0(将绑定机器得所有地址,同时把 ipv4地址告诉集群得其他人)

-client:绑定客户端的ip地址,默认127.0.0.1,可绑定多个。0.0.0.0表示谁都可以访问。

-data-dir:用于存放Agent状态的目录

-ui:启用web ui

-config-dir:配置目录,将加载目录中的 .hcl 或 .json 格式配置。 注意子路径不会加载

启动consul后,我们可以通过http://localhost:8500访问consuld的UI页面

.NetCore快速上手Consul,留给自己一点思考的空间第2张

HTTP方式注册.netcore服务
新建API项目(服务A)

.NetCore快速上手Consul,留给自己一点思考的空间第3张

Nuget添加consul依赖包

.NetCore快速上手Consul,留给自己一点思考的空间第4张

添加Consul参数配置

{
  "ConsulConfig": {
    "ServiceName": "WebApi1",
    "ServiceIP": "localhost",
    "ServicePort": 6000,
    "HealthCheck": "/healthcheck",
    "ConsulAddress": "http://localhost:8500"}
}

注册服务

        public voidConfigure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if(env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();
            //添加consul服务注册
app.UseConsul();

            app.UseEndpoints(endpoints =>{
                endpoints.MapControllers();
            });
        }

consul服务注册具体实现逻辑

    public static classConsulExtensions
    {
        public static IApplicationBuilder UseConsul(thisIApplicationBuilder app)
        {
            //获取consul配置实例
            var consulConfig = app.ApplicationServices.GetRequiredService<IOptions<ConsulOptions>>().Value;
            //获取应用程序声明周期事件
            var lifetime = app.ApplicationServices.GetRequiredService<IHostApplicationLifetime>();
            var consulClient = new ConsulClient(c =>{
                //consul服务注册地址
                c.Address = newUri(consulConfig.ConsulAddress);
            });

            //服务注册配置
            var registration = newAgentServiceRegistration()
            {
                ID =Guid.NewGuid().ToString(),
                Name = consulConfig.ServiceName,//服务名称
                Address = consulConfig.ServiceIP,//服务IP
                Port = consulConfig.ServicePort,//服务端口
                Check = newAgentServiceCheck()
                {
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动后多久注册服务
                    Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔
                    HTTP = $"http://{consulConfig.ServiceIP}:{consulConfig.ServicePort}{consulConfig.HealthCheck}",//健康检查地址
                    Timeout = TimeSpan.FromSeconds(5)//超时时间
}
            };

            //服务注册
consulClient.Agent.ServiceRegister(registration).Wait();

            //应用程序结束时  取消注册
            lifetime.ApplicationStopping.Register(() =>{
                consulClient.Agent.ServiceDeregister(registration.ID).Wait();
            });

            returnapp;
        }
    }

1)使用IOptions管理配置类ConsulOptions,将配置文件(比如appsettings.json)中的配置反序列化至配置类的实例中

2)AgentServiceRegistration代理服务注册类,实例化注册服务配置。

健康检查接口

    [Route("[controller]")]
    [ApiController]
    public classHealthCheckController : ControllerBase
    {
        /// <summary>
        ///健康检查接口
        /// </summary>
        /// <returns></returns>
[HttpGet]
        public IActionResult Get() =>Ok();
    }

consul节点会根据配置的间隔时间进行定期请求改健康检查接口,获取服务健康状态。

服务启动
查看consul UI页面我们会发现我们注册的服务WebApi1信息已显示

.NetCore快速上手Consul,留给自己一点思考的空间第5张

那么如何做到服务发现呢?

通常情况下,如果服务B调用服务A,需要在服务B中配置并指向服务A的地址,也就是上面说的“硬编码”的配置方式,这种模式下,如果服务A部署了多个,那么就需要管理多个地址,并且服务B本身无法知道某个服务A挂掉就放弃请求。

而consul为我们提供了便利,现在服务B不用关心服务A具体的服务地址以及服务A是否健康。服务B直接请求consul服务地址,告诉它我要访问服务A,consul就会启动服务发现机制,找到所有已注册并且健康的服务A,然后根据选择其中的一个返回给服务B,然后服务B根据服务A具体的地址发起请求。consul帮我们管理了服务地址和服务健康检查。

下面我们就模拟一下consul的服务发现。

服务发现
新建API项目(服务B)

.NetCore快速上手Consul,留给自己一点思考的空间第3张

Nuget添加consul依赖包

.NetCore快速上手Consul,留给自己一点思考的空间第4张

模拟服务发现

[HttpGet]
        [Route("/consul")]
        public voidReuestConsul()
        {
            //获取Consul配置地址
            var consulAddress = _configuration["ConsulAddress"]?.ToString();
            using (var consulClient = new ConsulClient(x => x.Address = newUri(consulAddress)))
            {
                //获取根据服务注册名称webApi1  获取consul注册的服务
                var services = consulClient.Catalog.Service("WebApi1").Result.Response;
                if (services != null &&services.Any())
                {
                    //模拟随机一台进行请求,这里只是测试,可以选择合适的负载均衡框架
                    Random r = newRandom();
                    int index =r.Next(services.Count());
                    var service =services.ElementAt(index);
                    using (HttpClient client = newHttpClient())
                    {
                        //请求服务WebApi1
                        var response = client.GetAsync($"http://{service.ServiceAddress}:{service.ServicePort}/api/values").Result;
                        string result =response.Content.ReadAsStringAsync().Result;
                    }
                }
            }
        }

1)ConsulClient实例化consul服务节点

2)consulClient.Catalog.Service("服务名称").Result.Response根据服务名称,获取conusl注册的所有服务地址信息(IP、端口)。

好了,本文主要是采用server单节点的模式,和大家介绍了一下consul的特性,以及结合.netcore做了服务注册和模拟了服务发现。

我相信,大家带着动手测试一遍,也会有所思考和收获。

免责声明:文章转载自《.NetCore快速上手Consul,留给自己一点思考的空间》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇服务对外提供接口以供不同站点之间使用:Spring Cloud Feign使用记录及携带token请求Neo4j 第五篇:批量更新数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Raft协议--中文论文介绍

本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为《In search of an Understandable Consensus Algorithm (Extended Version)》(寻找一种易于理解的一致性算法)。 Raft 是一种用来管理日志复制的一致性算法。它和 Paxos 的性能和功能是一样的,但是它和 Paxos 的结构不一...

巅峰对决之Swarm、Kubernetes、Mesos

  另外一篇 https://www.sohu.com/a/157185937_287582 Docker Docker是一个主流容器管理工具,它是第一个基于Linux容器(LXC)的[2],但是现在被runC[46]所取代了(runC是是一个由Open Containers Initiative开发的CLI工具,它能够创建和运行容器[36])。Docke...

docker-compose搭建mongodb分片集群(单机版)

mongodb分片机制原理 一、概念:   分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。通过一个名为mongos...

Hazelcast介绍

Hazelcast介绍 什么时侯需要用例 内存中分布式计算 场景分布式消息 特性 全景 Distributed Maps 一个结点中分区 Hazelcast中的分片也称为分区,Hazelcast默认271个分区。Hazlecast通常也会对分区备份,并将副本分布到集群的不同节点上,通过数据冗余提高可靠性,这种数据的存储方式和kafka...

【DB宝46】NoSQL数据库之CouchBase简介、集群搭建、XDCR同步及备份恢复

目录 一、 CouchBase概述 1.1、简述 1.2、CouchDB和CouchBase比对 1.2.1、CouchDB和CouchBase的相同之处 1.2.2、CouchDB和CouchBase的不同之处 1.3、CouchBase的社区版和企业版的区别 1.4、Couchbase名词术语 1.5、Couchbase和RMDB对比...

vSphere

VMware vSphere集成容器(VIC)建立了一个在轻量级虚拟机内部署并管理容器的环境。全新的虚拟机环境提供了更高级别的硬件隔离度,灵活性以及可扩展性使得容器对开发人员以及企业应用具有如此大的吸引力。 构建家庭vSphere实验环境编辑 为了跟进vSphere最新变化和新功能,有许多设备可以用来搭建vSphere实验室环境。组装一套vSphere家庭...