首页 > 其他分享 >1.微服务注册中心Consul

1.微服务注册中心Consul

时间:2024-02-12 12:22:25浏览次数:34  
标签:服务 Consul consul 注册 new public 服务端

 

Consul 是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。 Consul 是 分布式 的、 高可用 的、 可横向扩展 的用于实现分布式系统的服务发现与配置。

中文网:Consul 中文文档 - Consul 中文文档 (gitbook.io)

1. Consul具有哪些特点
服务发现(Service Discovery): Consul 提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
健康检查(Health Checking):Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200 OK”),也可以与本地节点相关联(“内存利用率是否低于
90%”)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。
Key/Value存储:应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。
多数据中心: Consul支持开箱即用的多数据中心。这意味着Consul的用户不必担心建立额外的抽象层来发展到多个区域。

 

2.安装Consul 下载地址:Install | Consul | HashiCorp Developer windows 安装 1. 选择windows x64 版本(64bit) 2. 进入下载好的文件夹中,打开powershell ,执行命令,启动服务端代理
consul.exe agent -dev
4. 浏览器输入:http://IP:8500/出现ConsulWeb界面就表示成功了 -dev 表示开发模式,生产环境下不建议使用,因为它不会保存任何状态 -server 生产环境下可使用 

 

linux 安装  1. yum 安装 consul 环境
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo
https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install consul
2. 安装完事后,执行命令查询是否成功: 
[root@yushangxue ~]# consul version
Consul v1.10.3
Revision c976ffd2d
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use
protocol >2 when speaking to compatible agents)
3. 执行命令,启动服务端
consul agent -dev
4. 浏览器输入:http://IP:8500/出现ConsulWeb界面就表示成功了

 

Docker 安装 1.拉取Consul镜像
$ docker pull consul # 默认拉取latest
$ docker pull consul:1.15.4 # 拉取指定版本
2.安装并运行
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。 

 

Net 6 中如何使用  添加3个API项目,2个服务端一个客户端,配置如下 1. 安装包:
Consul.AspNetCore 1.6.10.8
2. application.json  客户端ServiceName:Consul.Client。两个服务端ServiceName:Consul.Service 客户端ServiceIP:192.168.1.1。两个服务端ServiceIP:192.168.1.2
"Consul": {
"ConsulHost": "http://localhost:8500",
"ServiceName": "ServiceName",
"ServiceIP": "x.x.x.x",
"ServicePort" : 5009
}
3. 添加Consul服务
public class ConsulOption
{
     public string ConsulHost { get; set; }
     public string ServiceName { get; set; }
     public string ServiceIP { get; set; }
     public int ServicePort { 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>();

        services.AddConsul(p =>
        {
            p.Address = new Uri(consulOption.HostAddress);
        });

        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;
    }
}
4. Program.cs 代码
builder.Services.AddConsulService(builder.Configuration);
5. 创建健康检查控制器: 
[Route("[controller]")]
[ApiController]
public class HealthCheckController : ControllerBase
{
[HttpGet]
public ActionResult GetHealthCheck()
{
Console.WriteLine($"进行心跳检测:{DateTime.Now}");
return Ok("连接正常");
}
}

6.两个服务端控制器写一个方法

服务端1:

[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);
    }
}

服务端2:

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

7客户端调用

[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.Service")).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,consul,注册,new,public,服务端
From: https://www.cnblogs.com/MingQiu/p/18013762

相关文章

  • 云计算-共享&服务
    最近云厂商问题频发,我们还能把应用放心的交给云厂商吗?云计算这玩意儿是新瓶装旧酒吗?笔者聊聊自己的看法。1、云计算的本质-服务云计算-共享云的概念起源于“共享”,类似于组织内的成员共享一个超级计算机,超级计算机就是个“资源池”,说白了就是一堆服务器资源。早期有人做服务......
  • 一句话总结Kubernetes的Headless服务
    Kubernetes的概念很多,有的着实让人费解,比如说Headless服务,听名字就很拗口。那Headless服务是什么,使用场景是什么。一句话总结:Headless服务就是一组Pod组成的只供集群内访问(没有ClusterIP)的Service,一般结合StatefulSet用于部署有状态应用的场景。1、Service与服务发现提到Headl......
  • 【译】生成式人工智能,废话即服务
    原作:阿尔贝托·罗梅罗引言:AI令人惊叹,然而人类正在将其用于垃圾邮件、虚假和作弊行为 本文选自《算法之桥》,这是一个旨在弥合人工智能与人类之间差距的教育项目。人工智能并不是将情报成本归零,而是将废话成本归零。SamAltman喜欢声称OpenAI以及生成式AI的目标是将智慧的......
  • Ubuntu服务器使用 Daphne + Nginx + supervisor部署Django项目
    视频:https://www.bilibili.com/video/BV1e6421G7uM/?vd_source=36191bed2c30378060ff2efe6831b331Django从3.0版开始加入对ASGI的支持,使Django开始具有异步功能。截止目前的5.0版,对异步支持逐步也越来越好,相信在未来的版本中异步将会支持的更加完善。所以说,我们也需要适时的......
  • 在k8S中,外部如何访问集群内的服务?
    在Kubernetes(k8s)中,要让外部客户端能够访问集群内的服务,通常有以下几种方式:NodePort:创建一个类型为NodePort的服务,这会在每个工作节点上开放一个特定端口(系统自动分配或用户指定的范围内的端口),并将流量转发到对应Service背后的Pod。外部客户端可以通过任意节点的IP地址和......
  • dremio 的InformationSchemaCatalog 服务三
    以前简单写过一些关于dremio的InformationSchemaCatalog,也说过dremio为了方便提供标准的INFORMATION_SCHEMA自己开发了存储扩展,以下是关于存储扩展的创建以及刷新说明创建创建是在CatalogService中处理的,具体的实现是CatalogServiceImpl参考处理if(roles.conta......
  • dotnet 依赖注入 服务定位器
    依赖注入的基本使用1/Program.csusingMicrosoft.Extensions.DependencyInjection;ServiceCollectionservices=newServiceCollection();//瞬态服务services.AddTransient<TestServiceImpl>();//=>false//作用域服务//services.AddScoped<TestServiceImpl>();......
  • 【linux】如何查看服务器磁盘IO性能
    查看服务器磁盘IO性能在服务器运维过程中,了解服务器的磁盘IO性能是非常重要的。磁盘IO性能直接影响到服务器的响应速度和处理能力。本文将介绍如何使用dd命令来查看服务器磁盘IO性能。1.什么是dd命令?dd命令是Linux系统中的一个非常强大的工具,它可以用于复制文件、转换文件格式......
  • 微信小程序(一) | 注册与安装
    ......
  • 使用 Kestrel 自托管https 并作为 Windows 服务启动 Blazor 提示: 无法配置 HTTPS 端
    原文链接https://stackoverflow.com/questions/53300480/unable-to-configure-https-endpoint-no-server-certificate-was-specified-and-the/71026252#71026252使用Kestrel自托管并作为Windows服务启动Blazor提示UnabletoconfigureHTTPSendpoint.Noservercertifi......