• 03 .NET CORE 2.2 使用OCELOT -- Docker中的Consul


    部署consul-docker镜像

    先搜索consul的docker镜像

    docker search consul

    然后选择了第一个,也就是官方镜像

     下载镜像

    docker pull consul

    然后运行镜像

    docker run -d --name consul -v /home/root/config:/config --restart=always
    -p 8300:8300
    -p 8301:8301
    -p 8301:8301/udp
    -p 8302:8302
    -p 8302:8302/udp
    -p 8400:8400
    -p 8500:8500
    consul agent -server
    -bootstrap-expect 1
    -ui
    -client 0.0.0.0

    consul中每个启动参数的含义,参考了以下链接:

    https://www.bitdoom.com/2017/09/07/p125/

    https://yq.aliyun.com/articles/536508

    https://blog.csdn.net/yinwaner/article/details/80762757

    https://blog.csdn.net/qq_36228442/article/details/89085373

    https://www.cnblogs.com/PearlRan/p/11225953.html

    https://www.cnblogs.com/magic-chenyang/p/7975677.html

    注册服务

    参考链接:

    https://blog.csdn.net/hailang2ll/article/details/82079192

    新建一个common项目

      

    新建ConsulBuilderExtensions.cs 、ConsulService.cs、HealthService.cs

     1 using Consul;
     2 using Microsoft.AspNetCore.Builder;
     3 using Microsoft.AspNetCore.Hosting;
     4 using System;
     5 using System.Collections.Generic;
     6 using System.Linq;
     7 using System.Threading.Tasks;
     8 
     9 namespace Test.WebApi.Common
    10 {
    11     public static class ConsulBuilderExtensions
    12 
    13     {
    14 
    15         // 服务注册
    16 
    17         public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IApplicationLifetime lifetime, HealthService healthService, ConsulService consulService)
    18 
    19         {
    20 
    21             var consulClient = new ConsulClient(x => x.Address = new Uri($"http://{consulService.IP}:{consulService.Port}"));//请求注册的 Consul 地址
    22 
    23             var httpCheck = new AgentServiceCheck()
    24 
    25             {
    26 
    27                 DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册
    28 
    29                 Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔
    30 
    31                 HTTP = $"http://{healthService.IP}:{healthService.Port}/api/health",//健康检查地址
    32 
    33                 Timeout = TimeSpan.FromSeconds(5)
    34 
    35             };
    36 
    37             // Register service with consul
    38 
    39             var registration = new AgentServiceRegistration()
    40 
    41             {
    42 
    43                 Checks = new[] { httpCheck },
    44 
    45                 ID = healthService.Name + "_" + healthService.Port,
    46 
    47                 Name = healthService.Name,
    48 
    49                 Address = healthService.IP,
    50 
    51                 Port = healthService.Port,
    52 
    53                 Tags = new[] { $"urlprefix-/{healthService.Name}" }//添加 urlprefix-/servicename 格式的 tag 标签,以便 Fabio 识别
    54 
    55             };
    56 
    57             consulClient.Agent.ServiceRegister(registration).Wait();//服务启动时注册,内部实现其实就是使用 Consul API 进行注册(HttpClient发起)
    58 
    59             lifetime.ApplicationStopping.Register(() =>
    60 
    61             {
    62 
    63                 consulClient.Agent.ServiceDeregister(registration.ID).Wait();//服务停止时取消注册
    64 
    65             });
    66 
    67             return app;
    68 
    69         }
    70 
    71     }
    72 }
     1 namespace Test.WebApi.Common
     2 {
     3     public class ConsulService
     4 
     5     {
     6 
     7         public string IP { get; set; }
     8 
     9         public int Port { get; set; }
    10 
    11     }
    12 }
     1 namespace Test.WebApi.Common
     2 {
     3     public class HealthService
     4     {
     5         public string Name { get; set; }
     6 
     7         public string IP { get; set; }
     8 
     9         public int Port { get; set; }
    10     }
    11 }

    两个webapi项目引用这个common项目

    并修改各自的 startup.cs

     1 public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)
     2         {
     3             if (env.IsDevelopment())
     4             {
     5                 app.UseDeveloperExceptionPage();
     6             }
     7             else
     8             {
     9                 // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    10                 app.UseHsts();
    11             }
    12             ConsulService consulService = new ConsulService()
    13             {
    14                 IP = Configuration["Consul:IP"],
    15                 Port = Convert.ToInt32(Configuration["Consul:Port"])
    16             };
    17             HealthService healthService = new HealthService()
    18             {
    19                 IP = Configuration["Service:IP"],
    20                 Port = Convert.ToInt32(Configuration["Service:Port"]),
    21                 Name = Configuration["Service:Name"],
    22             };
    23 
    24             app.RegisterConsul(lifetime, healthService, consulService);
    25 
    26             //app.UseConsul();
    27             app.UseHttpsRedirection();
    28             app.UseMvc();
    29         }

    修改 appsettings.json。 192.168.2.16是本机地址。192.168.2.29是docker中consul的地址。 两个项目的配置类似,区别是本地项目的端口9001、9002。

     1 {
     2   "Logging": {
     3     "LogLevel": {
     4       "Default": "Warning"
     5     }
     6   },
     7   "AllowedHosts": "*",
     8 
     9   "Service": {
    10     "Name": "ApiService",
    11     "IP": "192.168.2.16",
    12     "Port": "9001"
    13   },
    14   "Consul": {
    15     "IP": "192.168.2.29",
    16     "Port": "8500"
    17   }
    18 }

    IIS部署 .NET CORE 2.2

    参考链接:

    https://www.cnblogs.com/wxlv/p/netcore-to-iis.html

    部署期间遇到过以下问题

    HTTP Error 500.35 - ANCM Multiple In-Process Applications in same Process ASP.NET Core 3

    解决方法:两个webapi项目 用不一样的应用池。

    部署完成后,测试下 各自项目的 /api/health接口是否正常。

    测试网关项目

    修改网关项目的配置configuration.json

     1 {
     2   "ReRoutes": [
     3     {
     4       "UseServiceDiscovery": true,
     5       "DownstreamPathTemplate": "/{url}",
     6       "DownstreamScheme": "http",
     7       "ServiceName": "ApiService",
     8       "LoadBalancerOptions": {
     9         "Type": "RoundRobin"
    10       },
    11       "UpstreamPathTemplate": "/{url}",
    12       "UpstreamHttpMethod": [ "Get" ],
    13       "ReRoutesCaseSensitive": false
    14     }
    15   ],
    16   "GlobalConfiguration": {
    17     "ServiceDiscoveryProvider": {
    18       "Host": "192.168.2.29",
    19       "Port": 8500,
    20       "Type": "PollConsul",
    21       "PollingInterval": 100
    22     }
    23   }
    24 }

    修改 startup.cs

     1 public void ConfigureServices(IServiceCollection services)
     2         {
     3             services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
     4             services.AddOcelot(new ConfigurationBuilder()
     5                     .AddJsonFile("configuration.json")
     6                     .Build())
     7                     .AddConsul();
     8         }
     9 
    10         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    11         public async void Configure(IApplicationBuilder app, IHostingEnvironment env)
    12         {
    13             if (env.IsDevelopment())
    14             {
    15                 app.UseDeveloperExceptionPage();
    16             }
    17             else
    18             {
    19                 // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    20                 app.UseHsts();
    21             }
    22             await app.UseOcelot();
    23             app.UseHttpsRedirection();
    24             app.UseMvc();
    25         }

    F5启动项目

  • 相关阅读:
    C 习题
    gcc
    几何视角看线性方程组解的情况
    JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
    为什么重写了equals(),还要重写hashCode()?
    关于ArrayList的越界问题?
    通过实例聊聊Java中的多态
    java异常处理实例分析
    Java: Integer用==比较时127相等128不相等的原因
    Java并发编程:Lock
  • 原文地址:https://www.cnblogs.com/zhanglinfeng715/p/11696946.html
Copyright © 2020-2023  润新知