.net core使用ocelot---第八篇 Consul
简介
.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实现服务发现简单的例子。完结!!!!
.net core使用ocelot---第八篇 Consul的更多相关文章
- .NET Core资料精选:架构篇
.NET 6.0 马上就要发布,高性能云原生开发框架.希望有更多的小伙伴加入大.NET阵营.这是本系列的第三篇文章:架构篇,喜欢的园友速度学起来啊. 本系列文章,主要分享一些.NET Core比较优秀 ...
- 【译】SQL Server索引进阶第八篇:唯一索引
原文:[译]SQL Server索引进阶第八篇:唯一索引 索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就 ...
- 解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)
解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译) http://improve.dk/orcamdf-now-supports-databases-with-mult ...
- Python之路【第十八篇】:Web框架们
Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- 第八篇 Replication:合并复制-How it works
本篇文章是SQL Server Replication系列的第八篇,详细内容请参考原文. 在这一系列的前几篇你已经学习了如何在多服务器环境中配置合并复制.这一篇将介绍合并代理并解释它在复制过程中扮演的 ...
- 第八篇 Integration Services:高级工作流管理
本篇文章是Integration Services系列的第八篇,详细内容请参考原文. 简介在前面两篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcu ...
- 第八篇 SQL Server安全数据加密
本篇文章是SQL Server安全系列的第八篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...
- 第八篇 SQL Server代理使用外部程序
本篇文章是SQL Server代理系列的第八篇,详细内容请参考原文 在这一系列的上一篇,学习了如何用SQL Server代理作业活动监视器监控作业活动和查看作业历史记录.在实时监控和管理SQL Ser ...
随机推荐
- 【python】学习笔记之遇到的坑print输出报错
在Python3.x中,使用print时出错(SyntaxError: Missing parentheses in call to 'print')解决办法 Python2到Python3,很多基本 ...
- 算法练习题---罗马数字转int
连接:https://leetcode-cn.com/problems/roman-to-integer/submissions/ 题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 ...
- socket http tcp ip 区别联系
功能是实现继承复用.刚才做了一个简要的概述,里面有一些常用的概念,这里做个简短的概念普及介绍:(1),TCP/IP------TPC/IP协议是传输层协议,主要解决数据如何在网络中传输.(2),Soc ...
- 第09组 Beta冲刺(3/4)
队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...
- 剑指offer:链表中环的入口结点
题目描述: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路分析: 这道题首先需要判断链表是否存在环,很快就能想到用快慢指针来判断. 由于快慢指针的相遇位置并不一定为链 ...
- vue+elementui搭建后台管理界面(6登录和菜单权限控制)
不同的权限对应不同的路由(菜单),同时侧边栏也根据权限异步生成,实现登录和鉴权思路如下: 登录:点击登录,服务器验证通过后返回一个 token ,然后存到 cookie,再根据 token 拉取用户权 ...
- vs2015编译OBS-Studio
编译之前的准备: 系统win10 QT5.7.0 VS2015 CMake 3.13.4 obs vs2015环境依赖包:dependencies2015 obs-studio 24.0 ====== ...
- rabbitmq - 消息接收,解析xml格式数据时异常:ERROR not well-formed (invalid token): line 4, column 46
ERROR alsv odoo.addons.cus_alsv.utils.alsv_about_mq.get_data_from_mq: parse_xml_data_from_mq: not we ...
- sudo passwd root:没有相关指令
在linux里如果想要修改密码,就输入这个指令,但是会出现没找到这个指令,是因为环境变量里没有passwd. 解决:查找passwd的位置,sudo find / -name passwd 然后进入p ...
- vue 框架安装系列问题
npm install --global vue-cli 错误提示:vue-cli-service' 不是内部或外部命令,也不是可运行的程序或批处理文件解决:如果是npm安装的 执行 npm -g b ...