.NET CORE微服务中CONSUL的相关使用

1.consul在微服务中的作用

consul主要做三件事:1.提供服务到ip的注册

2.提供ip到服务地址的列表查询

3.对提供服务方做健康检查(定时调用服务方一个用于健康检查的api接口 告诉消费方,服务方的服务是否还存在)

2.consul的下载及安装

1.consul的下载地址 www..consul.io

2.consul的安装   consul agent -dev  开发环境测试,在生产环境中要建立集群

3.consul的监控页面 http://127.0.0.1:8500

3.相关代码

   新建一个Asp.net core Web应用程序,选择Web API,名称为MsgService

1.rest服务的准备

在Controller文件夹中 新建一个控制器ValueController  ,rest服务的准备

namespace MsgService.Controllers
{
   [Route("api/[controller]")]
   [ApiController]
   public class ValuesController : ControllerBase
   {
    // GET api/values
   [HttpGet]
   public ActionResult<IEnumerable<string>> Get()
  {
    return new string[] { "value1", "value2" };
  }

// GET api/values/5
  [HttpGet("{id}")]
  public ActionResult<string> Get(int id)
  {
    return "value";
  }

// POST api/values
  [HttpPost]
  public void Post([FromBody] string value)
  {
  }

// PUT api/values/5
  [HttpPut("{id}")]
  public void Put(int id, [FromBody] string value)
  {
  }

// DELETE api/values/5
  [HttpDelete("{id}")]
  public void Delete(int id)
  {
  }
 }
}

再创建一个

namespace MsgService.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class SMSController : ControllerBase
{
//发请求,报文体为{phoneNum:"110",msg:"aaaaaaaaaaaaa"},
[HttpPost(nameof(Send_MI))]
public void Send_MI(dynamic model)
{
Console.WriteLine($"通过小米短信接口向{model.phoneNum}发送短信{model.msg}");
}

[HttpPost(nameof(Send_LX))]
public void Send_LX(SendSMSRequest model)
{
Console.WriteLine($"通过联想短信接口向{model.PhoneNum}发送短信{model.Msg}");
}

[HttpPost(nameof(Send_HW))]
public void Send_HW(SendSMSRequest model)
{
Console.WriteLine($"通过华为短信接口向{model.PhoneNum}发送短信{model.Msg}");
}
}

public class SendSMSRequest
{
public string PhoneNum { get; set; }
public string Msg { get; set; }
}
}

.net core连接consul  install-package consul

2.服务的治理(服务的注册 注销 健康检查)

在新创建的Web API程序的Startup.cs中完成服务的注册

public void Configure(IApplicationBuilder app,IHostEnvironment env,IApplicationLifetime applicationTime)

{

if (env.IsDevelopment())
  {
       app.UseDeveloperExceptionPage();
  }
  else
  {
      app.UseHsts();
  }

string ip = Configuration["ip"];//获取服务的ip地址

string port = Configuration["port"];//获取服务的端口号

string serviceName = "MsgService";//服务的名称

string serviceId = serviceName +Guid().NewGuid();//服务的ID 必须保证每一个服务的id是不一样的

//consul的本地默认的ip及端口号为http://127.0.0.1:8500   可以自己进行设置

using(var consulClient = new ConsulClient(a=>{a.Address = new Uri("http://127.0.0.1:8500";a.DataCenter="dic1";)})){

AgentServiceRegistration asr = new AgentServiceRegistration();//创建一个服务代理的注册者

asr.Address = ip;

asr.Port = port;

asr.ID = serviceId;

asr.Name = serviceName;

asr.Check = new AgentServiceCheck(){ //设置健康检查间隔时间以及检查地址

  DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//

HTTP = $"http://{ip}:{port}/api/Health",

Interval = TimeSpan.FromSeconds(10),

TimeOut = TimeSpan.FromSeconds(5)

};

//这是一个异步方法

consulClient.Agent.ServiceRegister(asr).wait();

}

//注销服务

applicationTime.ApplicationStopped.Register(()=>{

using(var consulClient  = new ConsulClient(a=>a.Address = new Uri("http://127.0.0.1:8500")))

{

//通过服务的Id完成服务的销毁

consulClient.Agent.ServiceDeregister(serviceId).wait();

}

})
}

3.服务的发现

编写服务消费者

创建一个.net core控制台程序或者web应用程序 ,在startup.cs中

app.run(async(context)=>{

using(var consulClient= new ConsulClient(a=>a.Address=new Uri("http://127.0.0.1:8500"))){

//客户端负载均衡

var services = consulClient.Agent.Services().Result.Response.Values.Where(a=>a.Service.Equals("MsgService"));//找到服务名称为MsgService的服务

//通过随机数获取一个随机索引 去除索引为生成的随机数的服务

Random r = new Random();

int index = r.Next(service.Count());

var service = services.ElementAt(index);

await context.Response.WriteAsync($"id={service.ID},name={service.Service},ip={service.Address},port={service.Port}");

//服务

using(HttpClient http = new HttpClient())

using(var httpContent = new StringContent("{phoneNum:'119',msg:'help'}", Encoding.UTF8, "application/json")){

var http.PostAsync($"http://{service.Address}:{service.Port}/api/SMS/Send_LX", httpContent).Result;

await context.Response.WriteAsync(result.StatusCode.ToString());

}

}

})

.NET CORE微服务中CONSUL的相关使用的更多相关文章

  1. 基于.net core微服务(Consul、Ocelot、Docker、App.Metrics+InfluxDB+Grafana、Exceptionless、数据一致性、Jenkins)

    1.微服务简介 一种架构模式,提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(RESTfu ...

  2. (3).NET CORE微服务 Micro-Service ---- Consul服务治理

    Consul是注册中心,服务提供者.服务提供者.服务消费者等都要注册到Consul中,这样就可以实现服务提供者.服务消费者的隔离. 除了Consul之外,还有Eureka.Zookeeper等类似软件 ...

  3. (3)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Consul服务治理

    Consul是注册中心,服务提供者.服务提供者.服务消费者等都要注册到Consul中,这样就可以实现服务提供者.服务消费者的隔离. 除了Consul之外,还有Eureka.Zookeeper等类似软件 ...

  4. (4).NET CORE微服务 Micro-Service ---- Consul服务发现和消费

    上一章说了  Consul服务注册  现在我要连接上Consul里面的服务 请求它们的API接口 应该怎么做呢? 1.找Consul要一台你需要的服务器 1.1 获取Consul下的所有注册的服务 u ...

  5. (4)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Consul服务发现和消费

    上一章说了  Consul服务注册  现在我要连接上Consul里面的服务 请求它们的API接口 应该怎么做呢? 1.找Consul要一台你需要的服务器 1.1 获取Consul下的所有注册的服务 u ...

  6. .NET Core微服务之基于Consul实现服务治理

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...

  7. .NET Core微服务之基于Consul实现服务治理(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...

  8. ASP.NET Core 微服务初探[1]:服务发现之Consul

    ASP.NET Core 微服务初探[1]:服务发现之Consul   在传统单体架构中,由于应用动态性不强,不会频繁的更新和发布,也不会进行自动伸缩,我们通常将所有的服务地址都直接写在项目的配置文件 ...

  9. 微服务中的健康监测以及其在ASP.NET Core服务中实现运行状况检查

    1 .什么是健康检查? 健康检查几乎就是名称暗示的.它是一种检查您的应用程序是否健康的方法.随着越来越多的应用程序转向微服务式架构,健康检查变得尤其重要(Health Check).虽然微服务架构有很 ...

随机推荐

  1. RabbitMQ消息队列(十二)-性能测试

    硬件配置 宿主机用的联想3850X6的服务器四颗E7-4850v3的处理器,DDR4内存,两块1.25TB的pcie固态.在宿主机上使用的事esxi5.5的虚拟化平台,在子系统中安装RabbitMQ和 ...

  2. PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第二讲,被除数是正数 除数非2的幂

    目录 一丶简介 二丶代码还原讲解 1.被除数无符号 除数非2的幂 2.被除数无符号 除数为特例7 三丶代码还原总结 一丶简介 上一篇博客说的除2的幂. 如果被除数是有符号的,那么会进行调整,并使用位操 ...

  3. Spring中用了哪些设计模式

    1 简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. ...

  4. 关于HTML相关知识随记

    HTML是构成网页文档的主要语言,它由HTML标签和字符信息组成.HTML标签可以标识文字.图形.动画.声音.表格.超链接等网页对象,字符信息用以传达网页内容,如标题.段落文本.图像等. HTML4文 ...

  5. Perl线程队列:Thread::Queue

    (Thread::Queue)队列数据结构(FIFO)是线程安全的,它保证了某些线程从一端写入数据,另一些线程从另一端读取数据.只要队列已经满了,写入操作就自动被阻塞直到有空间支持写操作,只要队列空了 ...

  6. IO通信模型(一)同步阻塞模式BIO(Blocking IO)

    几个概念 阻塞IO 和非阻塞IO 这两个概念是程序级别的.主要描述的是程序请求操作系统IO操作后,如果IO资源没有准备好,那么程序该如何处理的问题:前者等待:后者继续执行(但是使用线程一直轮询,直到有 ...

  7. Java开发笔记(五十六)利用枚举类型实现高级常量

    前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...

  8. MySql 双主多从配置指导

    MySql 双主多从配置指导 一.背景 互联网项目为了数据的可靠性和架构的可拓展性经常会用到双主多从的数据库,来实现数据的备份.负载均衡和突发状况时数据库切换. 二.思路 配置两台数据库A.B互为主从 ...

  9. vs文件上传失败--超过最大字符限制

    一.问题 在文件上传时,会遇到大文件上传失败. >F12查看报错网络请求返回结果 >问题分析 由于vs上传文件默认的字符大小控制. 二.解决方法 >在web.config中修改或添加 ...

  10. 【NodeJS】Node.JS 开发环境安装

    1.前言 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O ...