ocelot+consul治理服务

news2024/12/26 0:49:12

consul

Consul 是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案相比,Consul的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其它工具(比如ZooKeeper等) ,使用起来也较为简单。

Consul 使用Go语言编写,因此具有天然可移植性(支持Linux,Windows和Mac OS);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。

Consul 官网:https://www.consul.io/

Consul 官网介绍:https://www.consul.io/docs

Consul 中文教程:https://www.springcloud.cc/spring-cloud-consul.html

总结就是,当服务多了比较麻烦,就用服务发现的方式处理。

网上很多consul的介绍,可以自己了解。

注册

启动consul,用开发模式。输入命令:consul agent --dev -node=ip

webapi服务注册,大家可以在网上搜索,我直接贴代码聊。

  1. nuget引入Consul。

  1. 加入注册代码。

 public static class ConsulManager
    {
       
        public static void UssConsul(this IApplicationBuilder app, IHostApplicationLifetime lifetime, IConfiguration configuration, IConsulClient consulClient)
        {
            RegServer(configuration,lifetime, consulClient);
        }
        
        /// <summary>
        /// 注册微服务
        /// </summary>
        /// <param name="configuration"></param>
        /// <param name="consul"></param>
        private static void RegServer(IConfiguration configuration, IHostApplicationLifetime lifetime, IConsulClient consul)
        {
            string consulService = configuration["Service:Name"];//获取appsettings.json文件里的ConsulGroup节点数据;
            string urlPath =configuration["UrlPath"];//获取appsettings.json文件里的UrlPath节点数据;
            string ip = string.IsNullOrWhiteSpace(configuration["Service:ip"]) ? "127.0.0.1" : configuration["Service:ip"];//ip值是在启动服务时传入的参数
            int port = Convert.ToInt32(configuration["Service:port"]) == 0 ? 80 : Convert.ToInt32(configuration["Service:port"]);//port值是在启动服务时传入的参数
            string serviceId = $"{consulService}_{ip}_{port}_{Guid.NewGuid()}";


            string chkInterval = string.IsNullOrWhiteSpace(configuration["Service:Check:Interval"])? "2" : configuration["Service:Check:Interval"];
            string chkAddress = string.IsNullOrWhiteSpace(configuration["Service:Check:Address"]) ? "http://{ip}:{port}/api/Health" : configuration["Service:Check:Address"];
            string chkTimeOut= string.IsNullOrWhiteSpace(configuration["Service:Check:Interval"])  ? "10" : configuration["Service:Check:Interval"];
           string chkDeregisterCriticalServiceAfter= string.IsNullOrWhiteSpace(configuration["Service:Check:DeregisterCriticalServiceAfter"]) ? "10" : configuration["Service:Check:DeregisterCriticalServiceAfter"];
            //设置心跳包
            var httpCheck = new AgentServiceCheck()
            {
                // Interval = TimeSpan.FromSeconds(10),//间隔多久心跳检测一次
                // HTTP = $"http://{ip}:{port}/{urlPath}",//心跳检查地址,本服务提供的地址
                 HTTP = $"http://localhost:7002/api/Health",//心跳检查地址,本服务提供的地址
                // Timeout = TimeSpan.FromSeconds(2),//心跳检测超时时间
                // DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(10),//心跳检测失败多久后注销
                //  Method= "GET",
                Interval = TimeSpan.FromSeconds(Convert.ToInt32(chkInterval)),
              //  HTTP=chkAddress,
                Timeout = TimeSpan.FromSeconds(Convert.ToInt32(chkTimeOut)),
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(Convert.ToInt32(chkDeregisterCriticalServiceAfter)),
                Method = "GET",
            };
            //配置微服务信息
            var regist = new AgentServiceRegistration
            {
                Checks = new[] { httpCheck }, //心跳检测设置
                Address = ip,
                Port = port,
                Name = consulService,
                ID = serviceId,
                Tags = new[] { $"urlprefix-/{consulService}" }
            };
            lifetime.ApplicationStopping.Register(() =>
            {

                consul.Agent.ServiceDeregister(regist.ID).Wait();//服务停止时取消注册

            });
            consul.Agent.ServiceRegister(regist);//注册微服务!
        }
    }
  1. 配置文件加入

"Service": {

    "Name": "homepage",

    "IP": "localhost",

    "Port": "7002",

    "Check": {
      "Interval": "10",
      "Address": "http://192.168.0.106:7002/api/Health",
      "Timeout": "2",
      "DeregisterCriticalServiceAfter": "10",
      
    }
  },

  "Consul": {

    "IP": "localhost",//consul地址

    "Port": "8500"//consul端口
  }
  1. 程序中加入代码

string ip = builder.Configuration["Consul:IP"];
int port = Convert.ToInt32(builder.Configuration["Consul:Port"]);
string consuladdr = $"http://{ip}:{port}";
builder.Services.AddSingleton<IConsulClient>(new ConsulClient(tt =>
{

    tt.Address = new Uri(consuladdr);
    tt.Datacenter = "dc1";
}));
//..........
app.UssConsul(app.Lifetime, app.Configuration, app.Services.GetService<IConsulClient>());
  1. 增加健康检查接口

 [Route("api/[controller]")]
    [ApiController]
    public class HealthController : ControllerBase
    {
        #region 依赖注入
        private readonly ILogger<HealthController> _logger;
        private IConfiguration _IConfiguration;

        public HealthController(ILogger<HealthController> logger, IConfiguration configuration)
        {
            _logger = logger;
            _IConfiguration = configuration;
        }
        #endregion

        [HttpGet]
        public IActionResult Check()
        {
           this._logger.LogInformation($"{this._IConfiguration["port"]}- Health Check!");
            return Ok("ok");//200
        }

    }

WebAPi服务实现向consul注册。

ocelot使用consul获取服务

  1. 项目中nuget引入 Ocelot 、Ocelot.Provider.consul

  1. 配置中间件

builder.Services.AddOcelot(builder.Configuration).AddConsul().AddPolly(); //加 Consul服务 polly
  1. 配置ocelot.json

WebAPi中注册一个values控制器。访问:https://localhost:5000/ss/Values

可以先在consul中查看注册服务。

这里我没有什么讲解,因为网上很多,我还是推荐几篇文章

.NET 5 微服务之 Ocelot + Consul_**Dragon**的博客-CSDN博客_consul加ocelot

.NET Core 微服务 - API 网关之 Ocelot 与 Consul 服务发现 - ITPOW (cftea.com)

目前系统结构

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

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

相关文章

程序员副业接单做私活避坑指南

这篇文章系统的分享了对接单做私活这件事情的思考&#xff0c;也给出一些干货建议。希望让大家少走一些弯路&#xff0c;不要被坑。 先说结论 不建议大家在接单这个事情上投入太大精力&#xff0c;如果你“贼心不改”&#xff0c;建议大家以比较随缘的方式对待这件事情。 再说…

Linux云主机配置

Linux云主机配置 推荐环境&#xff1a; Mac 阿里云主机Linux 阿里云主机Windows Xshell 阿里云主机&#xff08;选择使用&#xff09;Windows 虚拟机 阿里云主机 1.云主机配置 选择配置的过程中&#xff0c;请注意选择操作系统版本为Ubuntu 16.04 64位 或 Ubuntu 18.04 6…

多位大厂专家鼎力推荐,44个微服务架构设计模式pdf,程序员福利

前言 本文的目标是让架构师和程序员学会使用微服务架构成功开发应用程序。 本文不仅讨论了微服务架构的好处&#xff0c;还描述了它们的弊端。读者将掌握如何在使用单体架构和使用微服务架构之间做出正确的权衡。 谁应该阅读本文&#xff1f; 本文的重点是架构和开发&#…

前端vue2实现头部组件(自定义背景icon+抽屉式使用指南展示)

一、文章引导 #mermaid-svg-Sqlx5Ih7pUPfo8rw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Sqlx5Ih7pUPfo8rw .error-icon{fill:#552222;}#mermaid-svg-Sqlx5Ih7pUPfo8rw .error-text{fill:#552222;stroke:#55222…

Python多态及用法详解

Python 是弱类型语言&#xff0c;其最明显的特征是在使用变量时&#xff0c;无需为其指定具体的数据类型。这会导致一种情况&#xff0c;即同一变量可能会被先后赋值不同的类对象&#xff0c;例如&#xff1a;class CLanguage: defsay(self): print("赋值的是 CLanguage 类…

ElasticSearch从入门到出门【下】

文章目录数据聚合聚合的种类DSL实现聚合Bucket聚合语法聚合结果排序限定聚合范围Metric聚合语法RestAPI实现聚合API语法业务需求业务实现自动补全拼音分词器自定义分词器自动补全查询实现酒店搜索框自动补全修改酒店映射结构修改HotelDoc实体重新导入自动补全查询的JavaAPI实现…

阿里云领取免费2H2G云服务器&证书分享&个税抵扣:Apsara Clouder云计算专项技能认证:云服务器ECS入门

这个证书是你领服务器一个月内要考的&#xff0c;内容也不难。下面是90分左右的答案&#xff08;粗体&#xff09;&#xff0c;仅供参考……单选1&#xff0e;云服务器ECS以服务化的方式对客户提供&#xff0c;阿里云产品售后支持的时间段是&#xff1f;A.5*8B.7*8C.7*12D.7*24…

《MySQL高级篇》十四、多版本并发控制

文章目录1. 什么是MVCC2. 快照读与当前读2.1 快照读2.2 当前读3. 复习3.1 再谈隔离级别3.2 隐藏字段、Undo Log版本链4. MVCC实现原理之ReadView4.1 什么是ReadView4.2 设计思路4.3 ReadView的规则4.4 MVCC整体操作流程5. 举例说明5.1 READ COMMITTED隔离级别下5.2 REPEATABLE …

Gerrit3.4.1安装+its插件

环境依赖jdk11安装jdk11&#xff1a;下载&#xff1a; wget https://download.java.net/openjdk/jdk11/ri/openjdk-1128_linux-x64_bin.tar.gz解压&#xff1a; tar zxvf openjdk-1128_linux-x64_bin.tar.gzsudo update-alternatives --install /usr/bin/java java /home/jenki…

P问题、NP问题、NPC问题、NP-Hard问题

经常听到老师讲&#xff0c;某一个问题&#xff08;比如说&#xff0c;车辆路径规划问题Vehicle Routing Problem&#xff09;是一个NP-Hard问题,此外&#xff0c;我们在阅读文章的时候&#xff0c;也经常会读到某一个问题是NP-Hard问题的陈述&#xff0c;与此同时&#xff0c;…

Python程序设计-第3章Python函数与模块

第3章Python函数与模块一.预习笔记 3.1 函数定义&#xff1a;def 函数名称 (参数1&#xff0c;参数2 …)&#xff1a; 函数体 * 函数是某一个功能或者某一段程序代码的一个封装 * 函数名是用户自己定义的名称&#xff0c;与变量的命名规则相同&#xff0c;用字母开头&#x…

Java线程池个人整理笔记

一、线程池有哪些优点 总体来说&#xff0c;线程池有如下的优势&#xff1a; &#xff08;1&#xff09;降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 &#xff08;2&#xff09;提高响应速度。当任务到达时&#xff0c;任务可以不需要等到线程创建…

配置Linux18.04系统/解决无法安装vmwatools的问题

一、解决无法安装vmwatools的问题 1.关闭虚拟机中的Linux18.04系统 2.打开虚拟机设置 3.修改所有的CD/DVD 、软盘 连接为&#xff1a;使用物理驱动器->自动检测&#xff08;如下图&#xff09; 4.打开虚拟机&#xff0c;都点是&#xff1b; 5.解决解压桌面上的vmware-…

春节特献!一文纵览2022年全球量子计算行业要闻!

&#xff08;图片来源&#xff1a;网络&#xff09;岁聿云暮&#xff0c;一元复始。如果说2018年是量子计算技术变革元年&#xff0c;那么2022年全球量子计算已正式步入市场探索加速期。随着中国、美国、欧盟等国家相继出台各种量子信息相关战略纲要和旗舰计划&#xff0c;越来…

数据的解析的介绍(1)

1.xpath 注意&#xff1a;提前安装xpath插件 &#xff08;1&#xff09;打开chrome浏览器 &#xff08;2&#xff09;点击右上角小圆点 &#xff08;3&#xff09;更多工具 &#xff08;4&#xff09;扩展程序 &#xff08;5&#xff09;拖拽xpath插件到扩展程序中 &#xff0…

王道操作系统笔记(五)———— 经典同步问题

前言&#xff1a;PV 操作题目分析步骤 关系分析&#xff1a; 找出题目中描述的各个进程&#xff0c;分析它们之间的同步、互斥关系。整理思路&#xff1a; 根据各进程的操作流程确定 P、V 操作的大致顺序。设置信号量&#xff1a; 并根据题目条件确定信号量初值。&#xff08;…

数据结构与算法基础——栈和队列

栈只能在表尾进行插入删除操作 队列先进先出 队列和栈都是线性表&#xff0c;不过是插入和删除的 位置被限制了。 队列头进尾出

Dubbo 入门系列之基于 Dubbo API 开发微服务应用

目标 从零上手开发基于 Dubbo 的微服务 难度 低 环境要求 系统&#xff1a;Windows、Linux、MacOS JDK 8 及以上&#xff08;推荐使用 JDK17&#xff09; Git IntelliJ IDEA&#xff08;可选&#xff09; Docker &#xff08;可选&#xff09; 动手实践 本章将通过手把…

网络编程-UDP数据报套接字

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1. 网络编程基础 1.1 为什么需要网络编程? 1.2 什…

好友关注-Feed流实现方案

9.3 好友关注-Feed流实现方案 当我们关注了用户后&#xff0c;这个用户发了动态&#xff0c;那么我们应该把这些数据推送给用户&#xff0c;这个需求&#xff0c;其实我们又把他叫做Feed流&#xff0c;关注推送也叫做Feed流&#xff0c;直译为投喂。为用户持续的提供“沉浸式”…