winserver的consul部署实践与.netcore客户端使用(附demo源码)(代码片段)

jeely jeely     2022-12-02     598

关键词:

 

前言

随着微服务兴起,服务的管理显得极其重要。都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的服务,每个服务可以在短周期内重构、迭代、交付。随着微服务的数量增多,因量变引起了质量,带来新的问题其中一个是服务的管理问题。随着业务发展微服务增多,可能技术负责人也无法清楚记着服务的部署情况,服务的健康也不能时刻关注着,因此服务治理系统的作用必不可少。

本篇文章的源码:

demo:https://github.com/SkyChenSky/Consul.Demo

封装:https://github.com/SkyChenSky/Sikiro.Tookits.Consul

Consul

Consul是一款简单、易用、可伸缩性强的服务治理系统。

主要核心功能有:

  1. 服务发现
  2. 健康检查
  3. 键值存储
  4. 多数据中心

consul代理会每个一段时间对注册中心的服务节点进行访问,如果响应码为“20X"认为是健康。

键值存储可以认为是一个简易的k/v数据库,因此可以用此来存放配置信息。

服务发现

服务发现分服务注册和服务查找。

服务注册

将服务节点信息(地址+端口)添加(删除)到注册表,注册表会记录着服务的节点信息和状态

服务查找

由其他的服务或者系统通过注册表查询到指定可用服务的节点信息。

服务发现的方式

服务发现的方式又分自主式和代理式。

自主式

由各个服务主动的将自己节点信息添加(删除)到注册中心。实现是通过统一封装或者程序库,由服务各个节点承担服务发现的功能,与代理式相比由各自节点分担的访问压力。

技术图片

代理式

由一个系统(负载均衡系统)或者服务(API网关)来完成服务发现。因为由一个系统或者服务完成,随着注册服务的增加会带来性能瓶颈,因此需要对此做集群。

技术图片

Consul模式

Consul有两种模式,Client和Server,无论各种模式都有一个consul agent。

Client模式

Client模式是一个轻量级的consul agent,只拥有注册服务、健康检查、转发查询等功能。

Server模式

Server模式与Client模式相比,除了拥有Client模式的功能还多出了数据存储,leader选举等。

 

官方建议Server模式应保证3-5个,而且应该是奇数,为什么呢,因为少于3个无法保证高可用,多于5个又会给数据库同步的一致性带来压力,而Client数量控制则没有讲究。

 

技术图片

集群部署

下载consul https://www.consul.io/downloads.html

在服务器A,打开cmd,

consul agent -server -bootstrap-expect=1 -bind=192.168.20.80 -client=192.168.20.80 -join=192.168.20.80 -datacenter=dc1 -data-dir=data -ui -node=consul-80

在服务器B,打开cmd,

consul agent -server -bind=192.168.20.81 -client=192.168.20.81 -join=192.168.20.80 -data-dir=data -node=consul-81 

打开浏览器输入http://192.168.20.80:8500

技术图片

指令简析

  • -server
    • consul以server模式启动,不填则默认以client模式
  • -bootstrap-expect=1
    • 集群节点数,当集群节点数达到声明数量才会进行数据同步
  • -bind=192.168.20.80
    • 当前consul服务绑定地址
  • -client=192.168.20.80
    • http接口绑定地址,客户端调用需要
  • -join=192.168.20.80
    • 启动服务时加入目标集群
  • -node=consul-81
    • 服务节点名称
  • -ui
    • 启动web管理后台

客户端实践

安装Consul

技术图片

封装扩展

只贴部分核心代码,具体可以查看demo源码。

注入ConsulClient

public static IServiceCollection AddConsul(this IServiceCollection serviceCollection, Action<ConsulConfiguration> optionAction)
        
            _consulConfiguration = new ConsulConfiguration();
            optionAction(_consulConfiguration);

            var consulClient = new ConsulClient(x =>
                x.Address = new Uri(_consulConfiguration.Host));

            serviceCollection.AddSingleton(consulClient);

            return serviceCollection;
        

把当前服务注册到Consul

private static ConsulConfiguration _consulConfiguration;

        public static IApplicationBuilder UseConsul(this IApplicationBuilder app, IApplicationLifetime lifetime, Action<ServerConfiguration> optionAction)
        
            var consulClient = app.ApplicationServices.GetService<ConsulClient>();
            if (consulClient == null)
                throw new Exception("please AddConsul first");

            var serverConfiguration = new ServerConfiguration();
            optionAction(serverConfiguration);

            var serviceRegistration = GetServiceRegistration(serverConfiguration);

            //添加注册
            consulClient.Agent.ServiceRegister(serviceRegistration).Wait();

            //取消注册
            lifetime.ApplicationStopping.Register(() =>
            
                consulClient.Agent.ServiceDeregister(serviceRegistration.ID).Wait();
            );
            return app;
        
private static Uri GetSelfUri(string uristring)
        
            return new Uri(uristring);
        

        private static AgentServiceRegistration GetServiceRegistration(ServerConfiguration serverConfiguration)
        
            var localIp = GetSelfUri(serverConfiguration.SelfHost);

            var serviceRegistration = new AgentServiceRegistration
            
                Check = new AgentServiceCheck//健康检查
                
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(60),
                    Interval = TimeSpan.FromSeconds(30),
                    HTTP = $"http://localIp.Host:localIp.Port/api/health",
                    Timeout = TimeSpan.FromSeconds(3)
                ,
                ID = Guid.NewGuid().ToString("N"),
                Name = serverConfiguration.ServerName,
                Address = localIp.Host,
                Port = localIp.Port,
                Tags =
                    new[]
                    
                        serverConfiguration.ServerName
                    
            ;

            return serviceRegistration;
        

添加健康检查接口

与上述封装可以在同一个库,避免每个web服务都要写一个

[Route("api/[Controller]")]
    public class HealthController : Controller
    
        [HttpGet]
        public OkResult Get()
        
            return Ok();
        
    

在Startup.cs对Consul封装进行调用

ConfigureServices

 public void ConfigureServices(IServiceCollection services)
 
      services.AddOptions().AddConsul(option =>
      
          option.WithHost(Configuration["ConsulConfiguration:Host"]);
      ).AddMvc();
 

Configure

app.UseConsul(lifetime, option =>

    option.WithSelfHost(Configuration["SelfHost"]);
    option.WithServerName(Configuration["ConsulConfiguration:ServerName"]);
);

K/V扩展

只实现了put、get、delete,剩下可以自行按需添加

public static class ConsulKyExtensions
    
        public static async Task<bool> KvPutAsync(this ConsulClient consulClient, string key, string value)
        
            var kvPair = new KVPair(key)
            
                Value = Encoding.UTF8.GetBytes(value)
            ;
            var result = await consulClient.KV.Put(kvPair);

            if (result.StatusCode == HttpStatusCode.OK)
                return result.Response;

            return false;
        

        public static bool KvPut(this ConsulClient consulClient, string key, string value)
        
            var kvPair = new KVPair(key)
            
                Value = Encoding.UTF8.GetBytes(value)
            ;
            var result = consulClient.KV.Put(kvPair).ConfigureAwait(false).GetAwaiter().GetResult();

            if (result.StatusCode == HttpStatusCode.OK)
                return result.Response;

            return false;
        

        public static async Task<string> KvGetAsync(this ConsulClient consulClient, string key)
        
            var result = await consulClient.KV.Get(key);

            return Encoding.UTF8.GetString(result.Response.Value);
        

        public static string KvGet(this ConsulClient consulClient, string key)
        
            var result = consulClient.KV.Get(key).ConfigureAwait(false).GetAwaiter().GetResult();

            return Encoding.UTF8.GetString(result.Response.Value);
        

        public static async Task<bool> KvDeleteAsync(this ConsulClient consulClient, string key)
        
            var result = await consulClient.KV.Delete(key);

            if (result.StatusCode == HttpStatusCode.OK)
                return result.Response;

            return false;
        

        public static bool KvDelete(this ConsulClient consulClient, string key)
        
            var result = consulClient.KV.Delete(key).ConfigureAwait(false).GetAwaiter().GetResult();

            if (result.StatusCode == HttpStatusCode.OK)
                return result.Response;

            return false;
        
    

部署启动

修改appsettings.json,填写目标consul地址和本服务地址

  "Logging": 
    "IncludeScopes": false,
    "LogLevel": 
      "Default": "Warning"
    
  ,
  "ConsulConfiguration": 
    "Host": "http://192.168.20.80:8500",
    "ServerName": "ConsulWebDemo",
    "Id": "20E2CFBB-95C0-496A-B70F-11111111"
  ,
  "SelfHost": "http://localhost:1495/"

启动后,如果服务正常则可以显示下图效果。

技术图片

winserver的consul部署实践与.netcore客户端使用(附demo源码)(代码片段)

原文:winserver的consul部署实践与.netcore客户端使用(附demo源码)前言随着微服务兴起,服务的管理显得极其重要。都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的服务,每个服务可以在短周期内重构、迭... 查看详情

基于winserver的apollo配置中心分布式&集群部署实践(正确部署姿势)(代码片段)

 前言前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候,每一步都踩着坑过来的。因此写文档与需要的朋友分享。此篇文章不代表官方部署流程,只是自己的部署的实践方式... 查看详情

蚂蚁课堂:阿波罗(代码片段)

基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)2018.07.2018:34 1118浏览 前言前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候,每一步都踩着坑过来的... 查看详情

docker-容器部署consul集群(代码片段)

原文:Docker-容器部署Consul集群目录说明简介了解ConsulConsul使用场景Consul优势Consul中的概念安装准备Consul镜像安装单个Consul组装集群Consul总结引用和附件说明本文主要介绍怎么使用Docker在Linux环境部署Consul集群,如果你对Docker不了... 查看详情

consul部署架构

Consul使用Raft算法来保证一致性,比复杂的Paxos算法更直接,用于实现分布式系统的服务发现与配置。应用Consul提供的服务需要建立Consul集群。在Consul方案中,每个提供服务的节点上都要部署和运行Consul的agent,所有运行Consulagent节... 查看详情

consul入门篇

参考技术Aconsul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框架(类似zookeeper)、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案。服务部署简单,只有一个可运行的... 查看详情

dockerconsul容器服务更新与发现(代码片段)

DockerConsul容器服务更新与发现容器服务更新与发现拓扑图在consul服务器上部署nginx代理服务,registrator检测到docker容器中的服务,注册添加到consul中,consul-template根据consul中的服务信息,注册写入创建好的template模板中,设置nginx... 查看详情

dapr+.net实战(十四)虚拟机集群部署mdns+consul

前面我们说了在单机模式下和K8S集群下的Dapr实战,这次我们来看看如何在不使用K8S的情况下,在一个传统的虚拟机集群里来部署Dapr。1.环境准备我们准备两台centos7虚拟机Dapr1:192.168.43.131Dapr2:192.168.43.1322.DaprCLI安... 查看详情

winserver部署apollo(附.net客户端demo)(代码片段)

前言配置中心伴随着这几年分布式系统演变和微服务架构的兴起,已经成为必不可少的需求之一。试下一下如果哪天公司的所有应用服务,从公司服务器迁移到云服务,成千上万的配置,修改起来是多么耗时费劲的事(我们公司... 查看详情

dockerconsul(容器服务更新与发现)集群部署(代码片段)

Dockerconsul一.Consul概述(容器服务更新与发现)1.什么是服务注册与发现2.什么是consul二.部署consul一.Consul概述(容器服务更新与发现)1.什么是服务注册与发现服务注册与发现是微服务架构中不可或缺的重要组件。... 查看详情

dockerconsul(容器服务更新与发现)集群部署(代码片段)

Dockerconsul一.Consul概述(容器服务更新与发现)1.什么是服务注册与发现2.什么是consul二.部署consul一.Consul概述(容器服务更新与发现)1.什么是服务注册与发现服务注册与发现是微服务架构中不可或缺的重要组件。... 查看详情

dockerconsul的容器服务更新与发现(代码片段)

Dockerconsul的容器服务更新与发现一、Dockerconsul的容器服务更新与发现1、什么是服务注册与发现2、什么是consul?3、consul提供的一些关键特性二、Consul部署第一步:consul服务器上操作如下1.建立consul服务2.设置代理,后... 查看详情

dockerconsul的容器服务更新与发现(代码片段)

Dockerconsul的容器服务更新与发现一、Dockerconsul的容器服务更新与发现1、什么是服务注册与发现2、什么是consul?3、consul提供的一些关键特性二、Consul部署第一步:consul服务器上操作如下1.建立consul服务2.设置代理,后... 查看详情

consul集群部署

大纲:关于consulconsul的架构部署服务器分配安装部署启动agent启动consulserver启动consulclient把client节点加入consul集群查看集群成员查看集群信息注册服务更新服务更新服务查询服务启用webui(尚未成功)关于consulconsul是一个开源工具,... 查看详情

loadrunner联机跑负载winserver2012r2环境部署

下列为在实际loadrunner联机跑负载winserver2012r2环境部署中进行的成功案例,遇到的问题和解决方法,仅作整理和记录,如转载请署名及原文地址。1.环境:  controller一台:winserver2012r2操作系统(已经安装loadrunner11)  ... 查看详情

.net6使用consul实现服务注册与发现(代码片段)

...微服务项目,大多数都上了k8s,基本上都看不到Consul的身影,所以在工作之余折腾了下Consul,作为个人来讲还是得学习下,所以也就顺便通过文章来记录下学习过程。还有就是现在基本上只要提到微服务,... 查看详情

consul功能简介

Consul是HashiCorp公司的一个用于实现分布式系统的服务发现与配置工具。Consul内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案。由于出现得晚些,Consul具有功能完善、部署简单、使用方... 查看详情

docker私有仓库部署之compose搭建consul集群(代码片段)

...编排1.3DockerCompose常用命令1.4DockerCompose配置常用字段二、Consul简介2.1consul概述2.2Consul容器服务更新与发现三、部署Compose3.1安装docker、设置镜像加速3.2compose部署四、consul部署4.1consul 查看详情