关于这个工具的介绍这里就不多说了,网上、官网都很详细,这里直接记录一下搭建过程。另外最后有几个疑惑还未解决,希望各位前辈答疑解惑。

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 实现服务发现、服务自动注册的更多相关文章

  1. 在Windows环境中使用Nginx, Consul, Consul Template搭建负载均衡和服务发现服务

    搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...

  2. Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务

    本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...

  3. zabbix3.4.6之自动发现与自动注册

    在zabbix中添加新主机时,是需要手动添加,但在zabbix的Action里有两项功能,自动发现与自动注册,运用这两个功能中任意一个都可以实现自动添加机器,但添加的主机名是IP地址. 自动发现:添加 ...

  4. zabbix自动发现与自动注册、自定义监控

    一.自动发现与自动注册在上面的介绍中,我们演示了手动添加一台主机的方法,虽然简单,但是当要添加的主机非常多时,也将变得非常繁琐,那么有没有一种方法,可以实现主机的批量添加呢,这样就会极大的提高运维效率 ...

  5. zabbix自动发现与自动注册及SNMP监控

    自动发现与自动注册 自动发现:zabbix Server主动发现所有客户端,然后将客户端登记自己的小本本上,缺点zabbix server压力山大(网段大,客户端多),时间消耗多. 自动注册:zabb ...

  6. Zabbix自动发现与自动注册.

    一, 自动发现与自动注册 自动发现? 当场景中出现要添加很多台主机的时候,一台台添加难免太过于繁琐,zabbix提供自动注册,自动发现,可以实现主机的批量添加, zabbix的发现包括三种类型: # ...

  7. zabbix自动发现及其自动注册

    在大企业环境中,不可能在zabbix页面上逐个添加被监控的主机.还好zabbix自带自动发现和自动注册功能 被监控端安装zabbix客户端之后,将配置文件配置指向服务器端ip即可.红色箭头改为zabb ...

  8. Zabbix--05 Grafana、percona、自动发现和自动注册

    目录 一. Grafana自定义图形 1.安装grafana 2.安装并激活zabbix插件 3.数据展示 4.自定义图形仪表盘 5.自定义图形饼图 二. percona模版监控mysql 1.安装p ...

  9. .net core consul 服务配置 服务发现 服务健康检测 服务变更加载

    准备环境 安装consul之后 1. 创建一个.net core webapi 举例为UsercenterService 2. nuget引用Consul组件  https://github.com/ ...

随机推荐

  1. 【JVM虚拟机】(6)---深入理解Class中访问标志、类索引、父类索引、接口索引

    JVM(6)访问标志,类索引 上一篇博客讲[JVM虚拟机](5)---深入理解JVM-Class中常量池 我们知道一个class文件正常可以分为7个部分: 魔数与class文件版本 常量池 访问标志 ...

  2. 《前端之路》之 webpack 4.0+ 的应用构建

    目录 一.版本 二.webpack 的主体概念 2-1.入口 2-1-1.单页面入口 2-1-2.多页面应用的入口 2-2.输出 2-3.loader 2-4.plugins 三.如何使用 3-1 关 ...

  3. SpringBoot框架与MyBatis集成,连接Mysql数据库

    SpringBoot是一种用来简化新Spring应用初始搭建及开发过程的框架,它使用特定方式来进行配置,使得开发人员不再需要定义样板化的配置.MyBatis是一个支持普通SQL查询.存储和高级映射的持 ...

  4. Named Volume 在 MySQL 数据持久化上的基本应用

    原文作者:春哥 初识春哥时,春哥是美术设计大咖.后不久,创业并致力于游戏开发,已有3年.从Unity3D到IOS(Swift)开发,从前端开发到后端以及容器技术,从设计开发测试到产品经理以及CEO,已 ...

  5. C# 添加Excel表单控件(Form Controls)

    在Excel中,添加的控件可以和单元格关联,我们可以操作控件来修改单元格的内容,在下面的文章中,将介绍在Excel中添加几种不同的表单控件的方法,包括: 添加文本框(Textbox) 单选按钮(Rad ...

  6. java中如何从一行数据中读取数据

    目录 @(如何从一行数据中切割数据) 例如我要从一行学生信息中分割出学号.姓名.年龄.学历等等 ==主要使用split方法,split方法在API中定义如下:== public String[] sp ...

  7. vtigercrm特色功能介绍

    1.邮件跟踪 市场营销活动中,我们给客户发出了大量的电子邮件,这些邮件被客户阅读的情况你了解吗?vtiger CRM中独特的邮件跟踪功能,可以让你了解到邮件是否被客户浏览.浏览的次数和时间.通过客户的 ...

  8. Android 6.0 默认关闭定位和GPS,开启后默认选省电

    默认关闭定位和GPS 修改位置 frameworks/base/packages/SettingsProvider/res/values/defaults.xml <string name=&q ...

  9. PIC单片机基础2

    PIC中档系列单片机,每条指令14位,共有35条汇编指令,根据操作对象不同,可将其分为三类: 字节操作类指令 位操作类指令 立即数与控制类操作指令 1.字节操作类指令,以MOVF指令为例: 指令:MO ...

  10. Windows Server 2016-批量新建域用户(二)

    前几个章节我们讲到Windows Server 2016-图形化新建域用户(一),本章节我们简单讲解下如何通过命令批量创建域用户,以便高效完成日常工作中实际批量创建用户需求,内容涉及dsadd use ...