1.服务注册与发现(Service Discovery)

●服务注册:我们通过在每个服务实例写入注册代码,实例在启动的时候会先去注册中心(例如Consul、ZooKeeper、etcd、Eureka)注册一下,那么客户端通过注册中心可以知道每个服务实例的地址,端口号,健康状态等等信息,也可以通过注册中心删除服务实例。这里注册中心相当于是负责维护服务实例的管控中心。
●服务发现:服务实例在注册中心注册之后,客户端通过注册中心可以了解这些服务实例运行状况。

2.Consul

如果要实现服务注册与发现,需要一个注册中心,这里主要介绍是Consul。
Consul官网:https://www.consul.io/,它主要功能有:服务注册与发现、健康检查、Key/Value、多数据中心。
如果在Windows上部署Consul,在consul.exe目录下执行consul.exe agent -dev命令行即可。
如果在Linux上部署Consul,大伙可以移步我之前写过这篇文章“Consul在linux环境的集群部署”参考下。

3.Asp.Net Core向Consul注册服务实例

Asp.Net Core向Consul注册服务实例调用过程如下图所示(图片来源于https://www.cnblogs.com/zhouandke/p/10534836.html):

Asp.Net Core向Consul注册服务实例需要在Gateway项目中引用Consul支持的NuGet软件包,安装命令如下:

Install-Package Ocelot.Provider.Consul

然后将以下内容添加到您的ConfigureServices方法中:

services.AddOcelot().AddConsul();

在Ocelot服务发现项目示例中,通过APIGateway项目GlobalConfiguration选项可以配置服务注册与发现,文件配置具体代码如下:

{
"Routes": [
{
"UseServiceDiscovery": true,
"DownstreamPathTemplate": "/{url}",
"DownstreamScheme": "http",
"ServiceName": "MyService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"UpstreamPathTemplate": "/{url}",
"UpstreamHttpMethod": [ "Get" ],
"ReRoutesCaseSensitive": false
}
],
"GlobalConfiguration": {
//服务发现配置
"ServiceDiscoveryProvider": {
//注册中心Consul地址
"Host": "192.168.113.128",
//注册中心Consul端口号
"Port": 8500,
"Type": "Consul",
//以毫秒为单位,告诉Ocelot多久调用一次Consul来更改服务配置。
"PollingInterval": 100,
//如果你有在Consul上配置key/value,则在这里输入配置key。
"ConfigurationKey": "MyService_AB"
}
}
}

ServiceDiscoveryProvider选项说明:
●Host:注册中心Consul地址。
●Port:注册中心Consul端口号。
●Type:注册中心类型。
●PollingInterval:以毫秒为单位,告诉Ocelot多久调用一次Consul来更改服务配置。
●ConfigurationKey:如果你有在Consul上配置key/value,则在这里输入配置key。

4.项目演示

4.1APIGateway项目

ConfigureServices添加Ocelot、Consul注入:

services.AddOcelot().AddConsul();

Configure添加使用Ocelot:

app.UseOcelot().Wait();

服务发现配置如Ocelot服务发现项目示例一样。

4.2Common项目

先安装Consul的NuGet软件包,安装命令如下:

Install-Package Consul

在该项目添加一个AppExtensions扩展类,用来对服务APIServiceA、APIServiceB项目在Consul注册实例,为了展示效果,具体代码稍作修改如下:

public static class AppExtensions
{
public static IServiceCollection AddConsulConfig(this IServiceCollection services, IConfiguration configuration)
{
services.AddSingleton<IConsulClient, ConsulClient>(p => new ConsulClient(consulConfig =>
{
var address = configuration.GetValue<string>("Consul:Host");
consulConfig.Address = new Uri(address);
}));
return services;
}
public static IApplicationBuilder UseConsul(this IApplicationBuilder app, string host = null, string port = null)
{
//获取consul客户端实例
var consulClient = app.ApplicationServices.GetRequiredService<IConsulClient>();
var logger = app.ApplicationServices.GetRequiredService<ILoggerFactory>().CreateLogger("AppExtensions");
var lifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>(); if (!(app.Properties["server.Features"] is FeatureCollection features)) return app; //var addresses = features.Get<IServerAddressesFeature>();
//var address = addresses.Addresses.FirstOrDefault();
//if (address == null)
//{
// return app;
//} var address = host + ":" + port;
if (string.IsNullOrWhiteSpace(host) || string.IsNullOrWhiteSpace(port))
{
Console.WriteLine($"host或者port为空!");
return app;
} Console.WriteLine($"address={address}");
var uri = new Uri(address);
Console.WriteLine($"host={uri.Host},port={uri.Port}"); var registration = new AgentServiceRegistration()
{
ID = $"MyService-{uri.Port}",
Name = "MyService",
Address = $"{uri.Host}",
Port = uri.Port,
Check = new AgentServiceCheck()
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册
Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔
HTTP = $"{address}/HealthCheck",//健康检查地址
Timeout = TimeSpan.FromSeconds(5)//超时时间
}
};
logger.LogInformation("Registering with Consul");
logger.LogInformation($"Consul RegistrationID:{registration.ID}");
//注销
consulClient.Agent.ServiceDeregister(registration.ID).ConfigureAwait(true);
//注册
consulClient.Agent.ServiceRegister(registration).ConfigureAwait(true);
//应用程序关闭时候
lifetime.ApplicationStopping.Register(() =>
{
//正在注销
logger.LogInformation("Unregistering from Consul");
consulClient.Agent.ServiceDeregister(registration.ID).ConfigureAwait(true);
});
//每个服务都需要提供一个用于健康检查的接口,该接口不具备业务功能。服务注册时把这个接口的地址也告诉注册中心,注册中心会定时调用这个接口来检测服务是否正常,如果不正常,则将它移除,这样就保证了服务的可用性。
app.Map("/HealthCheck", s =>
{
s.Run(async context =>
{
await context.Response.WriteAsync("ok");
});
});
return app;
}
}

4.3APIServiceA项目

项目添加一个Get方法,对应APIGateway项目的路由上下游配置,具体代码如下:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
var port = Request.Host.Port;
return new string[] { "value1", "value2", port.Value.ToString() };
}
}

appsettings.json配置加入Consul地址:

"Consul": {
"Host": "http://192.168.113.128:8500"
}

4.4APIServiceB项目

项目添加一个Get方法,对应APIGateway项目的路由上下游配置,具体代码如下:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
var port = Request.Host.Port;
return new string[] { "value3", "value4", port.Value.ToString() };
}
}

appsettings.json配置加入Consul地址:

"Consul": {
"Host": "http://192.168.113.128:8500"
}

4.5项目运行

在APIServiceA、APIServiceB项目的ConfigureServices添加Consul配置:

services.AddConsulConfig(Configuration);

在Configure添加Consul服务注册:

APIServiceA:app.UseConsul("http://172.168.18.73", "9999");
APIServiceB:app.UseConsul("http://172.168.18.73", "9998");

把APIGateway、APIServiceA、APIServiceB三个项目部署到IIS上:

三个项目运行起来后,通过浏览器Consul客户端可以看到MyService节点服务情况:

点击打开MyService节点可以看到注册到Consul的APIServiceA、APIServiceB服务状况:

如果把APIServiceB服务实例站点停掉:

通过Consul客户端会看到APIServiceB服务实例已经被剔除了:

如果输入CTRL+C把集群中某一个Consul服务关闭,那么集群会重新选举一个新的leader,负责处理所有服务实例的查询和事务:



参考文献:
Ocelot官网

(8)ASP.NET Core3.1 Ocelot Consul服务注册与发现的更多相关文章

  1. ASP.NET Core gRPC 使用 Consul 服务注册发现

    一. 前言 gRPC 在当前最常见的应用就是在微服务场景中,所以不可避免的会有服务注册与发现问题,我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心,本文主要介绍 ...

  2. .NET5 API 网关Ocelot+Consul服务注册

    1|0网关介绍 网关其实就是将我们写好的API全部放在一个统一的地址暴露在公网,提供访问的一个入口.在 .NET Core下可以使用Ocelot来帮助我们很方便的接入API 网关.与之类似的库还有Pr ...

  3. 微服务~Consul服务注册与发现

    服务发现是基于微服务架构的关键原则之一.尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱.Consul通过HTTP API和DNS提供服务发现服务.Spring Cloud Consul利 ...

  4. SpringBoot + Spring Cloud Consul 服务注册和发现

    什么是Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更"一站式" ...

  5. consul服务注册与发现

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. 温故知新,.Net Core遇见Consul(HashiCorp),实践分布式服务注册与发现

    什么是Consul 参考 https://www.consul.io https://www.hashicorp.com 使用Consul做服务发现的若干姿势 ASP.NET Core 发布之后通过命 ...

  7. 三. SpringCloud服务注册与发现

    1. Eureka 1.1 Eureka理解 什么是服务治理 Spring Cloud封装了Netflix公司开发的Eurkeka模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与服务之 ...

  8. .Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关

    1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderEx ...

  9. .netcore consul实现服务注册与发现-单节点部署

    原文:.netcore consul实现服务注册与发现-单节点部署 一.Consul的基础介绍     Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分 ...

随机推荐

  1. [MIT6.006] 19. Daynamic Programming I: Fibonacci, Shortest Path 动态规划I:斐波那契,最短路径

    这节课讲动态规划的内容,动态规划是一种通用且有效的算法设计思路,它的主要成分是"子问题"+"重用".它可以用于斐波那契和最短路径等问题的求解上. 一.斐波那契 ...

  2. Luogu P6833 【[Cnoi2020]雷雨】

    这道题赛时的时候想了一个奇怪的做法但是没过,后来经过Stay_hungry的提示就码了这道题. 雷电必定会在一点处分叉,分别电击地上的两个点,我们只需要枚举这个分叉点.那么怎么算出这个点和目标点的距离 ...

  3. http代理阅读4 响应缓存处理

    if (c->read->ready) { ngx_http_upstream_process_header(r, u); //读事件触发 准备处理http头部信息 return; } 向 ...

  4. 如何删除一台OSD主机

    在ceph的一台OSD主机出现故障的时候,数据可以通过副本的机制进行恢复,之后通过删除osd的操作也能够将故障osd从osd tree当中删除掉,但是故障的 osd 的主机仍然会留在集群当中,通过 c ...

  5. K8S环境的Jenkin性能问题描述

    Return Homezq2599 CnBlogsHomeContactAdminPosts - 75 Articles - 0 Comments - 16 K8S环境的Jenkin性能问题处理 环境 ...

  6. Service Cloud零基础学习(二)Entitlement & MileStone

    https://trailhead.salesforce.com/content/learn/modules/entitlements 很少会有人不买东西,买的多了也很少没有人没有经历过售后流程.我们 ...

  7. 2021版的思维导图MindManager 安装激活以及换机教程

    思维导图软件MindManager更新版本啦,相信细心的小伙伴应该已经发现了,MindManager最新版的名称变成了MindManager Windows 21,并且更新了很多新功能,点击查看Min ...

  8. SFTP 服务器cd() 方法和 ls() 方法说明

    方法说明: cd():这个方法用于进入某个目录下. 默认情况,当连接SFTP服务器成功后直接进入用户目录,比如我连接自己本机SFTP服务器后进入/Users/mac目录.cd() 方法进入每一个目录都 ...

  9. yii2.0 中数据查询中 or、in、between 及session的使用

    1 HTML: 2 3 <div> 4 <form class="form-inline " method="get" action=&quo ...

  10. linux配置tomcat项目包

    安装配置tomcat 操作系统:  centos 7.1 使用模式:命令模式 使用工具:xshell5 .xftp5 注意之前有配置过tomcat需要进行以下4个步骤 1.关闭网管服务 输入命令: 进 ...