当前位置:   article > 正文

原理底层计划----注册中心Nacos_nacos注册中心原理

nacos注册中心原理

Why
服务多了,需要统一的管理
为了更好地查找这些服务
1、为什么要将服务注册到nacos?
之前的痛点
● 需要手动的维护所有的服务访问ip地址列表。
● 单个服务实现负载均衡需要自己搭建,例如使用nginx负载均衡策略,或者基于容器化多实例部署单个服务,在实例之间做负载均衡。
使用注册中心能够实现服务治理,服务动态扩容,以及服务调用的负载均衡

● 服务提供者:向注册中心根据服务名称提供服务访问的ip:port以及其他信息。
● 注册中心:根据服务名称,存储对应的ip:port以及其他信息。
● 服务消费者:根据服务名向注册中心获取调用服务的ip:port以及其他相关的信息集合,然后根据负载均衡策略获取最终的服务器ip:port访问地址。

为了更好的查找这些服务。

2、Nacos服务是如何判定服务实例的状态?
通过发送心跳包,5秒发送一次,如果15秒没有回应,则说明服务出现了问题,
如果30秒后没有回应,则说明服务已经停止。

服务(Service)是 Nacos 世界的一等公民

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
在这里插入图片描述

还可以进行健康检查
What
一、什么是注册中心:
我们知道微服务彼此间独立部署、具有清晰的边界,服务间通过远程调用来构建复杂的业务功能。而服务册中心在微服务项目中扮演着非常重要的角色,那么注册中心又是什么,使用服务注册中心可以解决微服务中的哪些问题呢?

1、什么是注册中心:
注册中心是微服务架构中的纽带,类似于“通讯录”,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址并进行调用。注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的,更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。因此,原本在单体应用阶段常用的静态LB机制就不再适用了,需要引入额外的组件来管理微服务提供者的注册与发现,而这个组件就是服务注册中心。
在这里插入图片描述

2、注册中心的核心功能:
服务注册:服务实例将自身服务信息注册到注册中心
服务发现:服务实例通过注册中心,获取到注册到其中的服务实例的信息,通过这些信息去请求它们提供的服务
服务剔除:服务注册中心将出问题的服务自动剔除到可用列表之外,使其不会被调用到
3、注册中心解决的问题:
(1)屏蔽、解耦服务之间相互依赖的细节:

    服务之间的远程调用必须要知道对方IP、端口。但是该调用方式存在明显的问题,如被调用的IP、端口变化后,调用方也要同步修改。通过服务发现,将服务之间IP与端口的依赖转化为服务名的依赖,服务名可以根据具体微服务业务来做标识。
  • 1

(2)对服务进行动态管理:

    在微服务架构中,服务数量多且依赖错综复杂,无论是服务主动停止、意外挂掉,还是因为流量增加对服务扩容,这些服务状态上的动态变化,都需要尽快的通知到被调用方,被调用方才采取相应的措施。所以,对于服务注册中心要实时管理服务的数据与状态,包括服务的注册上线、服务主动下线,异常服务的剔除。
  • 1

(3)降低服务端负载均衡中间件的压力:

    当服务越来越多时,服务 URL 配置管理变得非常困难,服务端的负载均衡中间件,比如 F5、Nginx 压力也越来越大。通过服务注册中心,就可以实现动态地注册和发现服务,使服务的位置透明,并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover,降低对服务端的负载均衡中间件,也能减少部分成本。
  • 1

4、服务的发现与注册的实现模式:
上面提到,硬件的 F5、软件的 Nginx 也可以实现服务的发现,那么这与注册中心的服务发现有什么区别呢?这其实是服务发现与注册的两种实现模式:服务端的发现模式 和 客户端的发现模式。F5、Nginx 属于服务端的发现模式,服务注册中心属于客户端的发现模式,两种模式各有优缺点,也适用于不同的场景,对于大型应用一般会有多层负载,外层用服务器端负载均衡,内部用客户端负载均衡。接下来我们就具体看看两种服务发现模式是怎么样的:

(1)服务端的发现模式:

    服务端的发现模式是通过使用一个中间的服务器,来屏蔽被调用服务的复杂性与变动性,当有新的服务加入或老服务剔除时,只需要修改中间服务器上的配置即可,此模式的显著特点是:引入独立的中间代理服务器来屏蔽真实服务的具体细节。

    如下图所示:当服务A要调用服务B时,先通过 DNS 域名解析找到 Nginx 服务器,然后将请求发送给Nginx,因为在 Nginx 上配置了服务B的真实访问地址,Nginx 收到请求后根据负载均衡算法,将请求转发到某个真实的服务B,服务B将请求结果返回给 Nginx,Nginx 再将返回结果给服务A,整个请求流程结束。当然中间服务器不一定非得是 Nginx,还可以是基于硬件的 F5,也可以是工作在传输层的 IP 负载均衡等。

    该模式的优点是:配置集中在独立的中间服务器端完成,对代码没有任何入侵,也不存在跨平台跨语言的问题。但缺点也很明显,因为所有请求都需要穿透中间服务器,所以中间服务器会成为一个单点,对性能也会有所影响。
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

(2)客户端的发现模式:

    我们再看看客户端的发现模式,服务A调用服务B时,不需要通过中间服务器,而是在自己进程内维护了服务B的信息,再通过负载算法选择一个服务B直接调用。那服务A具体是怎么维护服务B的信息呢?为此引入了服务注册中心的概念,当服务B启动时向注册中心注册自己(将自己的信息发送到注册中心的注册表里),服务A再从注册中心获取所有注册的服务,这就是客户端模式的基本原理。
  • 1

在这里插入图片描述

    客户端模式因为在进程内直接调用服务,也叫做进程内负载,由于不需要穿透中间服务器,所以客户端模式的性能损耗比较小。但是,需要在服务内部维护服务注册信息,负载算法等,有一定的代码入侵性,对于跨平台,跨语言的支持不太友好。
  • 1

5、服务注册表:
微服务架构中,所有的服务启动后都通过注册中心来注册自己,同时把注册中心里面的服务信息拉回本地,后续调用时就直接检查本地的服务和节点信息来进行服务节点的调用。每个服务节点都会来注册中心进行服务注册,那注册信息是如何在服务端保存的呢,其实就是注册表,服务注册的时候把自己的信息上报上来,然后注册中心把注册表,返回给客户端,那服务之间就知道要调用服务的节点了。

    服务注册表需要高可用而且随时更新。客户端能够缓存从服务注册表中获取的服务地址,然而,这些信息最终会过时,客户端也就无法发现服务实例。因此,服务注册表会包含若干服务端,并使用复制协议保持一致性。服务注册表不能是单点,否则存在单点故障,当服务注册表有多台服务器的时需要考虑服务注册表的信息在多台机器上的实时同步和一致。
  • 1

二、主流服务注册中心的对比:

在这里插入图片描述

(1)Zookeeper 和 Consul 遵循 CP 原则,保证了强一致性和分区容错性,放弃可用性,在分布式环境中,如果涉及数据存储的场景,数据一致性应该是首先被保证的,但对于服务发现来说,可用性才是最核心的,针对同一个服务,即使注册中心的不同节点保存的服务提供者信息不相同,也并不会造成灾难性的后果。因为对于服务消费者来说,能消费才是最重要的,消费者拿到不正确的服务实例信息后尝试消费一下,也胜过因为无法获取实例信息而不去消费而导致系统异常

(2)Eureka 遵循 AP 原则,保证可用性,放弃数据一致性,基本能满足注册中心所需的核心功能,但 Eureka 2.x 版本已停止开发,并且宣布如果继续使用的话,风险自负。

(3)Nacos 同时支持 AP 与 CP,默认是 AP,同时功能更丰富,与 SpringCloud Alibaba 的兼容性更好,使用更简单灵活,可以满足更多的业务场景,且支持 K8S 的集成。

不同的服务注册中心组件的应用场景不同,读者可以根据自己的业务情况进行选型。但下文我们主要以 Nacos 注册中心为例进行介绍,其他几种注册中心读者自行上网查阅
————————————————
版权声明:本文为CSDN博主「张维鹏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a745233700/article/details/122915663
How
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
1、添加依赖
spring-cloud-starter-alibaba-nacos-discovery
2、配置服务提供者,从而服务提供者可以通过nacos的服务注册发现功能将其服务注册安东nacos server上
3、Application.yml配置nacos server地址
在这里插入图片描述

或者
server:
port: 31511

spring:
application:
name: @artifactId@
cloud:
nacos:
discovery:
server-addr:
register-enabled: true
namespace: sw-saas
metadata:

客户端向 nacos 服务器上报心跳包的时间间隔

preserved.heart.beat.interval: 5000

客户端不发送心跳后,从健康到不健康的时间

preserved.heart.beat.timeout: 5000

不发送心跳后,被 nacos下掉该实例的时间

  preserved.ip.delete.timeout: 5000
  • 1

config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yml
namespace: sw-saas

4、通过注解@EnableDiscoveryClient开启服务注册发现
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {

public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}

@RestController
class EchoController {
@RequestMapping(value = “/echo/{string}”, method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}

5、配置服务消费者,从而服务消费者可以通过nacos的服务注册发现功能从nacos sever上获取到它要调用的服务。
在这里插入图片描述

6、通过注解@EnavleDiscoveryClient开启服务注册发现功能。给RestTemplate实例添加@LoadBlanced注解,开启@LoadBalanced与与 Ribbon 的集成:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}

public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}

@RestController
public class TestController {

private final RestTemplate restTemplate;

@Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

@RequestMapping(value = “/echo/{str}”, method = RequestMethod.GET)
public String echo(@PathVariable String str) {
return restTemplate.getForObject(“http://service-provider/echo/” + str, String.class);
}
}
}
Where
Network服务

nacos注册中心的注册原理
https://blog.csdn.net/qq_36893229/article/details/120201306

在这里插入图片描述
在这里插入图片描述

SpringBoot 整合 Nacos 进行服务注册发现:

我们首先看一下 nacos 的简单架构图:
在这里插入图片描述

参照上面的架构图,我们分别创建两个模块,分别是 cloud-producer-server(服务提供者)、cloud-consumer(服务消费者),职责如下:

cloud-producer-server:注册进入nacos-server,对外暴露服务
cloud-consumer:注册进入nacos-server,调用 cloud-producer-server 的服务
创建这两个模块前,我们先声明项目的版本信息:

com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery

(2)添加 nacos 相关的配置信息:

在 application.properties 配置文件指定服务名称、端口号、nacos-server 的地址信息,如下:

spring.application.name = cloud-producer-server
server.servlet.context-path = /${spring.application.name}
server.port=9000

nacos注册中心配置

spring.cloud.nacos.discovery.server-addr = localhost:8848
spring.cloud.nacos.discovery.namespace = 91b5489b-d009-4725-86fa-534f760b4d04
spring.cloud.nacos.discovery.register-enabled = true
(3)开启服务注册发现的功能:

在主 Application 启动类加入 @EnableDiscoveryClient 注解开启服务注册发现的功能,如下:

/**

● SpringBoot启动类
● @EnableDiscoveryClient 开启服务注册发现的功能
*/
@EnableDiscoveryClient
@SpringBootApplication
public class ProducerApplication
{
public static void main(String[] args)
{
SpringApplication.run(ProducerApplication.class, args);
}
}
(4)实现个演示功能:
cloud-producer-server 作为服务提供者注册到 nacos 中,肯定需要提供个服务来供消费者 cloud-consumer 调用,下面简单写一个演示接口:

@RestController
@RequestMapping (value = “/”)
public class CloudController
{
@PostMapping (“getSum”)
public String getSum(@RequestParam (value = “num1”) Integer num1, @RequestParam (value = “num2”) Integer num2)
{
return “success:两数求和结果=” + (num1 + num2);
}
}
(5)启动项目:
在这里插入图片描述

启动项目之后,我们进入 nacos 控制台,在 nacos 的 “服务管理->服务列表” 的 “91b5489b-d009-4725-86fa-534f760b4d04” 空间中将会发现注册进入的 cloud-producer-server 这个服务,如下图:
  • 1

2.2、创建服务消费者 cloud-consumer:
服务消费者的创建步骤与服务提供者基本一致

(1)引入maven依赖:

com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery

(2)添加 nacos 相关的配置信息:

spring.application.name = cloud-consumer
server.port=9001

nacos注册中心配置

spring.cloud.nacos.discovery.server-addr = localhost:8848
spring.cloud.nacos.discovery.namespace = 91b5489b-d009-4725-86fa-534f760b4d04
spring.cloud.nacos.discovery.register-enabled = true
(3)开启服务注册发现的功能:

/**

● SpringBoot启动类
● @EnableDiscoveryClient 开启服务注册发现的功能
*/
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication
{
public static void main(String[] args)
{
SpringApplication.run(ConsumerApplication.class, args);
}
}
(4)调用服务提供方的演示功能:
cloud-producer-server 服务提供方提供一个演示功能,那我们如何调用该功能呢?其实 Nacos 集成了 Ribbon(有关 Ribbon 的详细介绍请参考这篇文章:https://blog.csdn.net/a745233700/article/details/122916856),因此我们便能使用 Ribbon 的负载均衡来调用服务,步骤如下:

① 创建 RestTemplate,使用 @LoadBalanced 注解标注开启负载均衡:

@Configuration
public class RestConfig
{
/**

  • 创建restTemplate对象。
  • LoadBalanced注解表示赋予restTemplate使用Ribbon的负载均衡的能力(一定要加上注解,否则无法远程调用)
    */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
    return new RestTemplate();
    }
    }
    ② 通过 RestTemplate 请求远程服务地址并接收返回值

@RestController
@RequestMapping (value = “api/invoke”)
public class InvokeController
{
@Autowired
private RestTemplate restTemplate;

/**

  • 使用 RestTemplate 进行远程服务调用,并且使用 Ribbon 进行负载均衡
    */
    @ApiOperation (value = “RestTemplate”, notes = “使用RestTemplate进行远程服务调用,并使用Ribbon进行负载均衡”)
    @GetMapping (“getByRestTemplate”)
    public String getByRestTemplate(Integer num1, Integer num2)
    {
    //第一个cloud-producer-server代表在nacos注册中心中的服务名,第二个cloud-producer-server代表contextPath配置的项目路径
    String url = “http://cloud-producer-server/cloud-producer-server/getSum”;
    MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
    params.add(“num1”, num1);
    params.add(“num2”, num2);

    //通过服务名的方式调用远程服务(非ip端口)
    return restTemplate.postForObject(url, params, String.class);
    }

}

(5)启动测试,查看nacos注册中心控制面板情况

启动成功后将会在 nacos 中的服务列表中看到 cloud-consumer,如下图:
  • 1

在这里插入图片描述

在这里插入图片描述

那么接下来就测试下服务能否调的通?访问服务消费方的 api/invoke/getByRestTemplate接口,可以看到请求结果如下:

————————————————
版权声明:本文为CSDN博主「张维鹏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a745233700/article/details/122915663

扩展
nginx完成Nacos的负载均衡,mysql实现主从复制 (Nacos集群读取共享数据)
1、轮询(默认策略,nginx自带策略):轮询的方式,它是upstream模块默认的负载均衡默认策略。会将每个请求按时间顺序分配到不同的后端服务器。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/414793
推荐阅读
相关标签
  

闽ICP备14008679号