微服務學習.net5+consul


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

官網下載https://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 = $"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": "http://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("http://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 = $"http://{agentService.Address}:{agentService.Port}/api/Comm/GetProvince";
            return url;
        }

需要demo的留言


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM