C#使用Consul集群进行服务注册与发现

前言

我个人觉得,中间件的部署与使用是非常难记忆的;也就是说,如果两次使用中间件的时间间隔比较长,那基本上等于要重新学习使用。

所以,我觉得学习中间件的文章,越详细越好;因为,这对作者而言也是一份珍贵的备忘资料。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • .NET Core 3.0之创建基于Consul的Configuration扩展组件

    经过前面三篇关于.NET Core Configuration的文章之后,本篇文章主要讨论如何扩展一个Configuration组件出来. 了解了Configuration的源码后,再去扩展一个组件就会比较简单,接下来我们将在.NET Core 3.0-preview5的基础上创建一个基于Consul的配置组件. 相信大家对Consul已经比较了解了,很多项目都会使用Consul作为配置中心,此处也不做其他阐述了,主要是讲一下,创建Consul配置扩展的一些思路.使用Consul配置功能时,我们

  • 详解CentOS 7.4下如何部署Asp.Net Core结合consul

    上篇我们讲到consul的概念,以及在WIN下如何使用:https://www.jb51.net/article/141783.htm 步骤如下: 1.安装虚拟机VM 2.下载安装 CentOS 7.4 下载地址:https://www.jb51.net/softs/590894.html 这是安装示例: VM虚拟机安装CentOS示例 https://www.jb51.net/article/108088.htm 3.配置网络环境(确保网络通) 4.下载安装dotnet 运行环境 4.1.注册

  • springcloud使用consul作为配置中心

    Spring Cloud 中文手册: https://springcloud.cc/spring-cloud-consul.html 也就是说在我们使用consul config时最好在consul 建立相应的目录结构 适用于某一个服务的目录结构以及适用于所有的服务的目录结构 本列consul web UI :springboot为我们提供了三种环境dev:默认开发环境  test:测试环境  prod:生产环境 PS: 1.每次当我们修改consul上面的配置信息的时候,会向我们的代码发送一个

  • SpringCloud与Consul集成实现负载均衡功能

    负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术.负载均衡将特定的业务(网络服务.网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性.负载均衡基本概念有:实服务.实服务组.虚服务.调度算法.持续性等,其常用应用场景主要是服务器负载均衡,链路负载均衡. 一.背景 SpringCloud微服务目前比较流行,其中大都在使用的服务注册与发现是Eureka,最近研究了Consul的集群搭建,现使用Consul实现服务的负载均衡.其主要拓扑结构

  • 详解Spring Cloud Consul 实现服务注册和发现

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式.通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易维护的分布式系统开发工具包. Spring Cloud 包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Sprin

  • Spring boot2X Consul如何通过RestTemplate实现服务调用

    这篇文章主要介绍了spring boot2X Consul如何通过RestTemplate实现服务调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Consul可以用于实现分布式系统的服务发现与配置 服务调用有两种方式: A.使用RestTemplate 进行服务调用 负载均衡--通过Ribbon注解RestTemplate B.使用Feign 进行声明式服务调用 负载均衡--默认使用Ribbon实现 先使用RestTemplate来实现 1

  • 详解consul的安装和配置

    Consul 简化了分布式环境中的服务的注册和发现流程,通过 HTTP 或者 DNS 接口发现.支持外部 SaaS 提供者等. consul提供的一些关键特性: service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册. health checking:健康检测使consul可以快速的告警在集群中的操作.和服务发现的集成,可以防止服务转发到故障的服务上面. key/value storage:一个用来

  • 详解使用Spring Cloud Consul实现服务的注册和发现

    首先安装consul环境,参照之前的文章:https://www.jb51.net/article/141789.htm 项目规划,2个服务端,1个客户端 首先来看服务端, 一:服务端1: 项目依赖 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clou

  • C#使用Consul集群进行服务注册与发现

    前言 我个人觉得,中间件的部署与使用是非常难记忆的:也就是说,如果两次使用中间件的时间间隔比较长,那基本上等于要重新学习使用. 所以,我觉得学习中间件的文章,越详细越好:因为,这对作者而言也是一份珍贵的备忘资料. Consul简介 Consul一个什么,我想大家通过搜索引擎一定可以搜索到:所以,我就不在重复他的官方描述了. 这里,我为大家提供一个更加好理解的描述. Consul是什么? Consul本质上是一个Socket通信中间件. 它主要实现了两个功能,服务注册与发现与自身的负载均衡的集群.

  • Asp.Net Core使用Ocelot结合Consul实现服务注册和发现

    目录 1.服务注册与发现(Service Discovery) 2.Consul 3.Asp.Net Core向Consul注册服务实例 4.项目演示 4.1APIGateway项目 4.2Common项目 4.3APIServiceA项目 4.4APIServiceB项目 4.5项目运行 1.服务注册与发现(Service Discovery) 服务注册:我们通过在每个服务实例写入注册代码,实例在启动的时候会先去注册中心(例如Consul.ZooKeeper.etcd.Eureka)注册一下,

  • windows下搭建Consul集群

    Consul 是 HashiCorp 公司的一个用于实现分布式系统的服务发现与配置工具.Consul内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案.由于出现得晚些,Consul具有功能完善.部署简单.使用方便等特点. 安装consul: Consul由Go语言开发,因此也继承了Go语言跨平台,易安装的特点.可以在其官网https://www.consul.io/downloads.html下载,各个平台的安装包都提供了.基本解压就可以使用. 这里

  • 使用docker compose搭建consul集群环境的例子

    consul基本概念 server模式和client模式 server模式和client模式是consul节点的类型:client不是指的用户客户端. server模式提供数据持久化功能. client模式不提供持久化功能,并且实际上他也不工作,只是把用户客户端的请求转发到server模式的节点.所以可以把client模式的节点想象成LB(load balance),只负责请求转发. 通常server模式的节点需要配置成多个例如3个,5个.而client模式节点个数没有限制. server模式启

  • Linux环境下部署Consul集群

    目录 1.Consul概念 1.1什么是Consul? 1.2Consul的特点 1.3Consul架构 1.4Consul的应用场景包括服务发现.服务隔离与服务配置 2.Consul在linux上的集群部署 2.1前期准备 2.2集群部署 1.Consul概念 1.1什么是Consul? Consul是一种服务网格解决方案,是HashiCorp公司推出的开源组件,由Go语言开发,部署起来很容易,只需要极少的可执行程序和配置.同时Consul也是一个分布式的,高度可用的系统,它附带了一个简单的内

  • spring cloud之eureka高可用集群和服务分区解析

    目录 准备 搭建 验证 解释 准备 1.首先,在C:\WINDOWS\System32\drivers\etc\hosts文件里面添加一下映射,如果不添加也没关系,只是如果是单机环境,在eureka首页中的replicas那一项看到的其它注册中心都是localhost,我这里为了方便理解就添加了映射. 2.为了方便理解,我这里是单个application用一个module,没有采用通过多个profile开启多个application的做法,而且这样做一会儿验证起来也比较清晰. 3.必要的一些概念

  • SpringBoot + Spring Cloud Consul 服务注册和发现详细解析

    什么是Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更"一站式",内置了服务注册与发现框架.分布一致性协议实现.健康检查.Key/Value 存储.多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等).使用起来也较为简单.Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux.windows和Mac OS X):安装包仅包含一个可执行文件

  • Spring Cloud Consul的服务注册与发现

    运行Consul 以Windows为例,下载解压后,以开发模式运行: consul agent --dev 启动成功后,可以访问Consul提供的管理页面,默认端口为8500,页面上显示了已注册服务的列表,包括它们的运行状况等信息. 服务注册 1.添加Spring Cloud Consul依赖: <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artif

  • 微服务架构之服务注册与发现功能详解

    目录 微服务的注册与发现 1.服务注册 2.服务发现 3.注册中心 4.现下的主流注册中心 4.1 Eureka 4.1.1 介绍 4.1.2 整体架构 4.1.3 接入Spring Cloud 4.2 ZooKeeper 4.2.1 介绍 4.2.2 整体架构 4.2.3 接入Dubbo生态 4.3 Consul 4.3.1 介绍 4.3.2 整体架构 4.3.3 生态对接 4.4 总结对比 详解微服务架构及其演进史 微服务全景架构全面瓦解 微服务架构拆分策略详解 微服务的注册与发现 我们前面

  • 微服务架构之服务注册与发现实践示例详解

    目录 1 服务注册中心 4种注册中心技术对比 2 Spring Cloud 框架下实现 2.1 Spring Cloud Eureka 2.1.1 创建注册中心 2.1.2 创建客户端 2.2 Spring Cloud Consul 2.2.1 Consul 的优势 2.2.2 Consul的特性 2.2.3 安装Consul注册中心 2.2.4 创建服务提供者 3 总结 微服务系列前篇 详解微服务架构及其演进史 微服务全景架构全面瓦解 微服务架构拆分策略详解 微服务架构之服务注册与发现功能详解

随机推荐