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

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. 使用MongoDB在项目中实际运用

    一.MongoDB,一个数据库,我们怎么去使用它呢?我们首先了解一下什么是MongoDb 官网的介绍是:MongoDB是专为可扩展性,高性能和高可用性而设计的数据库.它可以从单服务器部署扩展到大型.复 ...

  2. 《HelloGitHub》第 36 期

    公告 本期内容较多.本期共有 41 个项目:C# 项目(1),C++ 项目(1),CSS 项目(2),Go 项目(5),Java 项目(2),JavaScript 项目(5),Objective-C ...

  3. Python 转化成 PB 格式数据

    一.概述 Protocol Buffers 是 Google 公司开发的一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯 ...

  4. 学习 JavaScript (七) 内存问题

    内存问题是 JavaScript 比较底层的东西,依葫芦画瓢学会了怎么使用变量,但是对于内存的概念依然模糊,今天让我们一起来了解一下内存在这门语言是怎么样的存在. 内存在不同类型的数值面前表现有很大的 ...

  5. App 更换应用图标

    一般情况下,我们App图标在Androidmanifest.xml中设置,通过Application android:icon属性指定,写法如下: <?xml version="1.0 ...

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

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

  7. ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第一天

    文章大纲 一.课程介绍二.淘淘商城基本介绍三.后台管理系统工程结构与搭建四.svn代码管理五.项目源码与资料下载六.参考文章   一.课程介绍 1. 课程大纲 一共14天课程(1)第一天:电商行业的背 ...

  8. react-native 金币彩带雨下落动画

    日常项目中,经常遇到一些表情雨/金币雨/彩带雨 等下落的动画,之前做android原生的时候,写过类似的效果,主要通过自定义view 在onDraw里绘制下落的过程,具体可以看下我的这篇github地 ...

  9. Windows无人值守文件unattend制作以及自定义系统安装

    原文链接:Create media for automated unattended install of Windows 10 我从来没看到过像上面的文章一样这么详细的描述过Windows10的无人 ...

  10. Centos7.3离线(rpm方式)安装mysql服务

    1.mysql官网下载安装包,官网地址:www.mysql.com [root@seiang software]# ll total 580020 -rw-r--r--. 1 root root 59 ...