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
- 添加配置文件(这里关键是ServiceName要对上)
ocelot集成consul服务发现的更多相关文章
- Redola.Rpc 集成 Consul 服务发现
Redola.Rpc 解决了什么问题? Redola.Rpc 是一个使用 C# 开发的 RPC 框架,代码开源在 GitHub 上.目前版本仅支持 .NET Framework 4.6 以上版本,未来 ...
- Ocelot 网关 和 consul 服务发现
服务发现 Consul 一.安装和启动 下载 [Consul](https://www.consul.io/downloads.html) 下载完成后,解压,只有一个consul.exe,把目录添加到 ...
- 微服务(入门三):netcore ocelot api网关结合consul服务发现
简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...
- 基于Docker的Consul服务发现集群搭建
在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章.本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架 ...
- .NET Core微服务实施之Consul服务发现与治理
.NET Core微服务实施之Consul服务发现与治理 Consul官网:https://www.consul.io Consul下载地址:https://www.consul.io/downl ...
- .NetCore Cap 注册 Consul 服务发现
注册服务发现 需要使用Cap中的UseDiscovery方法 具体用法如下 var capConsulConfig = Configuration.GetSection("CapConsul ...
- 扩展gRPC支持consul服务发现和Polly策略
gRPC由于需要用工具生成代码实现,可开发性不是很高,在扩展这方面不是很友好 最近研究了下,进行了扩展,不需要额外的工具生成,直接使用默认Grpc.Tools生成的代理类即可 相关源码在文章底部 客户 ...
- 学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片
目录 第一部分:Consul 基础 1,Consul 介绍 2,安装 Consul Ubuntu/Debian 系统 Centos/RHEL 系统 检查安装 3,运行 Consul Agent 启动 ...
- .Net Core微服务——网关(2):ocelot集成consul
有consul基础的都知道,consul可以发现新增的服务,剔除掉无效的服务,赋予应用自动伸缩的能力.而ocelot如果集成了consul,那ocelot也能拥有这些能力,还可以自主选择负载均衡策略, ...
随机推荐
- MYSQL数据库事务4种隔离级别及7种传播行为
事务的特性: 原子性:事务的不可分割,组成事务的各个逻辑单元不可分割. 一致性:事务执行的前后,数据完整性保持一致. 隔离性:事务执行不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数 ...
- d3 词云使用
D3-Cloud是一个开源的词云实现,基于D3.js,使用HTML5 Canvas绘制输出,因为采用异步的方式处理,所以表现性能良好. 项目主页:https://www.jasondavies.com ...
- 我在做评论功能时学到的js一些思路
在提交评论的时候,如何判断是一级评论还是二级评论(因为都是通过一个文本域提交评论),思路:声明一个全局变量,如果是回复(二级评论)那么会触发点击回复事件,在这个事件的回调函数里给全局变量设置为true ...
- (转)window.parent和window.opener区别
下面一段代码是关于window.parent和window.opener区别 来讲的,我们如果要用到iframe的值传到另一框架就要用到window.opener.document.getElemen ...
- hdu_1712(dp,背包)
hdu_1712 \[dp[i][j]\] 表示前i个物品用了j天得到的最大收益 \[ dp[i][j] = max(dp[i-1][j],dp[i][j-k]+ k*v[i][k]) \qquad ...
- crontab 常见 /dev/null 2>&1 详解
大部分在 crontab 计划任务中都会年到未尾带 >/dev/null 2>&1,是什么意思呢? > 是重定向 /dev/null 代表空设备文件 1 表示stdout标准 ...
- 原生Js_实现简单的下拉折叠菜单(添加弹出动画效果)
用javascript实现简单的下拉折叠菜单效果 实现步骤 (a)获得各操作的dom对象: (b)在所有菜单按钮对象上添加单击事件: (c)设置所有菜单按钮样式为空,并将当前按钮的样式设置为“acti ...
- C++入门经典-例5.13-内存安全,被销毁的内存
1:当指针所指向的内存被销毁时,该区域不可复用.若有指针指向该区域,则需要将该指针置为空值(NULL)或者指向未被销毁的内存. 内存销毁实质上是系统判定该内存不是变成人员正常使用的空间,系统也回将它们 ...
- python3笔记十九:os和ospath模块
一:学习内容 os模块 ospath模块 获取指定目录下所有文件和目录 二:os模块 包含了普遍的操作系统功能,需要导入该模块:import os 当前所在位置目录结构为: 目录操作 1.获取当前目录 ...
- Vue.js---配置开发环境
首先安装Node.js我就不介绍了! win+r , 输入cmd,回车: 1.安装淘宝镜像 在国内直接使用npm的官方镜像是比较慢的,这里我们采用的是淘宝镜像 npm install -g cnpm ...