服务注册于发现-Consul

news2024/10/6 18:27:04

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 Consul是分布式的、高可用的、可横向扩展的。它具备以下特性 :

服务发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
健康检查:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
键/值存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
多数据中心:无需复杂的配置,即可支持任意数量的区域。

Install | Consul | HashiCorp DeveloperExplore Consul product documentation, tutorials, and examples.https://developer.hashicorp.com/consul/downloads

下载完成后目录下cmd运行  consul agent -dev  启动consul

 启动成功后可见可见客户端本地端口 8500,去浏览器访问 http://127.0.0.1:8500

 可见已经有一个服务,那是consul自己的服务。如何启用自己的服务,需要结合代码在程序启动时注册(net6)

在微服务实例项目中执行一下步骤

一、Nuget添加  Consul

二、新建辅助类

public static class ConsulHelper
    {
        /// <summary>
        /// Consul注册
        /// </summary>
        /// <param name="configuration"></param>
        public static void ConsulRegist(this IConfiguration configuration)
        {
            ConsulClient client = new ConsulClient(c =>
            {
                c.Address = new Uri("http://localhost:8500/");
                c.Datacenter = "dc1";
            });

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

            client.Agent.ServiceRegister(new AgentServiceRegistration()
            {
                ID = "service" + Guid.NewGuid(),//唯一
                Name = "MyService",//组名称-Group
                Address = ip,//其实应该写ip地址
                Port = port,//不同实例
                Tags = new string[] { weight.ToString() },//标签,权重策略
                Check = new AgentServiceCheck()//心跳检测
                {
                    Interval = TimeSpan.FromSeconds(12),//间隔12s一次
                    HTTP = $"http://{ip}:{port}/Api/User/Index",
                    Timeout = TimeSpan.FromSeconds(5),//检测等待时间
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(20)//失败后多久移除
                }
            });
            //命令行参数获取
            Console.WriteLine($"{ip}:{port}--weight:{weight}");
        }
    }

三、在program.cs添加代码,最好是放在var app = builder.Build();上面

builder.Configuration.ConsulRegist();

四、添加心跳回执检测接口,与心跳检测出代码

 HTTP = $"http://{ip}:{port}/Api/User/Index",

对应,没有他心跳检测会失败,consul会主动退出服务

        [HttpGet]
        [Route("Index")]
        public ActionResult Index()
        {
            return Ok();
        }

启动多个微服务实例,命令

dotnet run --urls="http://*:5726" --ip=127.0.0.1 --port=5726 --weight=1

dotnet run --urls="http://*:5727" --ip=127.0.0.1 --port=5727 --weight=2

dotnet run --urls="http://*:5728" --ip=127.0.0.1 --port=5728 --weight=5

再去consul客户端查看,可以看出多了三个服务实例

 服务注册弄好了,怎么调用实现负载均衡

在微服务客户端项目中执行一下步骤

一、nuget下载包  Consul
二、调用,仅作实例,实际运用可能需要修改或封装参数

[Route("api/[controller]")]
    [ApiController]
    public class UserController : ControllerBase
    {
        private readonly ILogger<UserController> _logger;
        private readonly RequestHelper _request = null;
        public UserController(ILogger<UserController> logger, RequestHelper request)
        {
            _logger = logger;
            _request = request;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Route("Get")]
        public async Task<string> Get()
        {
            简单分布式
            //var url = $"http://localhost:5726/api/User/All";
            //return await _request.HttpGet(url);

            负载均衡,有nginx解决
            //var url = $"http://localhost:8080/api/User/All";
            //return await _request.HttpGet(url);

            #region Consul 
            //相对Nginx好像变麻烦了,需要手动写代码实现负载均衡
            //可以靠网关或者手动封装就好
            ConsulClient client = new ConsulClient(c =>
            {
                c.Address = new Uri("http://127.0.0.1:8500/");
                c.Datacenter = "dc1";
            });
            var response = client.Agent.Services().Result.Response;
            //有了consul 程序需要知道哪些信息,才能调用服务?
            string url = null;
            url = "http://MyService/api/user/all";//consul提供的是ip+port

            Uri uri = new Uri(url);
            string groupName = uri.Host;
            AgentService agentService = null;

            var serviceDictionary = response.Where(s => s.Value.Service.Equals(groupName, StringComparison.OrdinalIgnoreCase)).ToArray();//找到的全部服务--4个
            {
                agentService = serviceDictionary[0].Value;//直接拿的第一个
                //这里有三个服务或者服务实例,只需要选择一个调用,那么这个选择的方案,就叫 负载均衡策略
            }
            //{
            //    //轮询策略 也是平均,但是太僵硬了
            //    agentService = serviceDictionary[iIndex++ % serviceDictionary.Length].Value;
            //}
            //{
            //    //平均策略--随机获取索引--相对就平均
            //    agentService = serviceDictionary[new Random(iIndex++).Next(0, serviceDictionary.Length)].Value;
            //}
            //{
            //    //权重策略--能给不同的实例分配不同的压力---注册时提供权重
            //    List<KeyValuePair<string, AgentService>> pairsList = new List<KeyValuePair<string, AgentService>>();
            //    foreach (var pair in serviceDictionary)
            //    {
            //        int count = int.Parse(pair.Value.Tags?[0]);//1   5   10
            //        for (int i = 0; i < count; i++)
            //        {
            //            pairsList.Add(pair);
            //        }
            //    }
            //    //16个  
            //    agentService = pairsList.ToArray()[new Random(iIndex++).Next(0, pairsList.Count())].Value;
            //}
            url = $"{uri.Scheme}://{agentService.Address}:{agentService.Port}{uri.PathAndQuery}";
            Console.WriteLine($"This is {url} Invoke");
            return await _request.HttpGet(url);
            #endregion
        }
        //private static int iIndex = 0;//暂不考虑线程安全
    }

运行当前客户端项目

 成功访问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/463925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

佳能驱动支持,佳能打印机驱动无法安装的解决方法

随着打印机设备的普及&#xff0c;不少用户都会选购一台佳能、惠普、爱普生、兄弟等品牌的打印机&#xff0c;虽然安装打印机及打印机驱动并不难&#xff0c;但也会出现无法安装的情况&#xff0c;只有打印机驱动安装好了才能正常使用佳能打印机设备。以佳能打印机为例&#xf…

关于Vue3刷新页面报错404的解决方法

最近正在写VUE3项目时&#xff0c;遇到了一个问题&#xff0c;页面一刷新就出错。 如下&#xff1a; 查看控制台报错信息是404。 这时候怎么刷新页面都没有用&#xff0c;只能重新输入地址&#xff0c;一想到每次代码发生改变我都要输入一遍地址&#xff0c;那心情都不好了。在…

MongoDB管理神器来袭!NexNoSqlClient让你的效率翻倍!

背景&#xff1a; 如果你在日常工作中需要经常使用MongoDB&#xff0c;那么你一定体验过这样一些痛点;繁琐的脚本编写&#xff0c;冗长的命令行操作&#xff0c;复杂的数据建模和索引等等。这些问题不仅让我们的工作效率低下&#xff0c;还容易出现错误和漏洞&#xff0c;给数…

JavaWeb搭建| Tomcat配置| Maven依赖|这一篇就够了(超详细)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;老茶icon &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;计…

此主机支持 AMD-V,但 AMD-V 处于禁用状态

此主机支持 AMD-V&#xff0c;但 AMD-V 处于禁用状态问题解决 文章目录 此主机支持 AMD-V&#xff0c;但 AMD-V 处于禁用状态问题解决1、问题原因2、题解决办法 1、问题原因 我win 10 系统电脑安装VMware虚拟机后&#xff0c;在启动虚拟机时提示以下这个错误&#xff1a; 此主…

54页数据中台解决方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 1.3 数据中台是一套解决方案 数据中台是一套可持续“让企业数据用起来”的机制&#xff0c;是一套解决方案&#xff0c;不仅是一个平台。让数据更加灵活地支撑前端业务&…

基于单片机的恒温箱系统设计

以前课设做的小温度传感系统&#xff0c;分享一下&#xff01; 想要直接用的可以去我资源界面下载&#xff0c;传送门。   老规矩先上效果 本系统以AT89C52、DS18B20温度传感器、DS1302实时时钟、LCD1602液晶显示屏模块、蜂鸣器、固态继电器模块等元件构成一个自动恒温加热装…

windows下Qt程序打包简易流程

还记得刚工作那会儿在接触qt不久后想让编译出来的exe文件能够脱离环境运行&#xff0c;比如写个小软件能让其在其他人电脑上动起来&#xff0c;满足一下小小的虚荣心。当时好像挺麻烦的&#xff08;或许当时自己还是了解的太少&#xff09;&#xff0c;有个同事告诉了我一个办法…

NUMA详解

目录 NUMA简介 NUMA开启与关闭 查看系统是否支持 关闭方法 numactl --hardware介绍 没有安装numactl工具下查看NUMA架构节点数&#xff1a; 查看每个NUMA节点的CPU使用情况&#xff1a; 看每个NUMA节点的内存使用情况&#xff1a; 查看NUMA下指定进程的运行情况 创建…

企业如何选择一款适合自己的信息化管理系统?

信息化这个词近年来已经说“烂”了&#xff0c;在这个信息化快速发展的时代&#xff0c;企业信息化管理系统已经成为了企业发展的必要条件之一。 但是&#xff0c;随着市场上信息化产品的爆发式增长&#xff0c;企业在选择适合自己的信息化管理系统时&#xff0c;常常会感到眼…

博弈论又称对策论的入门及在军事博弈问题上的简单实战

学习知识要实时简单回顾&#xff0c;我把学习的博弈论简单梳理一下&#xff0c;方便入门与复习。 博弈论模型 博弈论简介 社会及经济的发展带来了人与人之间或团体之间的竞争及矛盾&#xff0c;应用科学的方法来解决这样的问题开始于 17 世纪的科学家&#xff0c;如 C.&#…

Etcd 可视化管理工具,GUI 客户端

Etcd Assistant——Etcd 可视化管理工具&#xff0c;GUI 客户端 下载地址&#xff1a;http://www.redisant.cn/etcd 主要功能&#xff1a; 支持多标签页&#xff0c;同时连接到多个集群以漂亮的格式显示JSON、XML、MessagePack、十六进制等数据格式浏览、创建、编辑、删除键…

blender的一些使用

导入一个glb文件 可能整体是一个模型 我是看视频 看到可以建筑模型分成了两部分&#xff08;顶面和侧面&#xff09; 然后就一直尝试 首先需要学会的是如何在blender 中修改材质 先按tab 进入编辑模式 选第三个面选择 然后选择一个面以后 选择材质 那个圆的 然后加号 新建…

IEEE旗下SCI审稿流程及状态详细解读 (附科协高质量IEEE期刊目录)~

能够成功发表一篇IEEE旗下SCI论文 (尤其是TRANS系列) 是很多电气电子工程、计算机及通信领域科研工作者的梦想。很多学者初次投稿IEEE后&#xff0c;会不停登录投稿系统查看状态&#xff0c;其实不必如此心急&#xff0c;只需掌握几个重要的时间节点&#xff0c;定期登录系统查…

想提高应用程序的用户满意度——APK体积包优化少不了

作者&#xff1a;子不语Any 前言 减少应用程序安装包的大小&#xff0c;不仅仅减少用户的网络数据流量&#xff0c;还减少了下载等待的时间。毋庸置疑&#xff0c;尽量减少程序安装包的大小是十分有必要的。 通常来说&#xff0c;减少程序安装包的大小有两条规律&#xff1a;…

springboot+vue.js高校教材教学资源平台设计与实现

基本事件流&#xff1a; 1&#xff09;用户进入用户注册界面&#xff0c;本用例开始&#xff1b; 2&#xff09;系统显示需要填写的注册信息表单&#xff1b; 3&#xff09;用户填入所有注册信息&#xff0c;点击提交后发送并审核&#xff1b; 4&#xff09;系统处理相应操作&a…

centos配置nacos集群

nacos配置集群 1.官方文档地址 https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 2.环境准备 1.64 bit OS&#xff0c;支持 Linux/Unix/Mac/Windows。&#xff08;至少3台&#xff0c;或者通过修改端口在一台服务器 启动多个nacos进行测试&#xff09;。 2.64 bit …

*2.5 迭代法的收敛阶与加速收敛方法

学习目标&#xff1a; 了解迭代法的基本概念和原理。学习者需要理解迭代法的基本概念和原理&#xff0c;包括迭代过程、迭代格式、收敛性等基本概念。 熟练掌握迭代法的收敛阶和收敛速度。学习者需要了解迭代法的收敛阶和收敛速度&#xff0c;掌握如何计算迭代法的收敛阶和收敛…

linux系统防火墙开启放行其他端口

linux系统防火墙开启放行其他端口 弹性云主机防火墙放行对应端口 1、WDCP 系统端口放行&#xff1a; &#xff08;1&#xff09;3.2版本 登录wdcp面板后点击“安全管理”——“防火墙设置”——“快速添加”&#xff0c;如图填写端口&#xff08;协议默认都使用tcp&#xf…

Stable Diffusion-生成性AI的新范式

! 扩散模型&#xff08;Stable Diffusion)现在是生成图像的首选模型。由于扩散模型允许我们以提示( prompts)为条件生成图像&#xff0c;我们可以生成我们所选择的图像。在这些文本条件的扩散模型中&#xff0c;稳定扩散模型由于其开源性而最为著名。 在这篇文章中&#xff0…