简介

  .net core使用ocelot---第一篇 简单使用  
  .net core使用ocelot---第二篇 身份验证使用 
  .net core使用ocelot---第三篇 日志记录 
  .net core使用ocelot---第四篇 限流熔断 
  .net core使用ocelot---第五篇 服务质量 
  .net core使用ocelot---第六篇 负载均衡 
  .net core使用ocelot---第七篇 服务发现

本文我们介绍Ocelot使用consul实现服务发现。

我将使用Ocelot的13.5.2版本向您展示此功能。

Step1

启动Consul

在本次演示,我将使用Docker运行consul的实例。(你也可以自己安装consul,不需要docker)

   docker run -p 8500:8500 consul

   启动后,我们会看到下面的结果。

Step2

新建一个在consul注册了的API服务。

为了演示,我将创建两个Web API项目,它们端口不一样但服务名一样。

    编写控制器的代码如下:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
var port = Request.Host.Port; return new string[] { "value1", "value2", port.Value.ToString() };
}
}

  接下来将它注册到consul,下面的代码,打个样。

public static class AppExtensions
{
public static IServiceCollection AddConsulConfig(this IServiceCollection services, IConfiguration configuration)
{
services.AddSingleton<IConsulClient, ConsulClient>(p => new ConsulClient(consulConfig =>
{
var address = configuration.GetValue<string>("Consul:Host");
consulConfig.Address = new Uri(address);
}));
return services;
} public static IApplicationBuilder UseConsul(this IApplicationBuilder app)
{
var consulClient = app.ApplicationServices.GetRequiredService<IConsulClient>();
var logger = app.ApplicationServices.GetRequiredService<ILoggerFactory>().CreateLogger("AppExtensions");
var lifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>(); if (!(app.Properties["server.Features"] is FeatureCollection features)) return app; var addresses = features.Get<IServerAddressesFeature>();
var address = addresses.Addresses.First(); Console.WriteLine($"address={address}"); var uri = new Uri(address);
var registration = new AgentServiceRegistration()
{
ID = $"MyService-{uri.Port}",
// servie name
Name = "MyService",
Address = $"{uri.Host}",
Port = uri.Port
}; logger.LogInformation("Registering with Consul");
consulClient.Agent.ServiceDeregister(registration.ID).ConfigureAwait(true);
consulClient.Agent.ServiceRegister(registration).ConfigureAwait(true); lifetime.ApplicationStopping.Register(() =>
{
logger.LogInformation("Unregistering from Consul");
consulClient.Agent.ServiceDeregister(registration.ID).ConfigureAwait(true);
}); return app;
}
}

  我们还得修改Startup.cs以便可注册。

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
services.AddConsulConfig(Configuration);
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseConsul(); app.UseMvc();
}
}

  当我们启动我们的项目,会在Consul发现名为MyServices的实例,它包括两个节点。

  为了看看新服务的具体细节,点开MyService,我们会看到两个节点的具体信息。

  接下来创建APIGateway

Step3

通过.NET Core CLI 添加下面的包

dotnet add package Ocelot --version 13.5.
dotnet add package Ocelot.Provider.Consul --version 13.5.

  新建ocelot.json,内容如下。

{
"ReRoutes": [
{
"UseServiceDiscovery": true,
"DownstreamPathTemplate": "/{url}",
"DownstreamScheme": "http",
"ServiceName": "MyService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"UpstreamPathTemplate": "/{url}",
"UpstreamHttpMethod": [ "Get" ],
"ReRoutesCaseSensitive": false
}
],
"GlobalConfiguration": {
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": ,
"Type":"PollConsul",
"PollingInterval":
}
}
}

  使用服务发现我们在GlobalConfiguration中添加ServiceDiscoveryProvider节点。

名称

描述

Host

表明Consul的主机

Port

指明Consul的端口

Type

1. Consul, 意味每次请求Ocelot会从consul获得服务信息。

2. PollConsul, 意味着Ocelot将向Consul推荐最新的服务信息

PollingInterval

告诉Ocelot多长时间调用Consul来更改服务配置

  在这里,ReRoute依然很重要。因为它告诉Ocelot,当发出请求时我们希望使用的服务名称和负载均衡器。 如果未指定负载均衡器,则Ocelot将不会对请求进行负载均衡。

  设置此选项后,Ocelot将从服务中查找下游主机和端口,发现提供程序,并查找任何可用服务的负载均衡请求。

  最后,我们需要在program.cs 中配置Ocelot。

public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://*:9000")
.ConfigureAppConfiguration((hostingContext, config) =>
{
config
.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("ocelot.json")
.AddEnvironmentVariables();
})
.ConfigureServices(services =>
{
services.AddOcelot()
.AddConsul();
})
.Configure(app =>
{
app.UseOcelot().Wait();
});
}

  启动APIGateway,访问http://localhost:9000/api/values.

  看一下打印的日志。请求的详细信息都在控制台显示。

  源码在此

  网盘链接:https://pan.baidu.com/s/17sqfGcYx8yEHRL_LwKAUlA
  提取码:p3d0

总结

在这篇文章中我们学习了ocelot使用consul实现服务发现简单的例子。完结!!!!

最新文章

  1. 从Undo,Redo谈命令模式
  2. (BFS)uva2554-Snakes &amp; Ladders
  3. 使用css3中calc()进行自适应布局
  4. 我在用的mac软件(2)-终端环境之zsh和z(*nix都适用)
  5. Extjs-4.2.1(二)——使用Ext.define自定义类
  6. 一个简单的TestNG例子
  7. smarty 变量调节器
  8. iKcamp出品|微信小程序|工具安装+目录说明|基于最新版1.0开发者工具初中级教程分享
  9. 在为知笔记中使用Markdown和思维导图
  10. UVA753:A Plug for UNIX
  11. 网站SEO优化问答精选
  12. C语言--第1次作业
  13. Microsoft Teams 集成 (协作, 沟通 和 行为)
  14. Eclipse引入spring约束详细教程
  15. C语言stat()函数:获取文件状态
  16. window.open被拦截
  17. Android应用安全防护和逆向分析 ——apk反编译
  18. 大素数判断(miller-Rabin测试)
  19. Fruit Feast(暴力)(动态规划)
  20. Microsoft.Baidu.Ali.语音识别/人脸识别

热门文章

  1. Fiddler如何查找登陆的可用cookie用于其他请求?方式一
  2. K8S从入门到放弃
  3. 利用chocolate包管理工具安装helm
  4. Alpha3
  5. 在python中使用elasticsearch 需要注意的一些问题
  6. 为什么用ls和du显示出来的文件大小有差别?【转】
  7. sqlite3 读写锁
  8. (转)python3:类方法,静态方法和实例方法以及应用场景
  9. Xcode UI界面调试神器-injectionIII
  10. 【环境搭建与软件安装】How to install CUDNN or uninstall