ocelot集成consul服务发现

  • 首先下载consul 点击这里下载
  • 转到解压文件夹目录输入cmd命令  consul agent -dev (有时候会卡住按一下方向键上)
  • 在浏览器中输入http://localhost:8500/ui 查看是否安装成功成功如下图所示
  • 在网站启动的时候注册服务,网站停止的时候卸载服务。
  • 服务的注册
    • 先引用consul nuget包
    • 添加配置文件

      {
      ...
        "ServiceDiscovery": {
          "ServiceName": "DataService",
          "Consul": {
            "HttpEndpoint": "http://127.0.0.1:8500",
            "DnsEndpoint": {
              "Address": "127.0.0.1",
              "Port": 8600
            }
          }
        }
      }

       

      public class ServiceDisvoveryOptions
      {
          public string ServiceName { get; set; }
      
          public ConsulOptions Consul { get; set; }
      }
      
      public class ConsulOptions
      {
          public string HttpEndpoint { get; set; }
      
          public DnsEndpoint DnsEndpoint { get; set; }
      }
      
      public class DnsEndpoint
      {
          public string Address { get; set; }
      
          public int Port { get; set; }
      
          public IPEndPoint ToIPEndPoint()
          {
              return new IPEndPoint(IPAddress.Parse(Address), Port);
          }
      }
    • 在网站启动和卸载的时候添加对应注册和卸载事件

         public class Startup
          {
              public Startup(IConfiguration configuration)
              {
                  Configuration = configuration;
              }
      
              public IConfiguration Configuration { get; }
              // This method gets called by the runtime. Use this method to add services to the container.
              public void ConfigureServices(IServiceCollection services)
              {
                  services.AddDbContext<UserContext>(options =>
                  {
                      options.UseMySQL(Configuration.GetConnectionString("MysqlUser"));
                  });
      
                  //从配置文件中获取ServiceDiscovery
                  services.Configure<ServiceDisvoveryOptions>(Configuration.GetSection("ServiceDiscovery"));
                  //单例注册ConsulClient
                  services.AddSingleton<IConsulClient>(p => new ConsulClient(cfg =>
                  {
                      var serviceConfiguration = p.GetRequiredService<IOptions<ServiceDisvoveryOptions>>().Value;
      
                      if (!string.IsNullOrEmpty(serviceConfiguration.Consul.HttpEndpoint))
                      {
                          // if not configured, the client will use the default value "127.0.0.1:8500"
                          cfg.Address = new Uri(serviceConfiguration.Consul.HttpEndpoint);
                      }
                  }));
      
                  services.AddMvc();
                  //添加授权相关代码
                  services.AddAuthentication(options =>
                  {
                      options.DefaultAuthenticateScheme = "Cookies";
                      options.DefaultChallengeScheme = "oidc";
                  })
                .AddCookie("Cookies")
                .AddOpenIdConnect(//配置授权信息相关
                    "oidc", options =>
                    {
                        options.SignInScheme = "Cookies";
                        options.Authority = "http://localhost:52619";//授权地址
                        options.RequireHttpsMetadata = false;//ssl证书
                        options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
                        options.ClientId = "MVC";
                        options.ClientSecret = "Secret";
                        options.SaveTokens = true;
                        // options.GetClaimsFromUserInfoEndpoint = true;//发起另外一个请求~52619/content/userInfo 获取userinfo
                        //options.ClaimActions.MapJsonKey("sub", "sub");
                        //options.ClaimActions.MapJsonKey("preferred_username", "preferred_username");
                        //options.ClaimActions.MapJsonKey("sub", "sub");
                        //options.ClaimActions.MapJsonKey("avatar", "avatar");
                        //options.ClaimActions.MapCustomJson("role", jobject => jobject["role"].ToString());
                        options.Scope.Add("geteway_api");
                        options.Scope.Add("openid");
                        options.Scope.Add("profile");
                        options.Scope.Add("offline_access");
                        //options.Scope.Add("email");
      
                    }
                    );//添加
              }
              // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
              public void Configure(IApplicationBuilder app,
                  IHostingEnvironment env,
                  ILoggerFactory LoggerFactory,
                 IApplicationLifetime lifetime,
                 IConsulClient consulClient,
                 IOptions<ServiceDisvoveryOptions> DisvoveryOptions)
              {
                  if (env.IsDevelopment())
                  {
                      app.UseDeveloperExceptionPage();
                  }
                  app.UseMvc();
                  app.UseAuthentication();
      
                  lifetime.ApplicationStarted.Register(() =>
                  {
                      RegisterService(app, DisvoveryOptions, consulClient);
                  });
                  lifetime.ApplicationStopped.Register(() =>
                  {
                      DeRegisterService(app, DisvoveryOptions, consulClient);
                  });
                  UserContextSeed.SeedAsync(app, LoggerFactory).Wait();
                  //InitUserDataBase(app);//初始化数据库脚本再创建数据库之后取消注释
              }
              //注册服务方法
              private void RegisterService(IApplicationBuilder app,
              IOptions<ServiceDisvoveryOptions> serviceOptions,
              IConsulClient consul)
              {
                  //从当前启动的url中拿到url
                  var features = app.Properties["server.Features"] as FeatureCollection;
                  var addresses = features.Get<IServerAddressesFeature>()
                      .Addresses
                       .Select(p => new Uri(p));
      
                  foreach (var address in addresses)
                  {
                      var serviceId = $"{serviceOptions.Value.ServiceName}_{address.Host}:{address.Port}";
      
                      var httpCheck = new AgentServiceCheck()
                      {
                          DeregisterCriticalServiceAfter = TimeSpan.FromMinutes(1),
                          Interval = TimeSpan.FromSeconds(30),
                          HTTP = new Uri(address, "HealthCheck").OriginalString
                      };
      
                      var registration = new AgentServiceRegistration()
                      {
                          Checks = new[] { httpCheck },
                          Address = address.Host,
                          ID = serviceId,
                          Name = serviceOptions.Value.ServiceName,
                          Port = address.Port
                      };
      
                      consul.Agent.ServiceRegister(registration).GetAwaiter().GetResult();
      
                  }
              }
              //移除方法
              private void DeRegisterService(IApplicationBuilder app,
              IOptions<ServiceDisvoveryOptions> serviceOptions,
              IConsulClient consul)
              {
                  //从当前启动的url中拿到url
                  var features = app.Properties["server.Features"] as FeatureCollection;
                  var addresses = features.Get<IServerAddressesFeature>()
                      .Addresses
                      .Select(p => new Uri(p));
      
                  foreach (var address in addresses)
                  {
                      var serviceId = $"{serviceOptions.Value.ServiceName}_{address.Host}:{address.Port}";
                      consul.Agent.ServiceDeregister(serviceId).GetAwaiter().GetResult();
                  }
              }
      
          }
  • 服务的发现
    • 添加配置文件(这里关键是ServiceName要对上)

      {
      ...
        "ServiceDiscovery": {
          "ServiceName": "DataService",
          "Consul": {
            "HttpEndpoint": "http://127.0.0.1:8500",
            "DnsEndpoint": {
              "Address": "127.0.0.1",
              "Port": 8600
            }
          }
        }
      }
      public class ServiceDisvoveryOptions
      {
          public string ServiceName { get; set; }
      
          public ConsulOptions Consul { get; set; }
      }
      
      public class ConsulOptions
      {
          public string HttpEndpoint { get; set; }
      
          public DnsEndpoint DnsEndpoint { get; set; }
      }
      
      public class DnsEndpoint
      {
          public string Address { get; set; }
      
          public int Port { get; set; }
      
          public IPEndPoint ToIPEndPoint()
          {
              return new IPEndPoint(IPAddress.Parse(Address), Port);
          }
      }
    • 引用dnsClient nuget包并在ConfigureServices方法中注入相应的实例

               //从配置文件中获取ServiceDiscovery
                  services.Configure<ServiceDisvoveryOptions>(Configuration.GetSection("ServiceDiscovery"));
      
                  services.AddSingleton<IDnsQuery>(p =>
                  {
                      var serviceConfig = p.GetRequiredService<IOptions<ServiceDisvoveryOptions>>().Value;//从配置文件中获取consul相关配置信息
                      return new LookupClient(serviceConfig.Consul.DnsEndpoint.ToIPEndPoint());
                  });
    • 根据配置文件信息去consul中获取相应的地址

        private readonly string userServiceUrl = "http://localhost:60907/";
      
              public UserService( IOptions<ServiceDisvoveryOptions> option,IDnsQuery dnsQuery)
              {
      var addrs = dnsQuery.ResolveService("service.consul", option.Value.ServiceName);
                  var addressList = addrs.First().AddressList;
                  var host = addressList.Any() ? addressList.First().ToString() : addrs.First().HostName;
                  var port = addrs.First().Port;
                  userServiceUrl = $"http://{host}:{port}";
              }
    • 参考自大佬文章 http://michaco.net/blog/ServiceDiscoveryAndHealthChecksInAspNetCoreWithConsul?tag=Consul

原文地址:https://www.cnblogs.com/chongyao/p/10437195.html

时间: 2024-07-30 20:36:48

ocelot集成consul服务发现的相关文章

Redola.Rpc 集成 Consul 服务发现

Redola.Rpc 解决了什么问题? Redola.Rpc 是一个使用 C# 开发的 RPC 框架,代码开源在 GitHub 上.目前版本仅支持 .NET Framework 4.6 以上版本,未来待系统稳健后再考虑移植 .NET Standard 和 .NET Core. Redola.Rpc 在 0.3.2 版本中,尝试解决几个 RPC 设计问题: 我是谁?(Local Actor) 如何告诉别人我是谁?(Actor Directory) 我提供什么服务?(Service Catalog

Ocelot 网关 和 consul 服务发现

服务发现 Consul 一.安装和启动 下载 [Consul](https://www.consul.io/downloads.html) 下载完成后,解压,只有一个consul.exe,把目录添加到环境变量的PATH,注意添加到系统变量,仅仅加入用户变量不起作用.打开cmd,输入 consul agen -dev // 启动Consul服务 二.在aspnetcore中注册Consul 1. 定义配置项 /// <summary> /// Consul配置 /// </summary&

一篇文章了解Consul服务发现实现原理

从 2016 年起就开始接触 Consul,使用的主要目的就是做服务发现,后来逐步应用于生产环境,并总结了少许使用经验. 最开始使用 Consul 的人不多,这两年微服务越来越火,使用 Consul 的人也越来越多. 经常有人会问一些问题,比如: 服务注册到节点后,其他节点为什么没有同步? Client 是干什么的?(Client 有什么作用?) 能不能直接注册到 Server?(是否只有 Server 节点就够了?) 服务信息是保存在哪里的? 如果节点挂了,健康检查能不能转移到别的节点? 有些

【.NET Core项目实战-统一认证平台】第十六章 网关篇-Ocelot集成RPC服务

原文:[.NET Core项目实战-统一认证平台]第十六章 网关篇-Ocelot集成RPC服务 [.NET Core项目实战-统一认证平台]开篇及目录索引 一.什么是RPC RPC是"远程调用(Remote Procedure Call)"的一个名称的缩写,并不是任何规范化的协议,也不是大众都认知的协议标准,我们更多时候使用时都是创建的自定义化(例如Socket,Netty)的消息方式进行调用,相比http协议,我们省掉了不少http中无用的消息内容.因此很多系统内部调用仍然采用自定义

基于Docker的Consul服务发现集群搭建

原文:基于Docker的Consul服务发现集群搭建 在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章.本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架构示范,也会更加贴近于实际应用环境. 一.示例整体架构 此示例会由一个API Gateway, 一个Consul Client以及三个Consul Server组成,有关Consul的Client和Server这两种模式的Agent的背景知识,请

Spring Cloud Consul—服务发现与Consul

服务发现是基于微服务架构的关键原则之一.尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱.Consul通过HTTP API和DNS提供服务发现服务.Spring Cloud Consul利用HTTP API进行服务注册和发现.这不会阻止非Spring Cloud应用程序利用DNS界面.Consul代理服务器在通过八卦协议进行通信的集群中运行,并使用Raft协议协议. 如何激活 要激活Consul服务发现,请使用组org.springframework.cloud和artifact i

.NET Core微服务实施之Consul服务发现与治理

原文:.NET Core微服务实施之Consul服务发现与治理 Consul官网:https://www.consul.io Consul下载地址:https://www.consul.io/downloads.html Consul nuget 命令:Install-Package Consul 我的理解是,Consul是一个服务管理者,系统中所有使用到的服务他都帮你管理好,促销高峰需要新增服务的时候,服务开启来就自动注册到Consul中,服务下线关闭,也自动从Consul注销,无缝衔接,对于

.NET CORE2.2 下 Ocelot+Consul服务发现踩坑记录

历史原因,笔者所在公司的项目目前还在使用 .NET CORE 2.2版本,在所有业务应用升级完成服务注册发现之后,最后剩下 Ocelot 网关服务升级.在升级过程中,遇到一些问题,记录此文,以便有相同情况的同学参考. 1. Ocelot 升级服务发现 根据官方文档 ,通过简单的添加配置,既可以将原有配置方式改为服务发现: 安装插件 Install-Package Ocelot.Provider.Consul 13.5.2,.Net Core 2.x 最后一个版本 配置服务 s.AddOcelot

安装-consul服务发现集群

centos 7.4.x consul  1.2.2 list: 172.16.16.103 172.16.16.112 172.16.16.115 下载: #cd /usr/local/ #wget  https://releases.hashicorp.com/consul/1.2.2/consul_1.2.2_linux_amd64.zip #tar zxvf xxxxxx.zip #第一台启动 #nohup ./consul agent -bind=172.16.16.112 -serv