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

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. Java核心技术梳理-集合

    一.前言 在日常开发中,我们经常会碰到需要在运行时才知道对象个数的情况,这种情况不能使用数组,因为数组是固定数量的,这个时候我们就会使用集合,因为集合可以存储数量不确定的对象. 集合类是特别有用的工具 ...

  2. Base64编码转换原理

    Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法.它其实只是定义用可打印字符传输内容一种方法 ...

  3. 创建一个 Spring Boot 项目,你会几种方法?

    我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 42W+,如下图: 2017 年由于种种原因,就没有 ...

  4. 深度学习与计算机视觉:基于Python的神经网络的实现

    在前面两篇文章介绍了深度学习的一些基本概念,本文则使用Python实现一个简单的深度神经网络,并使用MNIST数据库进行测试. 神经网络的实现,包括以下内容: 神经网络权值的初始化 正向传播 误差评估 ...

  5. netcore编程之后面对不习惯的xshell黑屏部署,是时候使用jenkins自动化发布工具了

     在很久之前net还只能在windows上部署的时候,或许很多创业公司的朋友发布项目还都是人肉部署,反正windows都是可视化的界面,拖拖拉拉,开开关关还不 是特别麻烦...现如今你的项目需要在li ...

  6. docker(5):数据的管理

    Docker的volume卷 为了能持久话保存和共享容器的数据. 使用docker volume卷的两种方式 1:数据卷 2:数据卷容器 1:数据卷 数据卷:数据卷会绕过docker 的ufs 直接写 ...

  7. 【MQ】消息队列及常见MQ比较

    一.什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用.消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰. ...

  8. Nodejs实现用户注册

    1创建连接池对象 2导出连接池对象 /** * 1.引入mysql模块 * 2.创建连接池对象 * 3.导出连接池对象 */ const mysql = require('mysql'); var p ...

  9. JS Bootstrap-DateRangePicker 如何设置默认值为空

    DateRangePicker是一款时间范围选择器,界面良好,非常适合短时间范围选择的插件,具体源码可以在http://www.daterangepicker.com/找到 ,但是目前使用中,感觉功能 ...

  10. vue2.0 配置环境总结(都是泪啊)

    最近有点空闲时间,终于把一直想学的vue提上了日程,以下是收集的一些帮助入门的链接 1:https://vuefe.cn/v2/guide/ vue2.0中文官网 2:https://router.v ...