.net6使用consul+ocelot使用微服務架構

安裝consul

安裝consul,winodws下使用命令啓動consul

consul.exe agent -dev

如果需要別的機器訪問,需要設置IP

consul.exe agent -dev -client 0.0.0.0

管理頁面的端口是8500

在serveces可以看到已經設置註冊進來的服務SA

創建微服務項目

創建.net6的webapi項目
nuget引用類庫 consul
編寫註冊consul的幫助類

` public static IApplicationBuilder UseConsul(this IApplicationBuilder app, IConfiguration configuration)
{
var lifetime = app.ApplicationServices.GetRequiredService();

        //創建Consul客戶端實例
        ConsulClient consulClient = new ConsulClient(cfg =>
        {
            //Consul監聽地址
            cfg.Address = new Uri("http://localhost:8500");
            //數據中心名稱
            cfg.Datacenter = "MTS";
        });
        //命令行獲取IP地址
        var ip = configuration["ip"];
        Console.WriteLine($"****ip:{ip}");
        var port = configuration["port"];
        Console.WriteLine(port);

        //權重
        var weight = string.IsNullOrEmpty(configuration["weight"]) ? 1 : int.Parse(configuration["weight"]);

        var registration = new AgentServiceRegistration
        {
            //服務唯一標識
            ID = "Test999_" + DateTime.Now.ToString("yyyyMMddHHmmssfff"),
            //服務分組
            Name = "SA",
            //服務對應的ip地址
            Address = ip,
            //服務對應的端口
            Port = int.Parse(port),
            //心跳檢查
            Check = new AgentServiceCheck
            {
                //心跳檢查路徑
                HTTP = $"http://{ip}:{port}/api/health/check",
                //檢查間隔
                Interval = TimeSpan.FromSeconds(12),
                //超時時間
                Timeout = TimeSpan.FromSeconds(5),
                //失敗多久取消註冊
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(60)
            },
            Tags = new string[] { weight.ToString() }
        };


        //註冊服務
        consulClient.Agent.ServiceRegister(registration).Wait();
        lifetime.ApplicationStopping.Register(
            () =>
            {
                consulClient.Agent.ServiceDeregister(registration.ID).Wait();
            }

            );

        return app;
    }`

編寫心跳檢測的控制器
[HttpGet] [Route("Check")] public IActionResult Check() { return Ok(); }
因爲.net6沒有setup了,所以在program中添加調用consul的項目
IConfiguration configuration = builder.Configuration; app.UseConsul(configuration);
啓動項目,此時,項目會注入到sonsul中,這個時候如果客戶端要訪問這些api,需要使用consul去註冊發現,所以即使只有一個服務,沒有網關也是很不方便的

創建網關ocelot項目

創建.net6的webapi項目,nuget添加ocelot和Ocelot.Provider.Consul
創建ocelot.json的文件
{ "Routes": [ { "UpstreamPathTemplate": "/SA/{everything}", "UpstreamHttpMethod": [ "Get", "Post" ], "DownstreamPathTemplate": "/SA/{everything}", "DownstreamScheme": "http", "ServiceName": "SA" } ], "GlobalConfiguration": { "BaseUrl": "https://localhost:5280", "ServiceDiscoveryProvider": { "Scheme": "http", "Host": "localhost", "Port": 8500, "Type": "Consul" } } }
此時啓動網關項目,即可以看到之前註冊的服務出現在swagger中了,測試調用

program添加
`builder.Services.AddOcelot(new ConfigurationBuilder()
.AddJsonFile("ocelot.json")
.Build()).AddConsul();

var app = builder.Build();
app.UseOcelot();`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章