Ocelot + Consul + Registrator 基于Docker 实现服务发现、服务自动注册
关于这个工具的介绍这里就不多说了,网上、官网都很详细,这里直接记录一下搭建过程。另外最后有几个疑惑还未解决,希望各位前辈答疑解惑。
1. Consul集群搭建
我们基于Docker搭建三个Server和两个Client的DC。
- server1
docker run -d --name server1 consul agent -server -node=server1 -bootstrap-expect=3
# 获取server1IP地址,方便后续节点接入集群
JOIN_IP="$(sudo docker inspect -f '{{.NetworkSettings.IPAddress}}' server1)"
- server2
docker run -d --name server2 consul agent -server -node=server2 -join $JOIN_IP
- server3
docker run -d --name server3 consul agent -server -node=server3 -join $JOIN_IP
- client1
docker run -d --name client1 consul agent -node=client1 -join $JOIN_IP
- client2
docker run -d --name client2 -p 8400:8400 -p 8500:8500 -p 8600:53/udp consul agent -ui -node=client2 -client=0.0.0.0 -join $JOIN_IP
运行效果:

1.1 F&Q
Consul官方推荐的host网络模式运行
查看Consul官方文档,官方推荐Consul以Docker的host网络模式运行。但是这样的话,一个Docker寄宿主机只运行一个consul agent?生产中的Docker集群是如何搭建的?
2. Registrator服务注册工具
启动Registrator工具容器,Registrator使用主机网络模式,使用-internal选项,注册基于expose端口的服务。
docker run -d --name registrator --net host --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator -internal consul://172.17.0.6:8500
Consul管理UI服务截图,Registrator会把Consul也作为服务注册到Consul。这也是可以理解的,因为Registrator的观点是任何监听在端口的程序都是服务。

2.1 F&Q
Registrator悬挂服务
正常情况下,这里应该是没有clientservice的,但是由于我之前测试没有正常按顺序启停容器,形成了悬挂服务,一直没有清除。我看Registrator文档中有
-cleanup选项可以清理悬挂服务,后续尝试一下。
Registrator的-internal选项
不指定这个选项时,Registrator使用容器的发布端口(映射到寄宿主机的端口)自动注册服务,这时候一般要用
-ip选项指定主机的IP地址,因为Registrator一般很难推断出主机的IP地址。当使用-internal选项时,Registrator使用服务所在容器分配的内部地址自动注册服务。
3. clientservice服务Demo
clientservice是一个web api项目,由于是自动服务发现和注册,因此clientservice跟无需做特别的配置。
我仅仅指定服务的端口为5000,修改了ValueController,返回服务调用情况。
3.1 Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://*:5000")
.UseStartup<Startup>();
}
3.2 ValuesController.cs
...
[HttpGet]
public ActionResult<RequestInfo> Get()
{
var clientHost = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
var serverHost = HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString();
var path = HttpContext.Request.Path;
return new RequestInfo{
RemoteIp = clientHost,
RemotePort = HttpContext.Connection.RemotePort,
LocalIp = serverHost,
LocalPort = HttpContext.Connection.LocalPort,
Path = path,
Host = HttpContext.Request.Host.ToUriComponent()
};
}
...
3.3 Dockerfile
#基于microsoft/dotnet:latest构建Docker image
FROM microsoft/dotnet:latest
#进入docker中的/usr/local/src目录,创建DockerWebAPI目录
RUN cd /usr/local/src&&mkdir DockerWebAPI
#设置工作路径
WORKDIR /usr/local/src/DockerWebAPI
#将当前文件夹下的所有文件全部复制到工作目录
COPY ./ ./
#向外界暴露5000端口
EXPOSE 5000
#执行dotnet *.dll命令
CMD ["dotnet","clientservice.dll"]
3.4 制作镜像并启动容器
- 制作镜像
docker build -t zhangdk/clientservice .
- 启动容器
docker run -d zhangdk/clientservice
Consul管理UI截图,如果你是第一次搭建集群并启动Clientservice的话,后面应该有小标1。我这里由于悬挂服务的问题,有启动前的1现在变成了2。

clientservice注册信息(多余的是悬挂服务的注册信息),要注意查看ServiceAddress和ServicePort是否正确:

4. Ocelot网关Demo
VS Code创建空web项目dotnet new web,安装ocelot库dot add package ocelot,主要修改三个文件:
4.1 Program.cs:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseUrls("http://*:5010") //服务监听在5010端口,后期可以调整为从外部读取,方便配置
.ConfigureAppConfiguration((context,builder)=>{
builder.AddJsonFile("configuration.json",false,true); //读取Ocelot配置文件
});
}
4.2 Startup.cs:
public class Startup
{
public Startup(IConfiguration configuration){
Configuration = configuration;
}
public IConfiguration Configuration{get;set;}
public void ConfigureServices(IServiceCollection services) => services.AddOcelot(Configuration); //注册Ocelot服务
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseOcelot().Wait(); //启用Ocelot中间件
}
}
4.3 添加配置文件configuration.json:
{
"ReRoutes": [
{
"UseServiceDiscovery": true, //启用服务发现
"DownstreamPathTemplate": "/api/{url}",
"DownstreamScheme": "http",
"ServiceName": "clientservice",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"UpstreamPathTemplate": "/api/clientservice/{url}",
"UpstreamHttpMethod": [ "Get", "Post" ],
"ReRoutesCaseSensitive": false
}
],
"GlobalConfiguration": {
"ServiceDiscoveryProvider": {
"Host": "172.17.0.6", //Consul client IP
"Port": 8500 //Consul HTTP API端口
}
}
}
4.4 Dockerfile文件编写
#基于microsoft/dotnet:latest构建Docker image
FROM microsoft/dotnet:latest
#进入docker中的/usr/local/src目录,创建DockerWebAPI目录
RUN cd /usr/local/src&&mkdir DockerWebAPI
#设置工作路径
WORKDIR /usr/local/src/DockerWebAPI
#将当前文件夹下的所有文件全部复制到工作目录
COPY ./ ./
#向外界暴露5010端口
EXPOSE 5010
#执行dotnet *.dll命令
CMD ["dotnet","oceletgateway.dll"]
4.5 发布项目,制作镜像,并启动容器
- 发布项目
dotnet publish
- 拷贝Dockfile到Demo的publish文件夹,打开终端
docker build -t zhangdk/ocelotgateway .
- 运行OcelotGateway服务容器
docker run -d --name=ocelotgateway zhangdk/ocelotgateway
通过Ocelot网关服务访问clientservice

直接访问clientservice

4.6 F&Q
Ocelot服务发现地址怎么配置
刚开始的我以为应该配置Leader server的地址,但是由于leader server的端口并没有暴露,因此容器间无法访问。尝试使用client的地址,发现也是可以成功的。
Ocelot的服务发现地址配置
Consul在集群模式运行时,单个server或者client agent节点挂掉后仍然可以通过投票等协议正常运行。但是,Ocelot网关服务中配置了唯一的一个agent地址,那岂不是意味着这个节点挂掉后,Ocelot网关服务就和Consul集群的服务发现就失去了联系,那这里的Consul集群有什么意义?
5 总结
初步按照自己的思路搭建起来的服务发现,自动注册的架构,后续会继续完善权限验证、负载均衡等网关的其他功能。搭建的过程中也有许多困惑还没有想明白,后续边想边做。微服务这一块也是刚刚接触,有什么问题或错误,还希望各位前辈指正。
Ocelot + Consul + Registrator 基于Docker 实现服务发现、服务自动注册的更多相关文章
- 在Windows环境中使用Nginx, Consul, Consul Template搭建负载均衡和服务发现服务
搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...
- Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...
- zabbix3.4.6之自动发现与自动注册
在zabbix中添加新主机时,是需要手动添加,但在zabbix的Action里有两项功能,自动发现与自动注册,运用这两个功能中任意一个都可以实现自动添加机器,但添加的主机名是IP地址. 自动发现:添加 ...
- zabbix自动发现与自动注册、自定义监控
一.自动发现与自动注册在上面的介绍中,我们演示了手动添加一台主机的方法,虽然简单,但是当要添加的主机非常多时,也将变得非常繁琐,那么有没有一种方法,可以实现主机的批量添加呢,这样就会极大的提高运维效率 ...
- zabbix自动发现与自动注册及SNMP监控
自动发现与自动注册 自动发现:zabbix Server主动发现所有客户端,然后将客户端登记自己的小本本上,缺点zabbix server压力山大(网段大,客户端多),时间消耗多. 自动注册:zabb ...
- Zabbix自动发现与自动注册.
一, 自动发现与自动注册 自动发现? 当场景中出现要添加很多台主机的时候,一台台添加难免太过于繁琐,zabbix提供自动注册,自动发现,可以实现主机的批量添加, zabbix的发现包括三种类型: # ...
- zabbix自动发现及其自动注册
在大企业环境中,不可能在zabbix页面上逐个添加被监控的主机.还好zabbix自带自动发现和自动注册功能 被监控端安装zabbix客户端之后,将配置文件配置指向服务器端ip即可.红色箭头改为zabb ...
- Zabbix--05 Grafana、percona、自动发现和自动注册
目录 一. Grafana自定义图形 1.安装grafana 2.安装并激活zabbix插件 3.数据展示 4.自定义图形仪表盘 5.自定义图形饼图 二. percona模版监控mysql 1.安装p ...
- .net core consul 服务配置 服务发现 服务健康检测 服务变更加载
准备环境 安装consul之后 1. 创建一个.net core webapi 举例为UsercenterService 2. nuget引用Consul组件 https://github.com/ ...
随机推荐
- Hyperledger Fabric、Corda和以太坊对比
Hyperledger Fabric . Corda 和以太坊的对比 三种不同的框架 我们从 Hyperledger Fabric.R3 Corda和以太坊的白皮书中可以看到,三种框架在可能的应用领 ...
- python——对图像进行卷积操作,使用多个滤波器
线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果.做法很简单.首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像.然后,对于图像的 ...
- .NETCore 基于 dbfirst 体验快速开发项目
简介 今天出场是进化了多年的生成器工具,根据数据库结构(表.视图.存储过程.外键.各种类型.备注)快速生成一个项目,并自带后台管理系统.篇幅有限本文只讲解快速开发的使用过程,具体开发中的细节日后有空再 ...
- Error RZ3007: Targeted tag name cannot be null or whitespace
Step 1: Disable precompile updating below property in csproj file: <MvcRazorCompileOnPublish>f ...
- 《k8s-1.13版本源码分析》-调度器初始化
源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...
- windows下,读取快捷方式lnk所指向的路径
BOOL GetLnkFileName( OUT PWSTR pLnkName, OUT PWSTR OepnFileNameBuufer, IN DWORD OpenFileNameBufferSi ...
- 【php性能优化】关于写入文件操作的取舍方案
对于使用php对文件进行写入操作有两种方案一种使用 file_put_contents() 和 fopen()/fwrite()/fclose() 两种方案至于应该怎么选,我觉得应该分情况选择,下面是 ...
- js数组中的find(), findIndex(), filter(), forEach(), some(), every(), map(), reduce()方法的详解和应用实例
1. find()与findIndex() find()方法,用于找出第一个符合条件的数组成员.它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该 ...
- 供应链管理为什么要上企业自主可控的免费开源ERP Odoo
引言 今天的很多企业,无论是制造业,还是商贸行业,如果说没有针对供应链管理的信息系统,那可能是真的冤枉他们了:采购.仓存.销售.存货核算这些模块,早早的买来,早早的用上了,但也早早的被下了结论:食之无 ...
- LNMP shell
#!/bin/bash #set -x #date: 2018-12-13 #Description: 一键安装LNMP环境 or LAMP 环境 #Version: 0.4 #Author: sim ...