NetCore微服务入门---Consul搭建

0、项目效果图

--创建后项目的网址

--172.26.16是你自己的本机IP,查看==> cmd ==>ipconfig/all

http://172.26.16.1:8500/ui/dc1/services

http://172.26.16.1:8501/ui/dc1/services

http://172.26.16.1:8502/ui/dc1/services

--需要显示swagger需要在Program.cs把swagger移除if (app.Environment.IsDevelopment())

--app.Environment.IsDevelopment()在开发模式下开启

http://172.26.16.1:5001/swagger/index.html

http://172.26.16.1:5002/swagger/index.html

1、关于Consul

作用:Consul发现注册服务,把相应的项目注册

1.1、Consul创建

--拉取镜像

Docker pull consul

--1、Start创建Service容器 创建(-bootstrap-expect 3)3个consul群组

docker run --name consulServe1 -d -p 8500:8500  consul agent -server -bootstrap-expect 3 -ui -bind=0.0.0.0 -client=0.0.0.0 -node=consulServe1

--查看容器的IP
docker inspect --format "{{ .NetworkSettings.IPAddress }}" consulServe1
--查看得172.17.0.2,创建群组需要知道第一次创建Consul的IP,以便后续同一个群组的容器创建

docker run --name consulServe2 -d -p 8501:8500  consul agent -server -bootstrap-expect 3 -ui -bind=0.0.0.0 -client=0.0.0.0 -node=consulServe2 -join=172.17.0.2

docker run --name consulServe3 -d -p 8502:8500  consul agent -server -bootstrap-expect 3 -ui -bind=0.0.0.0 -client=0.0.0.0 -node=consulServe3 -join=172.17.0.2

--1、Ended创建Service容器 创建(-bootstrap-expect 3)3个consul群组


--2、Start创建Client容器 

docker run --name consulClient1 -d -p 8505:8500 consul agent -client=0.0.0.0 -bind=0.0.0.0 -node=consulClient1 -retry-join=172.17.0.2

docker run --name consulClient2 -d -p 8506:8500 consul agent -client=0.0.0.0 -bind=0.0.0.0 -node=consulClient2 -retry-join=172.17.0.2


--2、End创建Client容器 

1.2、Consul命令参数说明

1.2.1、命令说明


-net=host docker参数, 使得docker容器越过了net namespace的隔离,免去手动指定端口映射的步骤
-server consul支持以server或client的模式运行, server是服务发现模块的核心, client主要用于转发请求
-advertise 将本机私有IP传递到consul
-retry-join 指定要加入的consul节点地址,失败后会重试, 可多次指定不同的地址
-client 指定consul绑定在哪个client地址上,这个地址可提供HTTP、DNS、RPC等服务,默认是>127.0.0.1
-bind 绑定服务器的ip地址;该地址用来在集群内部的通讯,集群内的所有节点到地址必须是可达的,>默认是0.0.0.0
allow_stale 设置为true则表明可从consul集群的任一server节点获取dns信息, false则表明每次请求都会>经过consul的server leader
-bootstrap-expect 数据中心中预期的服务器数。指定后,Consul将等待指定数量的服务器可用,然后>启动群集。允许自动选举leader,但不能与传统-bootstrap标志一起使用, 需要在server模式下运行。
-data-dir 数据存放的位置,用于持久化保存集群状态
-node 群集中此节点的名称,这在群集中必须是唯一的,默认情况下是节点的主机名。
-config-dir 指定配置文件,当这个目录下有 .json 结尾的文件就会被加载
-enable-script-checks 检查服务是否处于活动状态,类似开启心跳
-datacenter 数据中心名称
-ui 开启ui界面
-join 指定ip, 加入到已有的集群中

1.2.2、端口说明

8500 : http 端口,用于 http 接口和 web ui访问;
8300 : server rpc 端口,同一数据中心 consul server 之间通过该端口通信;
8301 : serf lan 端口,同一数据中心 consul client 通过该端口通信; 用于处理当前datacenter中LAN的gossip通信;
8302 : serf wan 端口,不同数据中心 consul server 通过该端口通信; agent Server使用,处理与其他datacenter的gossip通信;
8600 : dns 端口,用于已注册的服务发现;
 

2、项目生成(基于Asp net core 6.0创建)

2.1、创建WebApi项目,需勾选Docker选项

2.2、引入Consul包

2.3、appsettings.json配置,加入

 "ConsulSetting": {
    "consulAddress": "http://host.docker.internal:8500/", //注意,docker容器内部无法使用localhost访问宿主机器,如果是控制台启动的话就用localhost
    "serviceName": "myapi", //服务名
    "ServiceHealthApi": "/api/health", //心跳检查api
    "ServiceHealthInterval": "10", //心跳检查频率
    "ServiceHealthTimeout": "5" //心跳检查超时时间
    //"currentIp": "172.18.16.1",
    //"currentPort": "8500"
  }

2.4、新建RegisterToConsul.cs,用户标示注册的Consul信息

using Consul;

public static class RegisterToConsul
{
    /// <summary>
    /// 把本服务注册到Consul
    /// </summary>
    /// <param name="config">参数配置</param>
    /// <param name="appLifetime">程序生命周期</param>
    public static void RegToConsul(this IConfiguration configuration)
    {
        //本地IP 
        //string localIP = "172.18.16.1"; // configuration["ip"];// ip 命令行参数必须传入
        本地服务端口
        //int localPort = 5011;// int.Parse(configuration["port"]);//命令行参数必须传入


        //本地IP 创建启动WebApi容器时,需要设定“IP”、“port”两个参数
        string localIP = configuration["ip"];// ip 命令行参数必须传入
        //本地服务端口
        int localPort = int.Parse(configuration["port"]);//命令行参数必须传入


        int weight = string.IsNullOrWhiteSpace(configuration["weight"]) ? 1 : int.Parse(configuration["weight"]);

        //服务名(这里通过命令行参数传入不同的服务名,模拟我们有不同的服务[其实只是同一个接口项目的不同运行实例])
        var serviceName = configuration["ConsulSetting:serviceName"];
        //心跳检查地址,本服务提供的地址
        var serviceHealthApi = configuration["ConsulSetting:ServiceHealthApi"];
        //间隔10s一次
        var serviceHealthInterval = string.IsNullOrWhiteSpace(configuration["ConsulSetting:ServiceHealthInterval"]) ? 60 : int.Parse(configuration["ConsulSetting:ServiceHealthInterval"]);
        //检测等待时间
        var serviceHealthTimeout = string.IsNullOrWhiteSpace(configuration["ConsulSetting:ServiceHealthTimeout"]) ? 10 : int.Parse(configuration["ConsulSetting:ServiceHealthTimeout"]);
        //consul地址 
        //创建启动WebApi容器时,需要设定“consulhost”、“consulport”两个参数,设定注册到那个Consul
        var consulhost = configuration["consulhost"];//configuration["ConsulSetting:ConsulAddress"];
        var consulport = configuration["consulport"];
        var consulAddress = $"http://{consulhost}:{consulport}/";

        //设定从appsettings.json获取
        //var consulAddress = configuration["ConsulSetting:consulAddress"];

        var consulClient = new ConsulClient(p => { p.Address = new Uri(consulAddress); });


        //心跳检测设置
        var httpCheck = new AgentServiceCheck()
        {
            DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(60), //心跳检测失败多久后注销

            Interval = TimeSpan.FromSeconds(serviceHealthInterval), //间隔多久心跳检测一次
            HTTP = $"http://{localIP}:{localPort}{serviceHealthApi}", //心跳检查地址,本服务提供的地址
            Timeout = TimeSpan.FromSeconds(serviceHealthTimeout)  //心跳检测超时时间
        };


        //注册信息
        var registration = new AgentServiceRegistration()
        {
            ID = $"{localIP}:{localPort}", //服务ID,唯一   // Guid.NewGuid().ToString(),
            Name = serviceName, //服务名(如果服务搭集群,它们的服务名应该是一样的,但是ID不一样)
            Address = $"{localIP}", //服务地址
            Port = localPort, //服务端口
            Tags = new string[] { weight.ToString() }, //服务标签,一般可以用来设置权重等本地服务特有信息
            Checks = new[] { httpCheck }, //心跳检测设置
        };

        //向Consul注册服务
        consulClient.Agent.ServiceRegister(registration).Wait();

    }
}

2.5、创建HealthController.cs

using Microsoft.AspNetCore.Mvc;

namespace myapi.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class HealthController : ControllerBase
    {
        /// <summary>
        /// 健康检查接口
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult Get() => Ok("ok");
    }
}

2.6、Program.cs文件加入app.Configuration.RegToConsul();

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

app.UseAuthorization();

//加入Consul
app.Configuration.RegToConsul();

app.MapControllers();

app.Run();

2.7、生成项目Docker

--myapi镜像名称

--此语句在项目的根目录下执行

-命令最后的“.”必须带上,否则执行失败

docker build -t myapi -f ./myapi/Dockerfile .

2.8、生成项目Dockers容器

--创建启动WebApi容器时,需要设定4个参数

--“IP”、“port”两个参数:设定自身

--“consulhost”、“consulport”两个参数:设定注册到那个Consul

docker run -d -p 5001:80 --name myservice1 myapi --ip=172.26.16.1 --port=5001 --consulhost=172.26.16.1 --consulport=8505

docker run -d -p 5002:80 --name myservice2 myapi --ip=172.26.16.1 --port=5002 --consulhost=172.26.16.1 --consulport=8506

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NetCore微服务是指使用.Net Core框架构建的以微服务架构为基础的应用程序。微服务架构是一种将应用程序拆分为一系列小型、独立部署的服务的设计模式,每个服务都有自己的业务逻辑和数据库。它们通过网络进行通信,以实现整体应用程序的功能。 NetCore是微软开发的跨平台、高性能、开源的开发框架,具备强大的功能和灵活的扩展性。将NetCore框架应用于微服务架构可以提供以下优势: 1. 高性能:NetCore框架采用了先进的异步编程模型和基于内存的缓存技术,能够处理大量并发请求,提高系统的响应速度和吞吐量。 2. 可扩展性:由于每个微服务都是独立部署的,可以根据需求独立扩展和升级。使用NetCore框架的依赖注入功能,可以方便地添加新的服务或替换现有服务,而无需对整个应用程序进行重构。 3. 高可用性:微服务架构的一个重要特点是容错和自愈能力。当某个服务发生故障时,其他服务可以继续运行,从而确保整体系统的稳定性和可用性。 4. 灵活性:NetCore框架支持多种开发语言和工具,使开发人员能够选择适合自己的技术栈,并在不同的微服务中使用不同的编程语言和数据库。 5. 安全性:NetCore框架内置了许多安全功能,如身份验证、授权和数据加密等。这些功能可以帮助开发人员构建安全、可靠的微服务系统。 总之,NetCore微服务通过结合微服务架构和.Net Core框架的优势,可以实现高性能、可扩展、高可用和灵活的应用程序开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值