zoukankan      html  css  js  c++  java
  • 来,Consul 服务发现入个门(一看就会的那种)

    前言

    在微服务架构中,对于一个系统,会划分出多个微服务,而且都是独立开发、独立部署,最后聚合在一起形成一个系统提供服务。当服务数量增多时,这些小服务怎么管理?调用方又怎么能确定服务的IP和端口?服务挂掉了又怎么办?单靠人工处理已经不太现实,使用系统统一管理就是最好的选择,常用的服务发现产品有:ConsulZookeeperEtcdEureka等,而对于Consul在.NetCore中是很火很火的,所以接下来肯定先聊它喽。

    正文

    Consul是一个支持多数据中心、分布式、高可用的服务发现和配置共享的系统,开箱即用,主要功能如下:

    • 服务发现:可以通过Consul客户端注册服务,这里服务可以是API站点、Redis服务器、MySql服务器等;当其他客户端需要使用对应的服务时,Consu可以通过DNS或HTTP的形式将服务返回给所需客户端;无需再手动指定IP和端口,由Consul统一管理。
    • 健康检查:Consul提供对各服务进行检查的功能,相关人员可以通过检查信息关注各服务的运行情况;而对于的服务的使用者,可以避免访问不健康的服务,如当一个API站点挂掉了,调用方从Consul中获取服务信息时就获取不到,而是返回健康的服务信息,从而保证调用API正常。
    • 键值对存储:可以存储键值对数据,很适合当配置中心使用。比如有多个服务,每个服务都一些配置信息,可以将其统一配置在Consul中,避免每一个服务重复配置,很大程度降低了配置错误导致的风险。
    • 多数据中心:Consul支持多个开箱即用的数据中心,每个数据中心独立运行。

    简单了解Consul功能之后,接下来就先说说服务发现健康检查的应用,大概的一个流程如下图:

    image-20210311100147756

    上图简单描述

    • 各服务通过配置文件或代码的形式进行注册,即把信息报给Consul;
    • Consul根据注册的信息,对已经注册服务进行健康检查;Grpc、TCP、HTTP方式都可以;
    • 客户端如果需要使用服务信息,如IP和端口,可以通过Consul进行获取健康的服务(服务发现);DNS和HTTP两种方式都可以;

    接来从安装开始,做一个Demo演示,包括服务注册、服务查看、健康检查、服务失效之后发邮件通知功能,算是从开发到维护走了一个流程(不过只是演示的那种)。

    1. 安装

    Consul的安装可以说超级简单,进官网->下载->解压就完成安装啦,官网地址:https://www.consul.io/;

    找到下载页面,选择适合自己系统的版本,直接下载就行,如下图:

    image-20210310232033732

    下载完成之后,直接解压,然后打开命令行工具,运行一下是否正常,如下图:

    image-20210310232359403

    2. 注册服务

    • 配置文件形式

      首先肯定需要准备一个配置文件,这里为了查看Consul运行时监控的服务数据,也可以指定对应数据输出的目录,所以还需要一个数据目录,如下:

      image-20210310233213277

      config:作为配置文件的存放位置,Conusl启动时可以指定配置文件位置,然后可以自动加载该目录下所有json文件;

      data:这个就是一个空文件夹,用于存储Consul运行时产生的数据,这个不是必须的。

      有了目录结构之后,然后在config中创建一个services.json文件,里面内容如下:

      image-20210310233859963

      配置信息见上图已经做了相关说明,而对于健康检查,因为上图配置的是以HTTP的形式检查API服务是否正常,即能否正常访问对应地址,当然可以根据场景需要配置检测方式,比如Grpc、TCP、脚本等。

      配置文件准备好了之后,可以直接运行Consul啦,这里为了快速入门,先以开发模式运行,如下:

      image-20210310234650593

      命令解析:

      agent:运行代理;

      -dev:以开发模式运行,快速开启一个Server,信息如上图;

      -confile-file:指定Consul配置文件所在的目录,然后就自动加载该目录下的所有json文件;

      -data-dir : 指定Consul运行时存储数据的目录,一般包含服务的状态及相关信息;

      用配置文件这种方式,代码无需更改,只需保证服务运行的时候对应的IP地址、端口、健康检查的路径正确即可。由于现在还没有对应的服务,根据上面配置的的信息,每个5s会检查一次,当前检查的服务肯定是不健康的,Consul控制台会持续输出如下信息:

      image-20210310235356055

      新建一个WebAPI项目,增加一个Health健康检查的Controller,然后指定端口为5000运行,控制器代码如下:

      image-20210310235753712

      运行之后,Consul 代理就检测到了,如下:

      image-20210311000140016

    • 嵌入代码形式

      代码注册的形式需要引入Consul包,然后在代码中指定Consul地址和配置相关服务信息即可,其他无需改变,注册代码逻辑如下:

      先在配置文件中配置相关信息:

      image-20210311001101114

      服务注册代码如下:

      image-20210311001155425

      注册服务方法完成之后,直接在Startup文件中Configure方法的最后调用即可。然后指定对应端口启动服务即可,演示设置的端口为6688,这样服务就注册完啦,Consul也能检测到。

    3. 查看服务

    服务完成注册之后,肯定是要需要查看或使用,主要有以下三种方式:

    • UI形式

      Consul提供对应的页面查看注册服务的相关信息,当然也可以配置相关信息。当Consul启动之后,就可以通过http://localhost:8500/(这里演示是本地)这个地址访问到对应的界面,如下:

      image-20210311002544870

      界面就不挨个截图啦,小伙伴自己点点。这个可视化界面还是很给力的。

    • DNS和HTTP形式

      同样也可以通过用命令方式进行查看,有两种形式,DNS和HTTP。这里先用HTTP的方式演示,DNS方式留给小伙伴吧,很简单的。

      HTTP形式,直接调用接口即可(当然可以进行权限控制);

      image-20210311094202264

      查询服务常用的接口地址如下:

      查询所有服务:
      http://localhost:8500/v1/catalog/services

      根据服务名称查询服务,服务名称就是在注册服务时指定的名称:
      http://localhost:8500/v1/catalog/service/服务名称

      当同名称的服务有多个时,可以根据Tag过滤:
      http://localhost:8500/v1/catalog/service/服务名称?tag=test6688

      查询其他类型信息也和上面类似,比如查询节点信息、查询数据中心信息;

    • 代码形式

      需要依赖Consul包,代码如下:

      image-20210311104118140

      运行结果如下:

      image-20210311104229960

      当然这种形式也能获取Consul其他信息,小伙伴调试一下就知道啦;

    4. 监视服务(异常通知相关人员)

    对于服务本身,可能因为网络或软硬件的问题,导致服务挂掉,如果没有及时恢复,有些业务可能会导致后果比较严重,所以当服务挂掉时,及时通知是必须的;这里演示使用的是邮件的方式,需要简单设置一下发送邮箱;这里使用的是QQ邮箱发出,需要开启QQ邮箱相关服务,在QQ邮箱设置中开启即可,如下图:

    image-20210311105409275

    开启的时候需发送短信进行验证,然后会获得一个授权码,在后面发送邮件时会用到。

    为了演示方便,发送邮件通知的逻辑是写在业务服务中,其实可以单独出来一个服务专门负责通知即可。代码逻辑如下:

    image-20210311111150932

    增加一个通知接口,供监听调用,当监听到服务故障时,就调用该接口发送邮件即可:

    image-20210311111456473

    代码准备好了,现在需要配置监视,只需要在配置目录下增加监视的配置文件即可,这里取名为watchs.json,内容如下:

    image-20210311112010121

    配置文件完成之后,重启Consul即可,命令和刚开始启动的一样; 然后将服务启动,为了测试方便,服务用命令的方式启动,方便关闭,命令如下:

    dotnet ConsulCodeDemo.dll --urls "http://*:6688"  # 指定端口启动
    dotnet ConsulConfigDemo.dll # 默认就是5000,所以不用指定啦
    

    注:执行以上命令需要进入对应编译的文件目录;

    服务正常运行时,在Consul界面中可以看到各服务都是健康状态,然后将端口为5000的这个服务关掉(因为配置邮件发送的接口在6688上),Consul检测到就会自动调用接口,发送相关邮件。

    image-20210311113152319

    相关人员收到信息就可以及时进行处理。

    源码地址:https://github.com/zyq025/IDS4Demo/tree/main/ConsulDemo

    总结

    好了,Consul初探先到这吧,入门还差点,毕竟还有很多没讲,关于常用命令、集群搭建、ACL配置等都没涉及,所以下一篇来聊聊集群搭建和ACL配置,对于常用命令的使用,一边搭建环境,一边进行解释说明。

    一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~

  • 相关阅读:
    1.27
    1.25
    Representation Learning with Contrastive Predictive Coding
    Learning a Similarity Metric Discriminatively, with Application to Face Verification
    噪声对比估计(负样本采样)
    Certified Adversarial Robustness via Randomized Smoothing
    Certified Robustness to Adversarial Examples with Differential Privacy
    Dynamic Routing Between Capsules
    Defending Adversarial Attacks by Correcting logits
    Visualizing Data using t-SNE
  • 原文地址:https://www.cnblogs.com/zoe-zyq/p/14521828.html
Copyright © 2011-2022 走看看