微服務學習.net5+consul

趁着剛過完年,還沒有開始做業務的時候,學習下consul 概念自己去官網看,這裡只講下具體實現

官網下載//www.consul.io/downloads 我下載的是Windows版本

啟動consul命令 

consul agent -dev -client 0.0.0.0

新建.net5的api項目,.net5直接默認是swagger

4.新建擴展服務註冊到Consul方法,ConsulExtenions.cs

 

 public static void ConsulRegist(this IConfiguration configuration)
        {
            try
            {
                string ip = configuration["ip"];
                string port = configuration["port"];
                string weight = configuration["weight"];
                string consulAddress = configuration["ConsulAddress"];
                string consulCenter = configuration["ConsulCenter"];

                ConsulClient client = new ConsulClient(c =>
                {
                    c.Address = new Uri(consulAddress);
                    c.Datacenter = consulCenter;
                });

                client.Agent.ServiceRegister(new AgentServiceRegistration()
                {
                    ID = "CommService" + Guid.NewGuid(),//--唯一的
                    Name = "CommService",//分組---根據Service
                    Address = ip,
                    Port = int.Parse(port),
                    Tags = new string[] { weight.ToString() },//額外標籤信息
                    Check = new AgentServiceCheck()
                    {
                        Interval = TimeSpan.FromSeconds(12),
                        HTTP = $"//{ip}:{port}/Api/Health/Index", // 給到200
                        Timeout = TimeSpan.FromSeconds(5),
                        DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(20)
                    }//配置心跳
                });
                Console.WriteLine($"{ip}:{port}--weight:{weight}"); //命令行參數獲取
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Consul註冊:{ex.Message}");
            }
        }

ip port 配置在appsettings.json裏面

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ip": "localhost",
  "port": 5000,
  "weight": 1,
  "ConsulAddress": "//127.0.0.1:8500",
  "ConsulCenter": "dc1"
}

Startup註冊ConsulRegist方法

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //if (env.IsDevelopment())
            //{
            app.UseDeveloperExceptionPage();
            app.UseSwagger();
            app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "comm.api v1"));
            //}

            //   app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
            // Consul註冊
            this.Configuration.ConsulRegist();
        }

可以用dotnet 啟動2個comm.api.dll  端口號自己隨便取,我取的5000和6000 HealthController為配置的心跳api返回的結果

再來看下Consul 會發現多了CommService

2 Instances為端口號5000和6000的api

註冊完成了,接下來實現調用看效果圖

調用代碼

 public static AgentService ChooseService(string serviceName)
        {
            using (ConsulClient client = new ConsulClient(c => c.Address = new Uri("//localhost:8500")))
            {
                var services = client.Agent.Services().Result.Response;
                // 找出目標服務
                var targetServices = services.Where(c => c.Value.Service.Equals(serviceName)).Select(s => s.Value);
                // 實現隨機負載均衡
                var targetService = targetServices.ElementAt(new Random().Next(1, 1000) % targetServices.Count());
                Console.WriteLine($"{DateTime.Now} 當前調用服務為:{targetService.Address}:{targetService.Port}");

                return targetService;
            }
        }
  public string GetCommUrl()
        {
            AgentService agentService = ConsulClientExtenions.ChooseService("CommService");
            string url = $"//{agentService.Address}:{agentService.Port}/api/Comm/GetProvince";
            return url;
        }

需要demo的留言

Tags: