继上篇 Ocellot 做负载均衡之后,本篇将记录 Ocelot + Consul 试验如何做服务发现和服务注册。

服务发现和服务注册的背景知识,一搜满街都是。

在此,我还是写下自己对这个术语的理解吧。上篇虽然对多个服务节点做了负载均衡,但如果其中一个节点挂掉了,我们访问时会现一次成功一次失败,这在实际生产环境中是绝对不允许的,也失去了负载均衡原来的意义。

我们必须保证,如果有某些节点服务挂掉了,只要有一个或一个以上的节点服务还健康活着,那整个服务就还能继续工作。Ocelot网关是不能感知其下节点服务的健康情况的,所以需要借助某种工具,去主动监听其下节点服务的状态,这就是服务发现。Ocelot早已兼容Consul这种服务发现工具。

下面,我们先在linux机上安装一下Consul,具体如下:

$ wget https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip
$ sudo apt-get install unzip

$ ls

$ unzip consul_1.4.4_linux_amd64.zip
$ sudo mv consul /usr/local/bin/consul

以上命令,在官网下了个包,然后解压了一下,里面只有一个 consul文件,把文件移到了/usr/local/bin/consul。

然后,就真的没有然后了,Consul 安装完毕!

试下 $ consul

看到这个,安装就是成功的了。

体验一下: consul agent -dev

看一下成员: consul members

然后在浏览器上试访问一下:192.168.1.23

体验完了,就把它移除吧,dev是拿来试的

$ consul leave

下面我们对代码配置,做一点小修改。修改之前,简单说一下代码结构,一个网关,两个API

所有项目的appsetting.json都设置一下,各自读自定义IP和Port,

public static IWebHost BuildWebHost(string[] args)
{ return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseUrls(new ConfigurationBuilder().SetBasePath(System.IO.Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build()["ApplicationUrl"]).Build();
}
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"ApplicationUrl": "http://192.168.1.232:5011"
}

修改一下 lanchSettings.json, 取消通过浏览器启动

{
"profiles": {
"Dashboard": {
"commandName": "Project",
"launchBrowser": false,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5012/"
}
}
}

解决方案启动项目设置如下:

apigateway项目的ocelot.json的配置:定义了下游两个服务节点,开启了服务发现,配置了consul的连接IP和POrt

 {
"UseServiceDiscovery": true, // do not use Consul service discovery
"DownstreamPathTemplate": "/master/{url}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "192.168.1.232",
"Port": ""
},
{
"Host": "192.168.1.232",
"Port": ""
}
],
"ServiceName": "MasterService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"UpstreamPathTemplate": "/master/{url}",
"UpstreamHttpMethod": [ "Get", "Post" ],
"RateLimitOptions": {
"ClientWhitelist": [ "admin" ], // 白名单
"EnableRateLimiting": true, // 是否启用限流
"Period": "1m", // 统计时间段:1s, 5m, 1h, 1d
"PeriodTimespan": , // 多少秒之后客户端可以重试
"Limit": // 在统计时间段内允许的最大请求数量
},
"QoSOptions": {
"ExceptionsAllowedBeforeBreaking": , // 允许多少个异常请求
"DurationOfBreak": , // 熔断的时间,单位为秒
"TimeoutValue": // 如果下游请求的处理时间超过多少则视如该请求超时
},
"ReRoutesCaseSensitive": false // non case sensitive
}
"GlobalConfiguration": {
//"BaseUrl": "https://api.mybusiness.com"
"ServiceDiscoveryProvider": {
"Host": "192.168.1.23", // Consul Service IP
"Port": // Consul Service Port
},

分别对两个api加一个健康检查入口:

        [HttpGet("/master/health")]
public IActionResult Heathle()
{
return Ok();
}

至此,网关和2个API的准备工作完毕。跑起来!

下面,通过文件方式,向consul注册服务,在linux上创建一个service.json, 随便找个地方放一下

{
"encrypt": "Wd7HAMtcgg5RQ2hZhHE9xw==",
"services": [
{
"id": "api1",
"name": "MasterService",
"tags": [ "ApiService" ],
"address": "192.168.1.232",
"port": ,
"checks": [
{
"id": "ApiServiceA_Check",
"name": "ApiServiceA_Check",
"http": "http://192.168.1.232:5011/health",
"interval": "10s",
"tls_skip_verify": false,
"method": "GET",
"timeout": "1s"
}
]
},
{
"id": "api2",
"name": "MasterService",
"tags": [ "ApiService" ],
"address": "192.168.1.232",
"port": ,
"checks": [
{
"id": "ApiServiceB_Check",
"name": "ApiServiceB_Check",
"http": "http://192.168.1.232:5012/health",
"interval": "10s",
"tls_skip_verify": false,
"method": "GET",
"timeout": "1s"
}
]
}
]
}

运行下面的命令:

consul agent -server -ui -bootstrap-expect= -data-dir=/tmp/consul -node=consul- -client=0.0.0.0 -bind=0.0.0.0 -datacenter=dc1 -config-dir=/consul/testservices &

参数说明:

-server:服务器模式

-ui:能webui展示

-bootstrap-expect:server为1时即选择server集群leader

-data-dir:consul状态存储文件地址

-config-dir: 刚才放service.json的位置

-node:指定结点名

-advertise:本地ip地址

-client:指定可访问这个服务结点的ip

& : run as background server

再访问一下 8500

可以看到,两个节点服务在健康地存在。

访问一下服务,可以看到节点在来会切变

下面是实验最关键的一步,让其中一个节点挂掉,看看服务还能不能继续,我把 api1,关掉,后面再访问,一直都是

试验完毕。

说明:

1.一开始是也是跟着https://www.cnblogs.com/edisonchou/p/9124985.html来学习的,但因为我没有那么多虚拟机,就没办法按他那方式来做,但他那种才是 贴近生产环境的,具有更高的参考价值。

2.我是奔着试验的目的,所以参考https://www.cnblogs.com/alan-lin/p/9126155.html来做,基本都是一样的,惟一不同只是consul的安装环境而已。

负载均衡之Ocelot+Consul(配置文件注册服务)的更多相关文章

  1. 负载均衡之Ocelot+Consul(WebAPI注册服务)

    上一篇   负载均衡之Ocelot+Consul(文件配置注册服务),介绍了如何通过json文件注册服务,本篇将学习如何通过web api 注册服务. 在展开学习过程之前,且先总结一下 consul服 ...

  2. 负载均衡之nginx+consul(自动更新路由)

    前几篇先是记载了如何通过nginx配置服务负载均衡,后面记载了如何通过 ocelot 配置 服务负载均衡,分别介绍了用webapi注册服务以及配置文件注册服务,通过ocelot webapi + co ...

  3. 动态负载均衡(Nginx+Consul+UpSync)

    Http动态负载均衡 什么是动态负载均衡 传统的负载均衡,如果Upstream参数发生变化,每次都需要重新加载nginx.conf文件, 因此扩展性不是很高,所以我们可以采用动态负载均衡,实现Upst ...

  4. 动态负载均衡(Nginx+Consul+UpSync)环境搭建

    首先 安装好 Consul upsync 然后: 1.配置安装Nginx 需要做配置,包括分组之类的,创建目录,有些插件是需要存放在这些目录的 groupadd nginx useradd -g ng ...

  5. 【3分钟就会系列】使用Ocelot+Consul搭建微服务吧!

    一.什么Ocelot? API网关是一个服务器,是系统的唯一入口.API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端实现和微服务应用程 ...

  6. Ocelot+Consul实现微服务架构

    API网关 API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式.以前的话,客户端不得不去请求微服务A ...

  7. 客户端负载均衡Feign之一:申明式服务调用Feign入门示例

    Spring Cloud提供了Ribbon和Feign作为客户端的负载均衡. 前面使用了Ribbon做客户端负载均衡,使用Hystrix做容错保护,这两者被作为基础工具类框架被广泛地应用在各个微服务的 ...

  8. 负载均衡之Ocelot

    Ocelot 负载均衡:   背景知识,ocelot是基于 webapi 的网关框架,要使用ocelot来做路由转发和负载均衡,需要创建一个webapi,然后以这个webapi来做gateway.   ...

  9. 网关/负载均衡下的consul集群代理

    之前有做过使用单机版的consul实现Prometheus服务注册,以为使用集群版的consul只是将consul服务地址从节点IP变为了网关IP.但比较坑的就是,当使用consul注册一个servi ...

随机推荐

  1. centos7上使用locate命令-文件查找

    centos7上使用locate命令   小贴士:在centOS7以上的系统中使用“locate”文件查找命令,发现该命令不可用. 检查了下,原来是centos7默认没有安装该命令,在联网状态运行“y ...

  2. 与Cookie相比,Web Storage存在的优势

    与Cookie相比,Web Storage存在不少的优势,概括为以下几点:1. 存储空间更大:能提供5MB的存储空间(不同浏览器的提供的空间不同),Cookie仅4KB2. 存储内容不会发送到服务器: ...

  3. C语言精确微秒级的延时

    //----------------------------------------------------------------------------- // Delay_us //------ ...

  4. ubuntu中mysql安装失败

    在ubuntu中mysql安装失败后,卸载重新安装还是安装失败,之后找了资料说是卸载的不干净,然后进行下面操作,重新安装成功. 解决办法如下: sudo rm /var/lib/mysql/ -Rsu ...

  5. linux小白成长之路13————用U盘安装linux服务器

    [内容指引] 制作CentOS安装引导盘: 安装CentOS: 相关设置: 一.制作CentOS安装引导盘 1.下载安装镜像文件 从官网下载iso文件: 网址:https://www.centos.o ...

  6. JVM线程与Linux内核线程的映射[转]

    Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...

  7. CF778B(round 402 div.2 E) Bitwise Formula

    题意: Bob recently read about bitwise operations used in computers: AND, OR and XOR. He have studied t ...

  8. 【学习笔记】深入理解js原型和闭包(0)——目录

    文章转载:https://www.cnblogs.com/wangfupeng1988/p/4001284.html 说明: 本篇文章一共16篇章,外加两篇后补的和一篇自己后来添加的学习笔记,一共19 ...

  9. 小程序setData,视图层没有跟新

    如果你完全符合微信介绍的setData使用说明的情况下,发现视图层没有更新,你可以看看我的这种情况. 使用setData的时候,修改的是data中一个对象的值,然后这个对象里面第一层不能含有 numb ...

  10. Redis学习笔记(二)字符串进阶

    1.增减操作 字符串可以储存字节串.整数.浮点数三种类型的值,如果值无法被解释为十进制的整数或浮点数,那么对此值进行增减操作会返回错误,如果对一个不存在的或者保存了空串的键进行增减操作,Redis将当 ...