net6自动注册到Consul 代码实例

news2024/11/19 5:28:08

简单理解:

服务多的时候,服务地址都是写固定,增加一个地址,配置一次,配置nginx或者其他配置,麻烦

有了这个就可以通过应用服务上报服务名servicename和访问地址,同一个服务名servicename可以有多个节点,多个地址,通过consul就可以只根据一个服务名servicename,找到所有这个服务的地址,省事,并可以自动检查这个服务是否掉线

一、什么是consul?

       首先我们来了解什么是consul,consul是服务注册与发现的一种常用工具之一,翻阅了网上的部分资料,指把服务地址注册到consul,然后在consul中读取来消费;但在我的理解中,consul的作用是服务治理,属于可以横向伸缩的注册中心;为什么这么说呢?在以前我们用Nginx做负载时,需要把服务地址一个个手动集成进去的,如果服务多了会有什么问题呢?1.需要新增一个服务,必须要重新配置Nginx然后重启;2.感知不了哪个服务停止了;3.如果某个服务停止了,无法自动创建新的服务代替;因为微服务其中一个特点是基础设施自动化,所以明显Nginx满足不了需求,那么服务注册与发现就横空而生了(除了consul外还可以使用etcd,K8S Services等)。

二、consul有几大核心功能:

1.服务注册

  其实就是把需要使用的服务注册到注册中心(consul的注册方式是已服务主动推送给consul客户端->服务端),其他客户端可以使用 Consul 发现给定服务的提供者。使用 DNS 或 HTTP,应用程序可以轻松找到它们所依赖的服务(它是通过代理注册的方式注册到注册中心,提供业务代码的解耦)

什么是服务发现?

服务发现可以让一个应用或者组件发现其运行环境以及其它应用或组件的信息。用户配置一个服务发现工具就可以将实际容器跟运行配置分离开。常见配置信息包括:ip、端口号、名称等。

当一项服务存在于多个主机节点上时,client端如何决策获取相应正确的IP和port。

在传统情况下,当出现服务存在于多个主机节点上时,都会使用静态配置的方法来实现服务信息的注册。

而当在一个复杂的系统里,需要较强的可扩展性时,服务被频繁替换时,为避免服务中断,动态的服务注册和发现就很重要。

1c9752b0c9f34b52975b3e516fd58873.png

 

图中,客户端的一个接口,需要调用服务A-N。客户端必须要知道所有服务的网络位置的,以往的做法是配置是配置文件中,或者有些配置在数据库中。这里就带出几个问题:

需要配置N个服务的网络位置,加大配置的复杂性

服务的网络位置变化,都需要改变每个调用者的配置

集群的情况下,难以做负载(反向代理的方式除外)

总结起来一句话:服务多了,配置很麻烦,问题多多

既然有这些问题,那么服务发现就是解决这些问题的。话说,怎么解决呢?我们再看一张图

5321e88efc5942b68531ddb85285fec6.png

 

与之前一张不同的是,加了个服务发现模块。图比较简单,这边文字描述下。服务A-N把当前自己的网络位置注册到服务发现模块(这里注册的意思就是告诉),服务发现就以K-V的方式记录下,K一般是服务名,V就是IP:PORT。服务发现模块定时的轮询查看这些服务能不能访问的了(这就是健康检查)。客户端在调用服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务。这样的方式是不是就可以解决上面的问题了呢?客户端完全不需要记录这些服务网络位置,客户端和服务端完全解耦!

 

 

2.健康检查

  其实就是在程序中,建立一个接口,只返回状态使用,consul通过这个接口来检查服务是否健康,如果不健康,则通过策略去移除

3.多个数据中心

  其实就是支持集群,通过3个,或5个的单数服务端的consul来支持高可用(因为单数更适合做选举算法,如果数量太多又影响性能,所以这是官网标配);

4.安全服务通信

  Consul 可以为服务生成和分发 TLS 证书以建立相互 TLS 连接

 

三、consul安装

        安装需要到官网下载安装包

       小白注意:在未使用过的时候,我还以为通过nuget引用,原来是通过安装的,像mq安装那样,不需要写代码运行

  安装分2种,一种是二进制,以命令行的形式安装;一种是以exe文件免安装的形式;

      安装下载地址:https://developer.hashicorp.com/consul/downloads

07c659864ee642ffbba9d3e3123f2f6b.png

 

四、运行consul服务

  运行时,最可能出现的问题就是端口占用,可新增文件,修改文件端口号,然后执行命令

 进入安装包的下载目录,然后运行命令:

consul agent -dev -client=0.0.0.0

window下打开 cmd.exe

63c113a41fa948e4b0cdc51c8ef56e74.png

然后打开浏览器,默认端口是8500,浏览:http://localhost:8500  可以打开表示安装consul成功了

f09736daa3a54e79a0766048a2ccc17f.png

 

五、新建应用项目webAdmin 并自动应用注册到consul

  1.服务注册代码,目的是把当前服务推送到consul,并且设置健康检查

依赖组件

consul

新增注册类RegToConsul:

        /// <summary>
        /// 把本服务注册到Consul
        /// </summary>
        /// <param name="config">参数配置</param>
        /// <param name="appLifetime">程序生命周期</param>
        public static void RegToConsul(this IConfiguration config)
        {
            //Consul地址
            var address = appsettingHelper.GetSettings("Consul:consulAddress");// AppHelper.ReadAppSettings("Consul", "consulAddress");
            var consulClient = new ConsulClient(p => { p.Address = new Uri(address); });

            //本地IP
            var localIP = appsettingHelper.GetSettings("Consul:currentIp");// AppHelper.ReadAppSettings("Consul", "currentIp");
            //本地服务端口
            var localPort = Convert.ToInt32(appsettingHelper.GetSettings("Consul:currentPort")); //端口号从命令行参数获取(注:目前没找到直接获取本服务监听的端口的方法)

            //心跳检测设置
            var httpCheck = new AgentServiceCheck()
            {
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(60), //心跳检测失败多久后注销
                Interval = TimeSpan.FromSeconds(10), //间隔多久心跳检测一次
                HTTP = $"http://{localIP}:{localPort}/webadmin/Health/Check", //心跳检查地址,本服务提供的地址
                Timeout = TimeSpan.FromSeconds(5)  //心跳检测超时时间
            };

            //服务名(这里通过命令行参数传入不同的服务名,模拟我们有不同的服务[其实只是同一个接口项目的不同运行实例])
            var serviceName = appsettingHelper.GetSettings("Consul:serviceName");// AppHelper.ReadAppSettings("Consul", "serviceName");

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

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

        }

新建 json配置文件 /Configs/appsettings_test.json

{
  "Consul": {
    "consulAddress": "http://127.0.0.1:8500",//consul的访问地址
    "serviceName": "iot.webadmin",//服务名称,这个要跟Ocelot 使用时候,这个名字要一致
    "currentIp": "127.0.0.1",//本地IP
    "currentPort": "8070"//应用端口中
  }
}

读取配置文件类appsettingHelper,一般都现成的读配置文件的代码吧?可以用自己的代码读,实在没有,用我的试试: 

  public static class appsettingHelper
    {
        static IConfigurationBuilder builder;
        public static string GetSettings(string key)
        {

            IConfigurationBuilder builder;
            //测试环境
            builder = new ConfigurationBuilder()
              .SetBasePath(Directory.GetCurrentDirectory())
              .AddJsonFile(AppDomain.CurrentDomain.BaseDirectory  + "/Configs/appsettings_test.json", optional: false, reloadOnChange: true);
            IConfigurationRoot configuration = builder.Build();
            return configuration[key];
        }
}

在Program.cs中注入代码 

RegisterToConsul.RegToConsul(builder.Configuration);

如图: 

a27b25f700ff402fa935fd6db989c158.png

完成 以上步骤,已经完成应用自动注册功能

下面建一个API,用于给 consul 健康状态检测,意思是这个连接可以访问,则表示应用还活着

 HealthController.cs

  [Route("[controller]/[action]")]
    [ApiController]
    public class HealthController : Controller
    {
        /// <summary>
        /// 键康测试
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public JsonResult Check()
        {
            return new JsonResult("OK");
        }
    }

 完成后如:

f821e14b429749ef8bf3cfd23f1a0ba3.png

 运行应用起来,我的应用访问地址是:http://localhost:8070/

过十来秒,再看回上面运行中的consul,会多一个服务,那么这个注册已经完成

ccce04b5531346538355a93a65afe104.png

 下一篇文章讲如何配合Ocelot网关使用

 

 

 

 

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

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

相关文章

【教学类-15-05】20221207《八款字体的描字帖-2*4格》(中班大班)

成品样式&#xff1a; 80号字&#xff08;适应2-3个名字的大小&#xff09; 68号字&#xff08;适应4个名字大小&#xff08;2-3个名字也可以用&#xff0c;字会很小&#xff09;&#xff09; 打印样式&#xff1a; 背景需求&#xff1a; 前期进行多次的Python学具教学活动&a…

能跟CAD、BIM软件联合使用的地图神器,比奥维谷歌地图还方便!

是的&#xff0c;今天王工推荐的跟之前的地图工具不一样&#xff0c;百度、谷歌、MAPBOX那些称之为地图工具&#xff0c;这个简直就是地图的浏览器&#xff01;而且它还可以与CAD、BIM软件联合使用&#xff01; 实在是比奥维地图“香”。 海量图源任意浏览 ▲ 任意切换各种地…

OpUtils的网络扫描

什么是网络扫描程序 网络扫描程序只需扫描整个网络基础架构&#xff0c;即可获取和记录网络资源的可用性、性能和利用率指标。它执行 Ping 扫描和 SNMP 扫描&#xff0c;以识别网络中运行的实时主机和服务。网络扫描程序可以执行网络扫描以显示详细信息&#xff0c;例如当前登…

第十四届蓝桥杯集训——JavaC组首篇——环境搭建(win11)

还有9天就截止报名了&#xff0c;我们也算正式开始培训了&#xff0c;今年希望能取得更好的成绩。 今年的蓝桥杯从环境开始——本博客为win10电脑的Java_JDK环境搭建&#xff1a; 学生机环境-Java编程环境&#xff08;第十四届大赛&#xff09; 链接: https://pan.baidu.com…

Servlet 目录(pom.xml内容) 和 打包的两种方法

目录 一、webApp目录结构 web.xml里的内容 代码放置位置 后端代码&#xff1a;放到 src/main/java目录下 前端代码&#xff1a;放到webapp目录下 二、打包程序 一、webApp目录结构 web.xml里的内容 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web…

TI Lab_SRR学习_1 硬件基础 AWR1642和AWR1642EVM

首先需要对AWR1642芯片有一定的了解,包括天线设计,收发芯片的主要参数等。同时需要区分AWR1642和EVM板之间的区别。 可参考文档 awr1642 datasheetAWR1642 Evaluation Module (AWR1642BOOST) Single-Chip mmWave Sensing Solution 主要的Features(想了解各个子系统,请参考…

如何使用Spring Boot,Thymeleaf和Bootstrap上传多个文件

在本教程中&#xff0c;我将向您展示如何使用Spring Boot&#xff0c;Thymeleaf和Bootstrap上传多个文件。我们还使用 Spring Web MultipartFile界面来处理 HTTP 多部分请求并显示上传文件的列表。 春季启动多文件上传与百里香叶概述 我们的 Spring Boot Thymeleaf 多文件上…

如何通过“推送文案的千人千面”有效提升用户转化和留存

随着互联网用户红利消失和获客成本不断飙升、互联网正从“增量时代”迈向“存量时代”。 通过精细化运营激活存量用户&#xff0c;从而带动企业的第二增长曲线发力&#xff0c;已经成为行业共识。 在此趋势下&#xff0c;企业纷纷开始搭建私域流量池&#xff08;如会员体系、…

HTML学生个人网站作业设计:HTML做一个公司官网首页页面(纯html代码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

基于鹰优化算法和粒子群优化算法结合焊接梁设计,拉伸/压缩,压力容器,悬臂梁设计的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Linux学习】进程概念(下)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 进程概念&#xff08;下&#xff09;&#x1f35f;进程优先级&#x1f35f;进程切换&#x1f35f…

Logistic回归(随机梯度上升算法)

梯度上升算法 def gradAscent(dataMatIn, classLabels):dataMatrix np.mat(dataMatIn) #转换成numpy的matlabelMat np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置m, n np.shape(dataMa…

Elasticsearch入门(三)高级查询操作

前期准备 先把上一个内容的 student 索引删除掉 在 Postman 中&#xff0c;向 ES 服务器发 DELETE 请求&#xff1a;http://127.0.0.1:9200/student 在 Postman 中&#xff0c;向 ES 服务器发五个 POST 请求&#xff1a;http://127.0.0.1:9200/student/_doc/100x x分别是1&…

Linux下用文件IO的方式操作GPIO

1.首先查看系统中有没有 “/sys/class/gpio” 这个文件夹。如果没有请在编译内核的时候通过make menuconfig加入。 Device Drivers -> GPIO Support ->/sys/class/gpio/… (sysfs interface)。2./sys/class/gpio 的使用说明 如果是在已经适配好的 Linux 内核上&#xf…

【Vue路由】路由的简介及基本使用

文章目录路由的简介路由的基本使用几个使用路由的注意点组件分类组件去向路由组件路由的简介 再说路由之前&#xff0c;我们先来看看生活中的路由器&#xff0c;它的作用就是让多台设备同时上网&#xff0c;同时每一个接口对应一个网络设备&#xff1a; 我们可以这样来看&am…

面试题分享|Linux定时任务调度机制是怎么回事?

一. 前言 在求职过程中&#xff0c;有过面试经历的小伙伴们都知道&#xff0c;企业对linux的考察还是蛮频繁的。作为java开发程序员&#xff0c;在企业中我们的服务器都是在linux环境中部署的&#xff0c;所以熟练使用linux已经成为企业招聘人才的基本需求。但很多小伙伴在学习…

基于蚁群算法的车辆路径规划问题的研究(Matlab代码实现)

目录 1 概述 1.1研究背景 2 运行结果 3 Matlab代码实现 4 结语 5 参考文献 1 概述 车辆路径规划问题&#xff08;Vehicle Routing Problem,VRP&#xff09;是现代物流配送过程中的关键环节,而且其在众多领域中都有广泛的应用,因此它的提出引起了不同学科的专家和物流管理…

LeetCode HOT 100 —— 146.LRU缓存

题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回…

TI Lab_SRR学习_3 速度扩展_1 预备知识

首先先了解一下SRR模式下的chirp配置是什么样子,SRR的chirp的配置文件可以看(位置位于toolbox中)C:\mmwave_automotive_toolbox_3_1_0__win\mmwave_automotive_toolbox_3_1_0\labs\lab0002_short_range_radar\src\commonsrr_config_chirp_design_SRR80.h 通过以上代码可以知…

网络编程套接字——UDP

一、基础知识 1.区分源地址、目的地址 &#xff08;1&#xff09;源IP地址和目的地址&#xff1a;最开始的IP地址与送达数据的地址 &#xff08;2&#xff09;源MAC地址和目的MAC地址&#xff1a;相当于上一站的地址与下一站的地址&#xff0c;在不断地变化 socket通信&#…