首页 > 其他分享 >06_NET中使用Consul(服务发现)

06_NET中使用Consul(服务发现)

时间:2024-04-16 11:15:27浏览次数:17  
标签:06 Consul public var new NET consul 服务端

官网:Consul by HashiCorp 

中文文档:Consul 中文文档 | Consul 中文文档 (gitbook.io)

安装Consul

window安装:Install | Consul | HashiCorp Developer

1. 选择windows x64 版本(64bit)
2. 进入下载好的文件夹中,打开powershell ,执行命令,启动服务端代理

consul.exe agent -dev

3. 浏览器输入:http://IP:8500/出现ConsulWeb界面就表示成功了

-dev 表示开发模式,生产环境下不建议使用,因为它不会保存任何状态
-server 生产环境下可使用

 

Docker 安装:

docker pull consul # 默认拉取latest
docker pull consul:1.15.4 # 拉取指定版本

安装并运行

docker run -d -p 8500:8500 --restart=always --name=consul consul agent -server - bootstrap -ui -node=1 -client='0.0.0.0'

agent: 表示启动 Agent 进程。
server:表示启动 Consul Server 模式
client:表示启动 Consul Cilent 模式。
bootstrap:表示这个节点是 Server-Leader ,每个数据中心只能运行一台服务器。技术角度上讲Leader 是通过 Raft 算法选举的,但是集群第一次启动时需要一个引导 Leader,在引导群集后,建议不要使用此标志。
ui:表示启动 Web UI 管理器,默认开放端口 8500,所以上面使用 Docker 命令把 8500 端口对外开放。
node:节点的名称,集群中必须是唯一的,默认是该节点的主机名。
client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0
join:表示加入到某一个集群中去。 如:-json=192.168.0.11。

 

使用Consul:

服务端

新建一个WebApi项目:Consul.ServiceA

修改appsettings.json配置文件

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Consul": {
    "HostAddress": "http://localhost:8500", 
    "ServiceAddress": "localhost",
    "Port": 5011,
    "ServerName": "Consul.ServiceA"
  }
}

HostAddress:Consul地址;   ServiceAddress:服务地址; Port:端口;  ServerName:服务名称

添加映射类

public class ConsulOption
{
    public string HostAddress { get; set; }
    public string ServiceAddress { get; set; }
    public int Port { get; set; }
    public string ServerName { get; set; }
}

 

添加扩展类

public static class ConsulServiceExtension
{
    public static IServiceCollection AddConsulService(this IServiceCollection services, IConfiguration configuration )
    {
        //获取配置文件信息
        var consulSection = configuration.GetSection("Consul");
        services.Configure<ConsulOption>(consulSection);
        var consulOption = consulSection.Get<ConsulOption>();

        //添加consul地址
        services.AddConsul(p =>
        {
            p.Address = new Uri(consulOption.HostAddress);
        });

        //注册consul
        services.AddConsulServiceRegistration(p =>
        {
            p.ID = Guid.NewGuid().ToString();
            p.Name = consulOption.ServerName;
            p.Address = consulOption.ServiceAddress;
            p.Port = consulOption.Port;
            
            // 健康检查
            p.Check = new()
            {
                // 1. 如果服务不可用(健康检查失败)的情况下,多久将当前服务移除
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
                // 2. 健康检查间隔时间
                Interval = TimeSpan.FromSeconds(10),
                // 3. 健康检查地址(心跳地址)
                HTTP = $"http://{p.Address}:{p.Port}/health"
                // 4. 超时时间
                ,Timeout = TimeSpan.FromSeconds(5)
            };
        });

        return services;
    }
}

Program.cs

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddSwaggerGen();
builder.Services.AddConsulService(builder.Configuration);
var app = builder.Build();

app.UseSwagger();
app.UseSwaggerUI();

app.UseAuthorization();

app.MapControllers();

app.Run();

 

添加HealthController控制器

[ApiController]
[Route("[controller]")]
public class HealthController:ControllerBase
{

    [HttpGet]
    public IActionResult Check()
    {
        return Ok($"进行心跳检测:{DateTime.Now}");
    }
    
}

 

客户端:

新建一个webApi项目:Consul.Client

配置和服务端一致;appsettings.json的配置要记得修改;

 

-----------------------------------------------------漂亮的分割线-------------------------------------------------------------------------

测试:

服务端Consul.ServiceA添加一个控制器用于测试

[Route("[controller]/[action]")]
[ApiController]
public class ProductController:ControllerBase
{
    [HttpGet]
    public IActionResult GetProduct()
    {
        List<ProductInfo> list = new()
        {
            new() {Id = 1, Name = "商品1"},
            new() {Id = 2, Name = "商品2"}
        };
        return Ok(list);
    }
}

 

客户端Consul.Client添加一个控制器ClientController 去调用服务端

[Route("[controller]/[action]")]
[ApiController]
public class ClientController:ControllerBase
{
    private readonly IConsulClient _consulClient;

    public ClientController(IConsulClient consulClient)
    {
        _consulClient = consulClient;
    }

    [HttpGet]
    public async Task<IActionResult> GetProductByClient()
    {
        var instanceList = (await _consulClient.Catalog.
            Service("Consul.ServiceA")).Response;
        //随机获取一个服务
        var instance = instanceList[new Random().Next(instanceList.Length)];

        using HttpClient client = new();
        var json = await client.GetStringAsync($"http://{instance.ServiceAddress}:{instance.ServicePort}/Product/GetProduct");
        var result = JsonConvert.DeserializeObject<List<ProductInfo>>(json);

        return Ok(result);
    }
}

 

-----------------------------------------------------漂亮的分割线-------------------------------------------------------------------------

添加多个服务端(集群)

配置和Consul.ServiceA也是一样的,appsettings.json的配置要记得修改

"Consul": {
    "HostAddress": "Consul地址", 
    "ServiceAddress": "服务端地址",
    "Port": 服务端口,
    "ServerName": "这里的名称都要一样"
  }

 

标签:06,Consul,public,var,new,NET,consul,服务端
From: https://www.cnblogs.com/MingQiu/p/18137671

相关文章

  • VMware Tanzu Kubernetes Grid Integrated Edition (TKGI) 1.19 - 运营商 Kubernetes
    VMwareTanzuKubernetesGridIntegratedEdition(TKGI)1.19-运营商Kubernetes解决方案Kubernetes-basedcontainersolutionwithadvancednetworking,aprivatecontainerregistry,andlifecyclemanagement请访问原文链接:https://sysin.org/blog/vmware-tkgi/,查......
  • Fortinet FortiGate Firmware (FortiOS 7.6) 全系列下载 - 下一代防火墙 (NGFW)
    FortinetFortiGateFirmware(FortiOS7.6)全系列下载-下一代防火墙(NGFW)防特网飞塔防火墙系统软件请访问原文链接:https://sysin.org/blog/fortinet-fortigate/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgFortiGate是唯一一款为混合式部署防火墙(Hybrid......
  • 一个.NET开源的功能丰富、灵活易用的 Windows 窗口增强神器
    思维导航前言工具介绍支持系统工具源代码工具下载并安装部分功能截图项目源码地址优秀项目和框架精选DotNetGuide技术社区交流群前言通常情况下Windows中的软件窗口界面一般只包含还原、移动、大小、最大化、最小化、关闭等几个基本的操作: 今天大姚给大家推......
  • ASP.NET Core 8 EntityFrameworkCore 初体验
    介绍EntityFramework(EF)Core是轻量化、可扩展、开源和跨平台版的常用EntityFramework数据访问技术。EFCore可用作对象关系映射程序(O/RM),这可以实现以下两点:使.NET开发人员能够使用.NET对象处理数据库。无需再像通常那样编写大部分数据访问代码。先决条件V......
  • ASP.NET Core 8 Swagger UI 入门使用
    介绍Swashbuckle有三个主要组成部分:Swashbuckle.AspNetCore.Swagger:将SwaggerDocument对象公开为JSON终结点的Swagger对象模型和中间件。Swashbuckle.AspNetCore.SwaggerGen:从路由、控制器和模型直接生成SwaggerDocument对象的Swagger生成器。它通常与Swagger终......
  • 06、配置设备忽略报文目的MAC地址
    配置设备忽略报文目的MAC地址通过配置设备忽略报文的目的MAC地址,可以使目的MAC地址为非本设备三层接口MAC地址的报文也能够查找路由表进行转发。背景信息在网络维护的过程中经常会镜像流量,然后将此流量引到特定设备进行分析。而一般情况下设备只会将目的MAC地址为本设备三......
  • 5.CentOS-7-Minimal 安装KubernetesV1.23.17&DockerV20.10.23
    1.环境准备主节点IP:192.168.254.130node1IP:192.168.254.131node2IP:192.168.254.132OSversion:CentOS7miniCPUArchitecture:x86_64/amd64K8sversion:v1.23.17Dockerversion:20.10.232.安装前准备#安装依赖yuminstall-ycurlwgetsystemdbash-completi......
  • 一个.NET开源的功能丰富、灵活易用的 Windows 窗口增强神器
    前言通常情况下Windows中的软件窗口界面一般只包含还原、移动、大小、最大化、最小化、关闭等几个基本的操作: 今天大姚给大家推荐一个.NET开源、免费(MITLicense)、功能丰富、灵活易用、小巧(不到1M)的Windows窗口增强工具:SmartSystemMenu。工具介绍SmartSystemMenu扩展了......
  • POI2006ORK-Ploughing
    POI#Year2006#贪心#暴力如果将所有的列干掉,那么贪心的如果可以删除一列就优先删除一列当左右列不可以删除时,考虑上下行先删除谁不好判断考虑在操作之前先枚举上面删除多少行,这样在操作时就可以贪心的使得下面删掉的行尽可能少也就是贪心先删除上面//Author:xiaruize#if......
  • POI2006EST-Aesthetic Text
    POI#Year2006#dp\(dp_{i,j}\)表示考虑到第\(i\)个单词,当前行长度为\(j\)的最小代价暴力转移是\(\mathcal{O}(n^3)\)的然后观察到,其实合法的转移不能卡满,具体来说,有至少\(\frac{1}{16}\)的常数,因为\(dp\)转移还有\(<1\)的常数,所以可以水过去//Author:xiaruize......