• 首先下载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

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

  1. Redola.Rpc 集成 Consul 服务发现

    Redola.Rpc 解决了什么问题? Redola.Rpc 是一个使用 C# 开发的 RPC 框架,代码开源在 GitHub 上.目前版本仅支持 .NET Framework 4.6 以上版本,未来 ...

  2. Ocelot 网关 和 consul 服务发现

    服务发现 Consul 一.安装和启动 下载 [Consul](https://www.consul.io/downloads.html) 下载完成后,解压,只有一个consul.exe,把目录添加到 ...

  3. 微服务(入门三):netcore ocelot api网关结合consul服务发现

    简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...

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

    在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章.本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架 ...

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

    .NET Core微服务实施之Consul服务发现与治理   Consul官网:https://www.consul.io Consul下载地址:https://www.consul.io/downl ...

  6. .NetCore Cap 注册 Consul 服务发现

    注册服务发现 需要使用Cap中的UseDiscovery方法 具体用法如下 var capConsulConfig = Configuration.GetSection("CapConsul ...

  7. 扩展gRPC支持consul服务发现和Polly策略

    gRPC由于需要用工具生成代码实现,可开发性不是很高,在扩展这方面不是很友好 最近研究了下,进行了扩展,不需要额外的工具生成,直接使用默认Grpc.Tools生成的代理类即可 相关源码在文章底部 客户 ...

  8. 学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片

    目录 第一部分:Consul 基础 1,Consul 介绍 2,安装 Consul Ubuntu/Debian 系统 Centos/RHEL 系统 检查安装 3,运行 Consul Agent 启动 ...

  9. .Net Core微服务——网关(2):ocelot集成consul

    有consul基础的都知道,consul可以发现新增的服务,剔除掉无效的服务,赋予应用自动伸缩的能力.而ocelot如果集成了consul,那ocelot也能拥有这些能力,还可以自主选择负载均衡策略, ...

随机推荐

  1. python fc21~fc29踩坑记录

    最近在公司的linux fc21上安装python和anaconda, 直接mintmenu给挂掉了. 真是弱爆了. 后来,升级终于来了, 升到了fc29.好,再看看, python2.7还在, py ...

  2. split 命令

    最近下游一直说我供给的文件存在乱码,下游定位到了具体哪一条. 一个250w的数据量,有一条数据有问题.几百兆的文件用note去搜索. 我使用用notepad++后,发现根本打不开. 于是只能先拆分后用 ...

  3. 【C#-读取XML文件】XMLReader读取XML文档

    使用   XmlReader.Create("文件路径")   加载xml文件 XmlReader使用流的方式来读取. //使用XMLReader读取XML数据 XmlReader ...

  4. win10 1903 更改文字大小

    标题栏 - 菜单 - 消息框 - 调色板标题11- 图标 - 工具提示 - Caption 标题 的 宽/高 - ; 14的宽高 - 菜单 的 宽/高 - ; 的宽高 -; 设置 注册表 HKEY_C ...

  5. json代码——json序列化,json-parse,JSONstringify格式化输出,虚拟DOM

    JS对象转为类似json的字符串,对象->字符串叫序列化,字符串->对象      是反序列化 ㈠json序列化 <script> var shy = new Object() ...

  6. 在linux安装php

    去www.php.net找下载最新的版本 http://www.php.net/downloads.php 下载解压 # wget  http://cn2.php.net/distributions/ ...

  7. php上传大文件1G

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  8. TTTTTTTTTTTT CF 653D 送邮递员

    链接:给一张n个点m条带权边的有向图,有x个人从起点出发到终点,每个人带的都带相同重量的货物, 规定一条边最多能经过其上权的重量的货物,问最多能带多重的货物? 2 ≤ n ≤ 50, 1 ≤ m ≤  ...

  9. sessionStorge和localStorage的使用-踩坑记_09

    sessionStorge的使用 sessionStorage 属性允许你访问一个 session Storage 对象.它与 localStorage 相似,不同之处在于 localStorage ...

  10. java代码如何在没有安装JDK的Windows下运行

    java代码如何在没有安装JDK的Windows下运行? 对于Java桌面应用来说,比较烦琐的就是安装部署问题,如:客户端是否安装有jre.jre版本.jre在哪里下载.如何用jre启动Java应用等 ...