一、简介
在上一篇文章《庐山真面目之三微服务架构Consul简单版本实现》中,我们已经探讨了如何搭建基于Consul组件的微服务架构,可能很多人感觉很简单。没错,的确很简单,因为我的每篇文章只会解决一个问题,这样更单纯、更精准。如果我们把所有的东西都放在一篇文章里,太多了,不利于学习和查看。我们通过上一篇文章可知,在客户端访问 Consul 组件管理的业务服务实例是多么的麻烦,需要自己写代码实现。项目少,无所谓,只要项目一大,或者项目多了,规模大了,都会对管理和维护带来很大的挑战,毕竟,人喜欢操作简单的东西,想抬杠的免开尊口,主要是没必要。今天我们就解决客户端手写调用策略的问题。
1、说明
我先说明一下,这个实现的版本只过是测试版本,以后会把相关的技术点都增加上去,我们一步一步的演化而来,如果是大牛,就可以直接跳过,因为这些东西相对于您来说,这个太简单了。特别说明,这里的所有代码都经过测试,所以大家可以放心使用。
2、开发环境*以下就是开发环境,不用多说,都很简单,一看就知道。
(1)、开发工具:Visual Studio 2019
(2)、开发语言:C#
(3)、开发平台:Net Core3.1,跨平台。
(4)、服务注册:Consul,服务注册、发现中心
(5)、网关服务:Ocelot 开源组件,负载均衡,服务治理。
(6)、操作系统:Windows 10,64bit。
3、我们的目标
今天我们要解决的问题是如何做到服务实例调用策略不许要手写,并且还能实现负载均衡,其他问题,比如:Consul 本身的集群的问题暂时就不考虑,我们会一步一步的演变下去。
image
二、Consul注册、发现服务组件的简介。
image 在这里我们只是做简单的介绍,不会详细讨论它的所有技术点,没有那么大的篇幅,再说这样做也就跑题了。如果大家想去学习Consul的有关内容,地址我已经贴出来了,大家可以自行恶补。
Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。
上面的一幅图就说明了Consul的工作原理。S-A是使用服务的客户端,他不用关系有多少个服务,只要它需要的时候,他就会向Consul服务中心发出请求,Consul中心就会把和服务名称(在Consul中的名称,也可以说是服务的类别名称)匹配的、在此注册的所有服务实例的地址信息全部返回给S-A客户端,然后客户端,可以根据自己的情况,决定调用的具体策略,可以轮训、可以权重、可以随机,当然其他方式也可以,但是这些工作必须由使用服务的客户端S-A自行解决。
S-B-1、S-B-2、S-B-3等是在Consul中心注册的服务实例,包括服务实例的地址、端口号、ID名称、服务类别名称等信息。这些服务实例,每个服务实例都有自己的ID名称,多个服务实例可以取一个相同的名称,其实,这个名称是用于分类的。Consul中心查找的时候就是通过这个名称来查找的。这些服务实例,在应用程序一开始的时候就开始注册,并且只注册一次。
所有的服务实例都注册成功了,时间一分一秒的过去,一个小时之后或者一段时候之后服务还存在吗?我们如何判断呢?这就涉及到我们要谈的第三个方面,健康监测,英文叫:Health Check。Consul中心为我们提供了现成的接口,可以定义针对服务的健康检查,这个健康检查是一个完整的策略,包括:如果检查失败,多久注销服务;服务检查的时间间隔;还有调用检查的超时时间等。这样就能为我们提供一个比较完备的服务注册、发现和检测的解决方案。
**总结如下:
1****、服务自动注册,可以发现新服务。
2****、健康检测,可以过滤掉线服务。
3****、客户端要完成服务调用逻辑,比较麻烦,没有Nginx ****方便。**
三、Ocelot服务组件简介。
image 今天要给大家介绍的Ocelot是一个基于 .net core的开源WebAPI服务网关项目,它的功能非常强大,包括了路由、请求聚合、服务发现、认证鉴权、限流、负载均衡等功能。而这些功能都可以直接通过修改json配置文件即可使用,非常方便。Ocelot是系统中对外暴露的一个请求入口,所有外部接口都必须通过这个网关才能向下游API发出请求,就如地铁中的安检系统,所有人都必须经过安检才能乘坐地铁。
当然了,我今天肯定也不会对Ocelot服务组件进行详细的讨论,它有官网和详细的文档,如果想看它的源码也是没有问题的,因为它是开源的。如果大家想去学习的话,可以直接点击我贴出的连接。
官网:[https://threemammals.com/ocelot](https://threemammals.com/ocelot)
四、微服务架构Consul和Ocelot版本实现
上一篇文章我们解决了业务服务实例的发现和注册问题,当然也有健康检查,可以做到服务实例的动态伸缩。非常给力,也非常兴奋,因为我们又战胜了一个问题,做技术的人员都懂我说的意思。兵来将挡水来土掩,今天我们要解决手写代码去实现服务实例的调用策略。废话少说,我们开始吧。
** 1****、下载 Consul ****服务组件。**
官网下载:https://www.consul.io/downloads
image
Consul下载成功后,放在没有包含中文的目录里面,这是我的个人的习惯。
我的运行目录:D:\Programs\MicroServices\Consul_1.8.4_windows_amd64
![image](https://upload-images.jianshu.io/upload_images/22840365-aa15798ec1bd5224.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**2****、配置 Consul ****服务组件。**
切换到当前目录,执行如下命令:Consul agent –dev
![image](https://upload-images.jianshu.io/upload_images/22840365-d252a16762a8f77d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我们也可以通过浏览器查看 Consul服务中心是否启动成功,地址:[http://localhost:8500](http://localhost:8500/),如果成功,效果如下:
![image](https://upload-images.jianshu.io/upload_images/22840365-834c2fb06f2c4d7f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**3****、建立项目,并为项目引入 Consul****包。**
**(1)、PatrickLiu.MicroService.Client(ASPNETCORE MVC),客户端项目。**
![image](https://upload-images.jianshu.io/upload_images/22840365-72cdccbeda6ad054.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
代码如下:
【1】、HomeController.cs的代码
[
复制代码
](javascript:void(0); "复制代码")
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net.Http; 5 using Consul; 6 using Microsoft.AspNetCore.Mvc; 7 using Microsoft.Extensions.Logging; 8 using PatrickLiu.MicroService.Interfaces; 9 using PatrickLiu.MicroService.Models; 10
11 namespace PatrickLiu.MicroService.Client.Controllers 12 { 13 public class HomeController : Controller 14 { 15 private readonly ILogger _logger; 16 private readonly IUserService _userService; 17
18 ///
19 /// 初始化该类型的新实例。 20 ///
21 /// 注入日志对象。
22 /// 注入用户服务对象。
23 public HomeController(ILogger logger, IUserService userService) 24