联博开奖:.NETCore微服务探寻(一) - 网关

admin 3个月前 (06-16) 科技 28 0

前言

一直以来对于.NETCore微服务相关的手艺栈都处于一个浅尝辄止的领会阶段,在现实工作中也对于微服务也一直没有使用的营业环境,以是一直也没有整合过一个完整的基于.NETCore手艺栈的微服务项目。正好由于最近恰好告退,有了时间可以写写自己感兴趣的器械,以是在此想把自己领会的微服务相关的观点和手艺框架使用实现记录在一个完整的工程中,由于本人手艺有限,以是错误的地方希望人人指出。\

项目地址:httPS://github.com/yingpanwang/fordotnet/tree/dev

什么是Api网关

  由于微服务把详细的营业支解成单独的服务,以是若是直接将每个服务都与调用者直接,那么维护起来将相当贫苦与头疼,Api网关担任的角色就是整合请求并根据路由规则转发至服务的实例,而且由于所有所有请求都经由网关,那么网关还可以负担一系列宏观的阻挡功效,例如平安认证,日志,熔断

为什么需Api网关

 由于Api网关可以提供平安认证,日志,熔断相关的宏观阻挡的功效,也可以屏障多个下游服务的内部细节

有哪些著名的Api网关项目

  • Zuul Spring Cloud 集成
  • Kong 一款lua轻量级网关项目
  • Ocelot .NETCore网关项目

Ocelot使用

1.通过Nuget安装Ocelot

2.准备并编辑Ocelot设置信息

Ocelot.json

{
  "ReRoutes": [
    // Auth
    {
      "UpstreamPathTemplate": "/auth/{action}", // 上游请求路径模板
      "UpstreamHttpMethod": [ "GET", "POST", "PUT", "DELETE" ], // 上游请求方式
      "ServiceName": "Auth", // 服务名称
      "UseServiceDiscovery": true, // 是否使用服务发现
      "DownstreamPathTemplate": "/connect/{action}", // 下游匹配路径模板
      "DownstreamScheme": "http", // 下游请求
      "LoadBalancerOptions": { // 负载平衡设置
        "Type": "RoundRobin"
      }
      //,
      // 若是不接纳服务发现需要指定下游host
      //"DownstreamHostAndPorts": [
      //  {
      //    "Host": "10.0.1.10",
      //    "Port": 5000
      //  },
      //  {
      //    "Host": "10.0.1.11",
      //    "Port": 5000
      //  }
      //]
    }
  ],
  "GlobalConfiguration": { // 全局设置信息
    "BaseUrl": "http://localhost:5000", // 请求 baseurl 
    "ServiceDiscoveryProvider": { //服务发现提供者
      "Host": "106.53.199.185",
      "Port": 8500,
      "Type": "Consul" // 使用Consul
    }
  }
}

3.添加Ocelot json文件到项目中

将Config目录下的ocelot.json添加到项目中

4.在网关项目中 StartUp ConfigService中添加Ocelot的服务,在Configure中添加Ocelot的中间件(由于我这里使用了Consul作为服务发现,以是需要添加Consul的依赖的服务AdDConsul,若是不需要服务发现的话可以不用添加)

5.将需要发现的服务通过代码在启动时注册到Consul中

我这里自己封装了一个注册服务的扩展(写的对照随意没有在意细节)

联博开奖:.NETCore微服务探寻(一) - 网关 第1张

appsettings.json 中添加注册服务设置信息

"ServiceOptions": {
    "ServiceIP": "localhost",
    "ServiceName": "Auth",
    "Port": 5800,
    "HealthCheckUrl": "/api/health",
    "ConsulOptions": {
      "Scheme": "http",
      "ConsulIP": "localhost",
      "Port": 8500
    }
  }

扩展代码 ConsulExtensions(注重:3.1中 IApplicationLifetime已废弃 以是使用的是IHostApplicationLifetime 作为程序生命周期注入的方式)


using Consul;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;

namespace ForDotNet.Common.Consul.Extensions
{
    /// <summary>
    /// 服务设置信息
    /// </summary>
    public class ServiceOptions
    {
        /// <summary>
        /// 服务ip
        /// </summary>
        public string ServiceIP { get; set; }

        /// <summary>
        /// 服务名称
        /// </summary>
        public string ServiceName { get; set; }

        /// <summary>
        /// 协议类型http or https
        /// </summary>
        public string Scheme { get; set; } = "http";

        /// <summary>
        /// 端口
        /// </summary>
        public int Port { get; set; }

        /// <summary>
        /// 健康检查接口
        /// </summary>
        public string HealthCheckUrl { get; set; } = "/api/values";

        /// <summary>
        /// 健康检查距离时间
        /// </summary>
        public int HealthCheckIntervalSecond { get; set; } = 10;

        /// <summary>
        /// consul设置信息
        /// </summary>
        public ConsulOptions ConsulOptions { get; set; }
    }

    /// <summary>
    /// consul设置信息
    /// </summary>
    public class ConsulOptions
    {
        /// <summary>
        /// consul ip
        /// </summary>
        public string ConsulIP { get; set; }

        /// <summary>
        /// consul 端口
        /// </summary>
        public int Port { get; set; }

        /// <summary>
        /// 协议类型http or https
        /// </summary>
        public string Scheme { get; set; } = "http";
    }

    /// <summary>
    /// consul注册客户端信息
    /// </summary>
    public class ConsulClientInfo
    {
        /// <summary>
        /// 注册信息
        /// </summary>
        public AgentServiceRegistration RegisterInfo { get; set; }

        /// <summary>
        /// consul客户端
        /// </summary>
        public ConsulClient Client { get; set; }
    }

    /// <summary>
    /// consul扩展(通过设置文件设置)
    /// </summary>
    public static class ConsulExtensions
    {
        private static readonly ServiceOptions serviceOptions = new ServiceOptions();

        /// <summary>
        /// 添加consul
        /// </summary>
        public static void AddConsulServiceDiscovery(this IServiceCollection services)
        {
            var config = services.BuildServiceProvider().GetService<IConfiguration>();
            config.GetSection("ServiceOptions").Bind(serviceOptions);
            //config.Bind(serviceOptions);

            if (serviceOptions == null)
            {
                throw new Exception("获取服务注册信息失败!请检查设置信息是否准确!");
            }
            Register(services);
        }

        /// <summary>
        /// 添加consul(通过设置opt工具设置)
        /// </summary>
        /// <param name="app"></param>
        /// <param name="life">引用生命周期</param>
        /// <param name="options">设置参数</param>
        public static void AddConsulServiceDiscovery(this IServiceCollection services, Action<ServiceOptions> options)
        {
            options.Invoke(serviceOptions);
            Register(services);
        }

        /// <summary>
        /// 注册consul服务发现
        /// </summary>
        /// <param name="app"></param>
        /// <param name="life"></param>
        public static void UseConsulServiceDiscovery(this IApplicatioNBuilder app, IHostApplicationLifetime life)
        {
            var consulClientInfo = app.ApplicationServices.GetRequiredService<ConsulClientInfo>();
            if (consulClientInfo != null)
            {
                life.ApplicationStarted.Register( () =>
                {
                     consulClientInfo.Client.Agent.ServiceRegister(consulClientInfo.RegisterInfo).WAIt();
                });

                life.ApplicationStopping.Register( () =>
                {
                     consulClientInfo.Client.Agent.ServiceDeregister(consulClientInfo.RegisterInfo.ID).Wait();
                });
            }
            else
            {
                throw new NullReferenceException("未找到相关consul客户端信息!");
            }
        }

        private static void Register(this IServiceCollection services)
        {
            if (serviceOptions == null)
            {
                throw new Exception("获取服务注册信息失败!请检查设置信息是否准确!");
            }
            if (serviceOptions.ConsulOptions == null)
            {
                throw new ArgumentNullException("请检查是否设置Consul信息!");
            }

            string consulAddress = $"{serviceOptions.ConsulOptions.Scheme}://{serviceOptions.ConsulOptions.ConsulIP}:{serviceOptions.ConsulOptions.Port}";

            var consulClient = new ConsulClient(opt =>
            {
                opt.Address = new Uri(consulAddress);
            });

            var httPCheck = new AgentServiceCheck()
            {
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(10), // 服务启动多久后注册
                Interval = TimeSpan.FromSeconds(serviceOptions.HealthCheckIntervalSecond), // 距离
                HTTP = $"{serviceOptions.Scheme}://{serviceOptions.ServiceIP}:{serviceOptions.Port}{serviceOptions.HealthCheckUrl}",
                Timeout = TimeSpan.FromSeconds(10)
            };

            var registration = new AgentServiceRegistration()
            {
                Checks = new[] { httpCheck },
                ID = Guid.NewGuid().ToString(),
                Name = serviceOptions.ServiceName,
                Address = serviceOptions.ServiceIP,
                Port = serviceOptions.Port,
            };

            services.AddSingleton(new ConsulClientInfo()
            {
                Client = consulClient,
                RegisterInfo = registration
            });
        }
    }
}

6.启动运行

  • 启动consul
  • 启动 Auth,Gateway项目
  • 通过网关项目接见Auth

启动Consul

为了利便演示这里是以开发者启动的consul
在consul.exe的目录下执行
consul agent -dev -ui // 开发者模式运行带ui
联博开奖:.NETCore微服务探寻(一) - 网关 第2张

启动 Auth,Gateway项目

启动项目和可以发现我的们Auth服务已经注册进来了
联博开奖:.NETCore微服务探寻(一) - 网关 第3张

联博开奖:.NETCore微服务探寻(一) - 网关 第4张

通过网关接见Auth

我们这里接见 http://localhost:5000/auth/token 获取token
联博开奖:.NETCore微服务探寻(一) - 网关 第5张

我们可以看到网关项目吸收到了请求并在控制台中打印出以下信息
联博开奖:.NETCore微服务探寻(一) - 网关 第6张
然后在Auth项目中的控制台中可以看到已经乐成吸收到了请求并响应
联博开奖:.NETCore微服务探寻(一) - 网关 第7张

,

AllbetAPP下载

欢迎进入AllbetAPP下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

AllBetGaming声明:该文看法仅代表作者自己,与本平台无关。转载请注明:联博开奖:.NETCore微服务探寻(一) - 网关

网友评论

  • (*)

最新评论

文章归档

站点信息

  • 文章总数:653
  • 页面总数:0
  • 分类总数:8
  • 标签总数:978
  • 评论总数:238
  • 浏览总数:8664