zoukankan      html  css  js  c++  java
  • .netcore的微服务学习(一)--Consul服务的注册和发现

    一,我们新建两个项目结构如下:ConsulTestDemo(AP项目)和TestClient(客户端访问调用)

    二,我们先写Consul的接口注册服务配置,如下代码

    using Consul;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.Extensions.Configuration;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace ConsulTestDemo.Utils
    {
        /// <summary>
        /// 自己封装的注册类
        /// </summary>
        public static class ConsulUtil
        {
            public static void ConsulRegist(this IConfiguration configuration)
            {
                ConsulClient client = new ConsulClient(c =>
                {
                    ///找到 Consul地址,默认地址
                    c.Address = new Uri("http://localhost:8500/");
                    c.Datacenter = "dc1";
                });
                string ip = configuration["ip"];
                int weight = string.IsNullOrWhiteSpace(configuration["weight"]) ? 1 : int.Parse(configuration["weight"]);
                int port = int.Parse(configuration["port"]);//命令行参数必须传入     
                client.Agent.ServiceRegister(new AgentServiceRegistration()
                {
                    ///微服务唯一标识,唯一的
                    ID = "service-" + port,
                    Name = "TestConsulService",//组名称-Group,同意份代码集群的组
                    Address = ip,//其实应该写ip地址
                    Port = port,//不同实例
                    ///标签参数,可以在注册的时候根据拿到tags标签来当权重,可以是属于地址参数上的tag
                    ///注册服务时指定权重,分配时获取权重并以此为依据分配实例
                    Tags = new string[] { weight.ToString() }, 
    
                    #region 配置心跳检查的
                    Check = new AgentServiceCheck()
                    {
                        ///心跳时间
                        Interval = TimeSpan.FromSeconds(12),
                        ///心跳地址
                        HTTP = $"http://{ip}:{port}/Api/Health/Index",
                        ///超时时间
                        Timeout = TimeSpan.FromSeconds(5),
                        ///取消服务注册时间
                        DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5)
                    }
                    #endregion
    
                });
                Console.WriteLine($"http://{ip}:{port}完成注册");
            }
        }
    } 

    我们将注册服务的放到管道的最后,如下管道的代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using ConsulTestDemo.Utils;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    
    namespace ConsulTestDemo
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllers();
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
                ///服务注册consul
                ///启动的时候已经完成注册,这里可能会有疑惑,当请求来的时候会不会再注册一次
                ///这里管道逻辑是请求的时候已经返回了,不会执行这个注册了
                this.Configuration.ConsulRegist();
            }
        }
    }

    三,现在服务和注册的代码已经写好了,我们启动consul

    1,用命令打开下载好的consul文件所在目录,输入代码启动consul

     如下代码

    cd g:/project
    consul_1.6.2.exe agent –dev

    四,我们在浏览器打开consul自带的页面,输入http://localhost:8500,如下界面

     五,我们用命令行启动写好接口服务,注册两个服务,打开两个命令窗口,端口5001,5002,如下命令行,weight是权重参数

    端口5001

    cd G:projectCoreApiConsulTestDemoConsulTestDemoinDebug
    etcoreapp3.1
    
    dotnet consultestdemo.dll --urls="http://*:5001" --ip="127.0.0.1" --port=5001 --weight=1

    端口5002

    cd G:projectCoreApiConsulTestDemoConsulTestDemoinDebug
    etcoreapp3.1
    
    dotnet consultestdemo.dll --urls="http://*:5002" --ip="127.0.0.1" --port=5002 --weight=2

    六,现在去看consul的界面,发现两个服务已经注册进去

     七,我们做了心跳检测,如下Service Checks,现在我们在其中一个命令行窗口关闭一个程序(PS:快捷键----Ctrl+C 停止命令启动的程序 )

    启动服务如下

     我们停止了5001端口这个服务,心跳立马检查出来服务器报错 ,ctrl+c停止控制台

     如下立马检测出来有问题,一个程序出错,停止了

     八,如上总结,consul的服务注册和发现,以及心跳检测就这样完了

  • 相关阅读:
    SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法
    Spring data jpa 使用技巧记录
    Hibernate 关于实体映射常用注解
    Mysql数据库实用语句集
    免配置环境变量使用Tomcat+设置项目主页路径为http://localhost:8080+修改tomcat端口号
    Springboot+shiro配置笔记+错误小结
    python阳历转农历
    Aria2+WebUI+caddy搭建私有网盘
    java运算符优先级
    IntelliJ IDEA 快捷键
  • 原文地址:https://www.cnblogs.com/May-day/p/13290477.html
Copyright © 2011-2022 走看看