.NetCore3.1 微服务Consul构建

16 篇文章 0 订阅
6 篇文章 0 订阅

今天抽空学写了一下微服务Consule构建,记录一下已被以后查看,也希望帮助到其他小伙伴,首先要去consul官网下载consul,官网地址为https://www.consul.io/,点击download下载

下载好后解压进入文件夹可以看到consul.exe,然后打开命令行运行consul.exe启动consul服务,如下图

然后看到==> Consul agent running!说明consul运行成功了,我们可以看到2020-07-17T14:58:48.414+0800 [INFO]  agent: Started HTTP server: address=127.0.0.1:8500 network=tcp,这个记录,然后浏览器地址打开127.0.0.1:8005可以访问这个地址看到服务实例,如下图

consul启动好后,我们下来开始撸代码了,我们要先创建一个.NetCore API应用程序,然后创建一个ConsulHelper类用来将API注册到consul,代码如下

public static void RegisterConsul(this IConfiguration configuration)
        {
            //创建Consul客户端实例
            ConsulClient consulClient = new ConsulClient(cfg =>
            {
                //Consul监听地址
                cfg.Address = new Uri("http://localhost:8500");
                //数据中心名称
                cfg.Datacenter = "MTS";
            });
            //命令行获取IP地址
            var ip = configuration["ip"];
            Console.WriteLine($"****ip:{ip}");
            var port = configuration["port"];

            //权重
            var weight = string.IsNullOrEmpty(configuration["weight"])?1:int.Parse(configuration["weight"]);

            //注册服务
            consulClient.Agent.ServiceRegister(new AgentServiceRegistration
            {
                //服务唯一标识
                ID = "Test_" + DateTime.Now.ToString("yyyyMMddHHmmssfff"),
                //服务分组
                Name = "API",
                //服务对应的ip地址
                Address = ip,
                //服务对应的端口
                Port = int.Parse(port),
                //心跳检查
                Check = new AgentServiceCheck
                {
                    //心跳检查路径
                    HTTP = $"http://{ip}:{port}/health/index",
                    //检查间隔
                    Interval = TimeSpan.FromSeconds(12),
                    //超时时间
                    Timeout = TimeSpan.FromSeconds(5),
                    //失败多久取消注册
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(60)
                },
                Tags = new string[] { weight.ToString() }
            });

        }

这边使用扩展IConfiguration的方法实现,代码都有注释,然后再在Startup里面的config调用如下图

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
            this.Configuration.RegisterConsul();
        }

到这里就完成了将API接口注册到consul的代码

然后下面就是命令行运行API项目将API接口注册到consul,如下图

这步操作过后我们可以到consul站点上看服务实例

接下来我们就要创建一个.NetCore Web应用程序来调用consul获取服务站点,我这边测试简单点直接放在HomeController中的Index Action中,代码测试如下

public IActionResult Index()
        {
            //创建consul客户端实例
            ConsulClient consulClient = new ConsulClient(cfg =>
            {
                cfg.Datacenter = "MTS";
                cfg.Address = new Uri("http://127.0.0.1:8500");
            });
            //该url中的API对应consul注册服务时的name
            var uri = new Uri("http://API/user/all");
            var host = uri.Host;
            //获取consul下的所有服务
            var services = consulClient.Agent.Services().Result.Response;
            //找出API对应的所有服务
            var speficRes = services.Where(w => w.Value.Service.Equals(host, StringComparison.OrdinalIgnoreCase));

            //根据权重新增相应的服务数量
            List<KeyValuePair<string, AgentService>> pairs = new List<KeyValuePair<string, AgentService>>();
            foreach (var dic in speficRes)
            {
                var count = int.Parse(dic.Value.Tags?[0]);
                for (var i = 0; i < count; i++)
                {
                    pairs.Add(dic);
                }
            }
            //随机寻找
            var service = pairs[new Random(iSeed++).Next(0,pairs.Count())].Value;
            var url = $"http://{service.Address}:{service.Port}/user/all";
            Console.WriteLine(url);

            //请求地址
            HttpClient httpClient = new HttpClient();
            var res = httpClient.GetAsync(url).Result.Content.ReadAsStringAsync().Result;
            var users = JsonConvert.DeserializeObject<List<User>>(res);
            ViewBag.Users = users;
            return View();
        }

        private static int iSeed = 0;

页面代码如下

@{
    ViewData["Title"] = "Home Page";
}
<h1>用户</h1>
<ul>
    @{
        foreach (var user in ViewBag.Users)
        {
            <li>@user.Name</li>
        }
    }
</ul>

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

然后运行.NetCore Web应用程序如下

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值