1、什么是服务注册中心?

在学习服务注册与发现时,我们要先搞明白到底什么是服务注册与发现。

在这里我举一个生活中非常普遍的例子——网购来简单说明,网购在我们日常生活中已经是非常普遍了,其实网购中的(商家—菜鸟驿站—买家),就组成了一个非常简单的注册发现逻辑。在我们购买商品之后,需要拿到这件商品,如果是普通的点对点服务,商家直接将商品快递给买家,如果买家临时有事不在家,这个时候将会收货失败。

当引入注册中心—菜鸟驿站之后,商家发货后只需要将商品发送给菜鸟驿站(服务注册),买家在合适的时间通过快递号或者扫码去菜鸟驿站拿取自己的商品(服务发现),在这个环节中,菜鸟驿站只负责商品的收与发,这样就构成了一个简单的服务发现逻辑。

2、为什么要使用服务注册中心?

1、解耦:

服务消费者和服务提供者之间完全解耦。就如同上面的例子:买家不用去关心卖家到底发什么快递,只要我去快递驿站能拿到商品就OK。

2、扩展:

服务消费者和服务提供者增加和删除新的服务时,对于双方没有任何影响。比如:买家买了多个不同的商品,这时买家也只需要根据不同的取件凭据去菜鸟驿站拿取对应的商品就OK。

3、不同的服务注册中心组件

zookeeper

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper包含一个简单的原语集,提供Java和C的接口。

consul

Consul 是 HashiCorp 公司推出的开源产品,用于实现分布式系统的服务发现、服务隔离、服务配置,这些功能中的每一个都可以根据需要单独使用,也可以同时使用所有功能。Consul 官网目前主要推 Consul 在服务网格中的使用。

etcd

etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。

eureka

eureka注册中心已经闭源,不建议在家学习使用。

4、什么是Consul

Consul是一个用来实现分布式系统的服务发现与配置的开源工具。是由go语言开发。他主要由多个组成部分:

  • 服务发现:客户端通过Consul提供服务,类似于API、MySQL、或者其他客户端可以使用Consul发现服务的提供者。使用类似DNS或者HTTP,应用程序和可以很轻松的发现他们依赖的服务。

  • 检查健康:Consul客户端可以提供与给定服务相关的健康检查(Web服务器返回200 ok)或者本地节点(“内存利用率低于90%”)。这些信息可以监控集群的运行情况,并且使访问远离不健康的主机组件。

  • 键值对存储:应用程序可以使用Cousul的层级键值对。

  • 多数据中心:Consul有开箱及用的多数据中心。

5、如何在asp.net core中使用Consul

概念性的内容已经讲的差不多了,下面我们来看看如何在asp.net core+windows下使用Consul。

5.1、下载Consul

官网地址: https://www.consul.io/

下载地址: https://releases.hashicorp.com/consul/1.7.2/https://www.consul.io/downloads.html

5.2、启动Consul

consul.exe agent -dev

参数介绍:

  • Version:consul版本
  • Node ID:consul当前启动的节点ID
  • Node name:consul当前启动的节点名称,默认当前电脑名称
  • Datacenter:数据中心
  • Service:consul的启动模式,true表示服务端模式,false表示客户端模式
  • Client Addr:客户端连接地址,支持HTTP、HTTPS、GRPC、DNS,默认使用HTTP
  • Cluster Addr:集群地址,就是Server模式下的启动方式

5.3、编码

5.3.1、创建两个asp.net core webapi项目,并分别引用Consul的包。

5.3.2、编写服务提供者代码

在服务提供项目(ConsulService)的Startup类的Configure方法内编写如下代码:

             // 创建Consul的客户端连接
var consulClient = new ConsulClient(configuration =>
{
// Consul的连接地址
configuration.Address = new Uri("http://127.0.0.1:8500");
});
// 创建Consul的服务注册信息
var registration = new AgentServiceRegistration()
{
// 服务ID
ID = Guid.NewGuid().ToString(),
// 服务名称
Name = "demoService",
// 服务连接地址
Address = "https://localhost",
// 端口
Port =
// AgentServiceRegistration对象还有一些其他属性,后面有机会再了解
};
// 注册服务
consulClient.Agent.ServiceRegister(registration);

然后启动项目:

项目启动成功,我们访问Consul的可视化web页面(地址默认是8500端口),看服务是否注册成功:

从上面的截图可以看到,我们刚刚注册的demoService服务已经注册成功了。

5.3.3、编写服务消费者代码

在服务消费者项目中添加一个Service文件夹,新增一个服务消费的接口然后实现这个接口:

     public interface IDemoService
{
Task<string> GetDemoService();
}
public class DemoService : IDemoService
{
private readonly IHttpClientFactory httpClientFactory; public DemoService(IHttpClientFactory httpClientFactory)
{
this.httpClientFactory = httpClientFactory;
} public async Task<string> GetDemoService()
{
var res = "";
// 创建consul连接对象
var consulClient = new Consul.ConsulClient(configuare =>
{
// Consul的连接地址
configuare.Address = new Uri("http://127.0.0.1:8500");
});
// 根据刚才注册的服务名称获取对应的服务
var queryResult = await consulClient.Catalog.Service("demoService");
// 服务连接地址
var serviceUrls = new List<string>();
// 遍历获取到的服务列表
foreach (var service in queryResult.Response)
{
// 拼接连接地址
serviceUrls.Add(service.ServiceAddress + ":" + service.ServicePort);
}
HttpClient httpClient = httpClientFactory.CreateClient();
HttpResponseMessage response = await httpClient.GetAsync(serviceUrls[] + "/api/Home/");
if (response.StatusCode == HttpStatusCode.OK)
{
res = await response.Content.ReadAsStringAsync();
}
return res;
}
}

在控制器调用这个服务:

         private readonly ILogger<HomeController> _logger;
private readonly IDemoService _demoService; public HomeController(ILogger<HomeController> logger, IDemoService demoService)
{
_logger = logger;
_demoService = demoService;
} [HttpGet]
public Task<string> Get()
{
return _demoService.GetDemoService();
}

注意,记得在Startup类中的ConfigureService方法中注入上面的服务接口与类,具体为什么要注入应该不用我多说了。

 services.AddScoped<IDemoService, DemoService>();

最后,我们启动消费者项目,并请求对应接口看看效果,很显然,服务已经请求成功。


这篇文章暂时就到这里,上面就是.net core对Consul最简单的应用。随着学习的深入,后面会有相应的学习笔记记录。

因为本人也是处于探索阶段,上面所写的也仅仅是一些学习笔记,所以一些理解可能不够准确,希望所写的一些内容出现错误大家能给予包容和指正。

.net core学习笔记,组件篇:服务的注册与发现(Consul)初篇的更多相关文章

  1. SpringCloud教程 | 第一篇: 服务的注册与发现

    一.spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运 ...

  2. SpringCloud学习(一)服务的注册与发现Eureka(Finchley版本)

    创建服务注册中心 在这里,我还是采用Eureka作为服务注册与发现的组件. 首先创建一个空项目 首先创建一个空项目,再创建一个maven项目,首先创建一个主Maven工程,在其pom文件引入依赖,sp ...

  3. (转) 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

    一.spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运 ...

  4. .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]

    原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...

  5. .NET CORE学习笔记系列(2)——依赖注入【3】依赖注入模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-03.html IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架中以实现对流 ...

  6. .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]

    原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...

  7. .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...

  8. .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]

    原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...

  9. .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...

  10. .NET CORE学习笔记系列(2)——依赖注入【1】控制反转IOC

    原文:https://www.cnblogs.com/artech/p/net-core-di-01.html 一.流程控制的反转 IoC的全名Inverse of Control,翻译成中文就是“控 ...

随机推荐

  1. 发送ajax请求时候注意的问题

    1.在发送ajax请求一般都是默认为异步,就是不去等待后台响应直接可以继续发送, 但这样会有时候遇到一些问题,无法获得后台的响应参数, 所以在你打开编辑弹出框完成数据编辑后无法刷新页面, 这时候可能存 ...

  2. Linux的VMWare下Centos7的三种网络配置过程(网络二)

    Linux之VMWare下Centos7的三种网络配置过程 环境:虚拟软件:VMWare 14.0客户机:windows 10虚拟机:centos 7 VMware三种网络连接方式 Bridge(桥接 ...

  3. ABAP 动态备份自建表数据到新表(自建表有数据的情况下要改字段长度或者其他)

    当abaper开发好一个程序给用户使用一段时间后,发现某个字段的长度需要修改,但数据库表中已经存在很多数据,冒然直接改表字段可能会导致数据丢失,这种问题的后果可能非常严重. 所以我想到先复制出一个新表 ...

  4. 【SCOI2005】互不侵犯 题解(状压DP)

    前言:一道状压DP的入门题(可惜我是个DP蒟蒻QAQ) ------------------ 题意简述:求在一个$n*n$的棋盘中放$k$个国王的方案数.注:当在一个格子中放入国王后,以此格为中心的九 ...

  5. (恐怕是)写得最通俗易懂的一篇关于HashMap的文章——xx大佬这样说

    先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个有颜值却假装靠才华苟且的程序员. 本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我 ...

  6. 推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求

    推荐一个比较好用的流媒体服务开源代码: ZLMediaKit: 实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求 https://gitee.com/xiahcu/Z ...

  7. 全球疫情爬取APP版

    全球疫情统计APP图表展示: 将该任务分解成三部分来逐个实现: ①爬取全球的疫情数据存储到云服务器的MySQL上 ②在web项目里添加一个servlet,通过参数的传递得到对应的json数据 ③设计A ...

  8. Python | 常见的反爬及解决方法,值得收藏

    我们都知道Python用来爬数据,为了不让自家的数据被别人随意的爬走,你知道怎么反爬吗?今天播妞带着大家一起见识见识常见的反爬技术. 很多人学习python,不知道从何学起.很多人学习python,掌 ...

  9. zuul路由网关集成ssl,实现http到https的转变

    1 前言 最近几天刚开始接触微信小程序的开发,才接触到了https的概念(微信小程序中的请求必须为https请求,不然请求无法成功).https算是对http的安全封装,在http的基础上加了ssl证 ...

  10. 8 Java 条件逻辑语句

    生活中,我们经常需要先做判断,然后才决定是否要做某件事情.例如,在上学的时候,如果期末考试成绩在全校能拿到前100名,则奖励一个 iPhone 11 .对于这种“需要先判断条件,条件满足后才执行的情况 ...