ToB企服应用市场:ToB评测及商务社交产业平台

标题: 第二章 服务注册与发现 [打印本页]

作者: 万有斥力    时间: 2024-2-19 13:19
标题: 第二章 服务注册与发现
但在微服务架构中,每个微服务通常有多个实例,每个实例具有不同的位置,而且实例会动态变化,比如在负载发生变化时服务会进行扩容或缩容,或者某个实例所在的VM/Container故障后发生迁移,都会导致服务实例地址的变化。因此使用微服务架构开发的应用,必须通过服务注册和发现技术解决此问题。
1. 简单概述

服务注册

服务要被使用,就需要对外提供服务的位置信息,这个位置信息通常是一个IP地址+端口。在服务只有单个实例并且地址不会动态变化的情况下,服务的位置在使用端可以通过配置文件甚至代码等方式固定死。但在位置信息会动态发生变化的情况下,服务实例就需要将这个地址注册到一个注册中心。

 
服务的所有实例在自己可以对外提供服务后,将位置注册到一个ServiceRegistry服务。这个服务具有固定的位置或域名,负责保存所有服务实例的位置信息。
在使用ServiceRegistry时,服务实例要在无法提供服务时取消注册。ServiceRegistry需要通过心跳等方式核查出无法提供服务的实例,并将实例自动取消注册。
服务注册有Self Registration3rd Party Registration两种方式。Self Registration需要由每个服务实例自己实现服务的注册和取消注册的代码,3rd Party Registration则由第三方的Registrar完成服务的注册和取消注册。
ServiceRegistry通常会使用如etcd、zookeeper、consul,nacos 等具备分布式一致性的key/value数据库存储服务的注册信息,并提供服务实例的变更通知。
 
注册流程


 
 如上图,Service-Center中服务发现流程大致有以下几个步骤:
Self Registration
优点
缺点:
3rd Party Registration
优点:
缺点:
服务发现

我们把每个服务的机器实例注册到了注册中心上之后,接下来,我们如何去发现我们需要调用的服务的信息呢?这就是服务发现了。
客户端要使用服务必须通过服务发现技术获取服务的位置信息。服务发现包括Client-Side的服务发现和Server-Side的服务发现两种方式。
Client-Side Discovery

 
Client-Side Discovery
在Client-Side Discovery的设计中,服务实例的发现由Client进行,发现的方式可以是主动到ServiceRegistry查询,也可以由ServiceRegistry通知到Client。在使用Client-Side Discovery时,Client会发现服务的所有实例,并根据LB策略选择一个实例发起请求。
Server-Side Discovery

 
在Server-Side Discovery设计中,在Client和所有的服务实例间增加LoadBalance,Client只需要访问LoadBalance,由LoadBalance负责服务的发现和负载均衡。
方案对比
不论是Client-Side还是Server-Side的服务发现,执行发现的组件(Client/LoadBalance)通常都需要引入本地缓存,并通过核查保证与ServiceRegistry的一致性。引入缓存可以避免对ServiceRegistry的频繁交互,能够提升性能。
Client-Side Discovery相对于Server-Side Discovery有更少的跳数,性能更优。但所有类型的客户端都需要实现服务发现与LB算法,客户端的复杂度高,且与ServiceRegistry耦合。
Server-Side Discovery设计中,客户端只需要看到LoadBalance,复杂度低;如果是基于公有云提供服务,则公有云提供商通常会提供现成的服务端LoadBalance。但相对Client-Side Discovery增加了一跳,对性能有一定影响;同时LoadBalance的开发、部署、运维带来了额外的复杂度;
总结

在服务实例的位置会发生动态变化的微服务架构中,需要引入服务注册和发现技术。
服务注册和发现需要一个位置固定或提供了固定域名的ServiceRegistry服务,服务发布端通过Self-Registration或3rd Party Registration将所有的服务实例注册到ServiceRegistry,Client或LoadBalance则通过其获取服务实例的位置以执行负载均衡和发送服务请求。
ServiceRegistry和LoadBalance是系统中的关键服务,如果这两个服务出现了异常,通常会导致系统不可用,因此它们必须具备极高的可用性。
 
2. Consul

官网:https://www.consul.io
中文文档:Consul 中文文档 - Consul 中文文档 (gitbook.io)
做服务发现的框架常用的有 zookeeper, eureka, consul,nacos 。 那么consul是啥?consul就是提供服务发现的工具。
Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。
 
1. Consul具有哪些特点

2. Consul 架构图


 
我们来分析一下这张图,并描述一下每一个部分。首先,我们可以看到有两个数据中心,分别标注为 "DATACENTER1"和 "DATACENTER2"。Consul对多个数据中心有天然非常好的支持,并希望这是常见的情况。
在每个数据中心内,我们有ClientServer的混合。预计会有3到5台Server。这是在权衡故障场景下可用性性能之间取得平衡的结果,因为随着机器的增加,共识的速度会逐渐变慢。然而,Client的数量没有限制,它们可以轻松地扩展到数千或数万。
所有在数据中心的代理都会参与一个Gossip协议。这意味着有一个Gossip池,其中包含了某个数据中心的所有Agent。这有几个目的:
每个数据中心的Server都是单一Raft对等集的一部分。这意味着它们共同选出一个单一的Leader,一个被选中的Server,它有额外的职责。Leader负责处理所有查询和事务。事务也必须复制到所有参与共识协议的分片。由于这一要求,当None-Leader Server收到RPC请求时,它会将其转发给集群Leader。
Server Agent还作为WAN(广域网) Gossip Pool的一部分进行操作。这个池子与LAN(局域网)池不同,因为它是针对互联网的较高延迟进行优化的,WAN池只包含其他Consul 数据中心的Sever Agent。这个池的目的是让数据中心以低接触的方式发现彼此。让一个新的数据中心上线就像加入现有的WAN Gossip 池一样简单。因为服务器都在这个池中运行,所以还可以实现跨数据中心的请求。当一台Server收到一个不同数据中心的请求时,它会将其转发到正确数据中心的随机Server。然后该Servevr可能会转发到本地Leader。
这导致数据中心之间的耦合度很低,但由于故障检测、连接缓存和多路复用,跨数据中心的请求相对快速可靠。
一般情况下,不同的Consul数据中心之间不会复制数据。当对另一个数据中心的资源进行请求时,本地Consul服务器会将该资源的RPC请求转发给远程Consul服务器,并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会以其他方式影响本地数据中心。
在一些特殊情况下,可以复制有限的数据子集,比如使用Consul内置的ACL复制功能,或者使用consul-replicate等外部工具。 在某些地方,Client Agent可能会从Server上缓存数据,使其在本地可用,以提高性能和可靠性。例如, 包括连接证书和它允许Client代理对入站连接请求做出本地决定,而无需往返Server的场景。一些API端点还支持可选的结果缓存。这有助于可靠性,因为即使与服务器的连接中断或服务器暂时不可用,本地Agent仍然可以继续从缓存中响应一些查询,如服务发现或Connect授权。
 
 
3. 安装Consul

安装完 Consul 后应该运行 agent,它可以运行在服务端(server)或者客户端(client)模式下。每个数据中心(datacenter)都至少有一个 server,推荐一个集群(cluster)至少有 3 到 5 个 server。因为在故障情况下数据丢失是不可避免的,所以强烈建议不要单机部署。
其他 agent 运行在 client 模式,它是一个轻量级进程,提供服务注册、健康检查和服务器见的查询转发。集群的所有节点都应运行一个 agent。
windows 安装

https://www.consul.io/downloads
  1. consul.exe agent -dev
复制代码
-dev 表示开发模式,生产环境下不建议使用,因为它不会保存任何状态
-server 生产环境下可使用
linux 安装

  1. sudo yum install -y yum-utils
  2. sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
  3. sudo yum -y install consul
复制代码
 
  1. consul agent -dev
复制代码
 
Docker 安装

拉取Consul镜像
  1. $ docker pull consul # 默认拉取latest
  2. $ docker pull consul:1.15.4 # 拉取指定版本
复制代码
 
安装并运行

 
4 .Net 6 中如何使用


获取服务

ServiceB 调用 ServiceA 接口
  1. public class HomeController:ControllerBase
  2. {
  3.     private readonly IConsulClient _consulClient;
  4.     public HomeController(IConsulClient consulClient)
  5.     {
  6.         _consulClient = consulClient;
  7.     }
  8.     [HttpGet]
  9.     public IActionResult TestConsul()
  10.     {
  11.         var services = _consulClient.Catalog.Service("NetCloud.Consul.ServiceB").Result.Response;
  12.         var instance = services[new Random().Next(services.Length)];
  13.         using HttpClient client = new();
  14.         string result = client.GetStringAsync($"http://{instance.ServiceAddress}:{instance.ServicePort}").Result;
  15.         return Ok($"服务B结果:{result},服务A结果:测试成功");
  16.     }
  17. }
复制代码
 
3. Nacos

官网: https://nacos.io/zh-cn/index.html
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos 的关键特性包括:
 
Docker 安装 Nacos

 
 
访问:http://你的IP地址:8848/nacos
默认登录账号:nacos,密码:nacos
.Net 6 使用Nacos

文档:https://github.com/nacos-group/nacos-sdk-csharp
nuget 安装:
 
服务发现

多个实例(负载均衡)


 

 
 
服务调用

配套视频链接:课程简介 (cctalk.com)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4