.NET 5.0实现Consul服务注册

摘要:
Consul是什么:Consul是一个服务网格解决方案,它提供具有服务发现、配置和分段功能的全功能控制平面。Consul需要一个数据平面并支持代理和本地集成模型。这意味着Consul用户不必担心构建额外的抽象层来扩展到多个领域。

Consul是什么:(来自官方翻译)

  Consul 是一种服务网格解决方案,提供具有服务发现、配置和分段功能的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。Consul 需要一个数据平面并支持代理和本地集成模型。Consul 附带一个简单的内置代理,因此一切都可以开箱即用,而且还支持 3rd 方代理集成,例如 Envoy。

Consul 的主要特点:(来自官方翻译)

  • 服务发现:Consul 的客户端可以注册一个服务,例如 apimysql,其他客户端可以使用 Consul 来发现给定服务的提供者。使用 DNS 或 HTTP,应用程序可以轻松找到它们所依赖的服务。

  • 健康检查:Consul 客户端可以提供任意数量的健康检查,要么与给定的服务相关联(“网络服务器是否返回 200 OK”),要么与本地节点(“内存利用率是否低于 90%”)相关联。操作员可以使用此信息来监控集群健康状况,并且服务发现组件可以使用它来将流量路由到不健康的主机之外。

  • KV 存储:应用程序可以将 Consul 的分层键/值存储用于多种目的,包括动态配置、功能标记、协调、领导选举等。简单的 HTTP API 使其易于使用。

  • 安全服务通信:Consul 可以为服务生成和分发 TLS 证书,以建立相互的 TLS 连接。 意图可用于定义允许哪些服务进行通信。可以通过实时更改意图轻松管理服务分段,而不是使用复杂的网络拓扑和静态防火墙规则。

  • 多数据中心:Consul 支持开箱即用的多个数据中心。这意味着 Consul 的用户不必担心构建额外的抽象层以扩展到多个区域。

Consul 旨在对 DevOps 社区和应用程序开发人员友好,使其非常适合现代、弹性的基础设施。

 

一.安装Consul

进入/usr/local/src目录

cd /usr/local/src

.NET 5.0实现Consul服务注册第1张

 下载consul安装压缩包

wget http://releases.hashicorp.com/consul/1.10.1/consul_1.10.1_linux_amd64.zip

.NET 5.0实现Consul服务注册第2张

解压压缩包到当前目录

unzip consul_1.10.1_linux_amd64.zip 

.NET 5.0实现Consul服务注册第3张

 解压后有一个名字为consul的可执行文件

.NET 5.0实现Consul服务注册第4张

 查看版本号

./consul --version

.NET 5.0实现Consul服务注册第5张

 版本号为v1.10.1

创建consul.server目录,并把consul文件移动到coonsul.server目录

mkdir consul.server

mv consul consul.server

 .NET 5.0实现Consul服务注册第6张

在consul.server目录里创建consul.d目录

cd consul.server

mkdir consul.d

.NET 5.0实现Consul服务注册第7张

在consul.d目录中创建webservice.json文件

cd consul.d/

touch webservice.json

.NET 5.0实现Consul服务注册第8张

./consul agent -server -ui -bootstrap-expect=1 -data-dir=/usr/local/src/consul.server -node=agent-one -advertise=172.19.43.49 -bind=0.0.0.0 -client=0.0.0.0

.NET 5.0实现Consul服务注册第9张

 访问8500端口即可看到consul注册节点

.NET 5.0实现Consul服务注册第10张

 二.注册服务

创建一个.NET Core工程,添加Consul包。

添加一个名为HealthController的控制器,并实现一个get请求的接口用于服务健康检查,接口返回StatusCode为200。

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Pudefu.Web.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class HealthController : ControllerBase
    {
        [HttpGet]       
        public JsonResult Get()
        {
            return new JsonResult("OK");
        }
    }
}

在配置文件appsettings.json添加配置

  "ConsulConfig": {
    "ServiceId": "d72e7de8b01a43acac640b1a00b26c81",
    "ServiceName": "pudefu.web",
    "ServiceIP": "xxx.xx.xxx.xx",//当前应用部署的服务器IP地址
    "ServicePort": 8000,//当前应用部署的服务器端口
    "ConsulIP": "xxx.xx.xxx.xx",//Consul部署的服务器IP地址
    "ConsulPort": 8500//Consul端口
  }

添加服务配置模型

public class ServiceConfig
    {
        /// <summary>
        /// 服务唯一ID
        /// </summary>
        public string ServiceId { get; set; }
        /// <summary>
        /// 服务部署的IP
        /// </summary>
        public string ServiceIP { get; set; }
        /// <summary>
        /// 服务部署的端口
        /// </summary>
        public int ServicePort { get; set; }
        /// <summary>
        /// 服务名称
        /// </summary>
        public string ServiceName { get; set; }
        /// <summary>
        /// consul部署的IP
        /// </summary>
        public string ConsulIP { get; set; }
        /// <summary>
        /// consul端口
        /// </summary>
        public int ConsulPort { get; set; }
    }

添加Consul注册类

public static class AppBuilderExtensions
    {
        public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IHostApplicationLifetime lifetime, ServiceConfig serviceConfig)
        {
            var consulClient = new ConsulClient(x => x.Address = new Uri($"http://{serviceConfig.ConsulIP}:{serviceConfig.ConsulPort}"));
            var httpCheck = new AgentServiceCheck()
            {
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务器启动5秒后注册
                Interval = TimeSpan.FromMinutes(1),//每分钟检测一次(健康检查间隔时间)
                HTTP = $"http://{serviceConfig.ServiceIP}:{serviceConfig.ServicePort}/api/health",//本服务健康检查地址
                Timeout = TimeSpan.FromSeconds(20),
            };
            var registerAgent = new AgentServiceRegistration()
            {
                Check = httpCheck,
                Checks = new[] { httpCheck },
                ID = serviceConfig.ServiceId,//一定要指定服务ID,否则每次都会创建一个新的服务节点
                Name = serviceConfig.ServiceName,
                Address = serviceConfig.ServiceIP,
                Port = serviceConfig.ServicePort,
                Tags = new[] { $"urlprefix-/{serviceConfig.ServiceName}" }//添加 urlprefix-/servicename 格式的tag标签,以便Fabio识别
            };
            consulClient.Agent.ServiceRegister(registerAgent).Wait();//服务启动时注册,使用Consul API进行注册(HttpClient发起)
            lifetime.ApplicationStopped.Register(() =>
            {
                consulClient.Agent.ServiceDeregister(registerAgent.ID).Wait();//服务器停止时取消注册
            });
            return app;
        }
    }

在Startup中添加注册代码

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            //app.UseHttpsRedirection();
            //DefaultFilesOptions defaultFilesOptions = new DefaultFilesOptions();
            //defaultFilesOptions.DefaultFileNames.Clear();
            //defaultFilesOptions.DefaultFileNames.Add("Index.html");
            //app.UseDefaultFiles(defaultFilesOptions);

            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            var serviceConfig = Configuration.GetSection("ConsulConfig").Get<ServiceConfig>();
            app.RegisterConsul(lifetime, serviceConfig);

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
                endpoints.MapRazorPages();
            });
        }

 发布启动后,可见以下注册成功的服务

.NET 5.0实现Consul服务注册第11张

点击pudefu.web(服务名称)这个服务可以查看服务详细信息

服务健康检查成功:

.NET 5.0实现Consul服务注册第12张

 服务健康检查失败:

.NET 5.0实现Consul服务注册第13张

免责声明:文章转载自《.NET 5.0实现Consul服务注册》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【BIEE】04_当维度表中的维不存在事实表中,需要展示所有维度并且数据类展示为0pyhton自动化项目编码以及命名规范下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

coredns 代理consul 运行noamd 部署的应用

nomad 是一个方便的应用调度平台,consul 一个很不错的服务发现工具,coredns 很不错, 扩展性比较强的dns 服务器,集成起来可能做很强大的事情 我的运行环境是mac,实际情况按需部署即可 组件下载 nomad 下载 https://www.nomadproject.io/docs/install/index.html consul 下载...

Consul--客户端访问Consul服务

根据上一篇Consul服务的注册和发现,那么客户端如何去访问我们的Consul服务?其实客户端访问Consul实际上是访问Consul的服务实例。客户端自己可以实现对Consul服务实例的轮训,每次刷新端口都会发生改变,由于客户端访问Consul采用的轮训策略,所以每次刷新Consul的服务实例都会发生改变。 下面就直接上客户端访问Consul服务实例的代...

使用go-micro遇到的坑

1. go-micro最新版本默认不再支持consul了,(从1.14开始不再支持),consul在go-plugins中,需要单独的go get,同样import时也应该时go-plugins的地址 2.github.com/coreos/etcd/clientv3 cannot use auth.callOpts 下载etcd的3.3.13版本,把gi...

微服务的接入层设计与动静资源隔离

本文由  网易云 发布。 作者:刘超,网易云解决方案架构师 这个系列是微服务高并发设计,所以我们先从最外层的接入层入手,看都有什么样的策略保证高并发。 接入层的架构如下图所示: 接下来我们依次解析各个部分以及可以做的优化。   一、数据中心之外:DNS,HttpDNS,GSLB 当我们要访问一个网站的服务的时候,首先访问的肯定是一个域名,然后由DNS,将...

springcloud(一)-初识

springCloud简介   尽管springCloud带有“cloud”字样,但它并不是云计算解决方案,而是在SpringBoot基础上构建的,用于快速构建分布式系统的通用的工具集。从技术架构上降低了对大型系统构建的要求,使我们以非常低的成本(技术或者硬件)搭建一套高效、分布式、容错的平台,但Spring Cloud也不是没有缺点,小型独立的项目不适合...

consul 微服务管理--分布式与单点故障

微服务管理--分布式与单点故障 上节课我们提到了服务的注册于发现机制,可以引入一个服务注册发现组件来实现对服务的管理,完成服务注册,信息查询,存储配置等功能。虽然引入了服务注册发现组件解决了就问题,但是会引入新问题。 Consul环境配置 1、将下载的consul_1.5.1_darwin_amd64.zip进行解压,解压后得到可执行文件consul。...