原理底层计划----注册中心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查找和发现服务。
nacos注册中心原理,底层原理,java,分布式,微服务

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

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

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

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

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

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

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

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

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

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

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

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

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

nacos注册中心原理,底层原理,java,分布式,微服务

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

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

nacos注册中心原理,底层原理,java,分布式,微服务

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

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

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

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

nacos注册中心原理,底层原理,java,分布式,微服务

(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地址
nacos注册中心原理,底层原理,java,分布式,微服务

或者
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

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上获取到它要调用的服务。
nacos注册中心原理,底层原理,java,分布式,微服务

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

nacos注册中心原理,底层原理,java,分布式,微服务
nacos注册中心原理,底层原理,java,分布式,微服务

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

我们首先看一下 nacos 的简单架构图:
nacos注册中心原理,底层原理,java,分布式,微服务

参照上面的架构图,我们分别创建两个模块,分别是 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注册中心原理,底层原理,java,分布式,微服务

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

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,如下图:

nacos注册中心原理,底层原理,java,分布式,微服务

nacos注册中心原理,底层原理,java,分布式,微服务

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

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

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

到了这里,关于原理底层计划----注册中心Nacos的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ShenYu网关注册中心之HTTP注册原理

    当客户端启动后,根据相关配置,读取属性信息,然后写入队列。以官方提供的 shenyu-examples-http 为例,开始源码分析。 该例子是一个springboot项目,所以注册的入口往往在自动装配类中。不妨可以先看下项目的pom文件中引入了什么依赖: 这里面看到就 shenyu-spring-boot-starter-c

    2024年01月21日
    浏览(29)
  • Eureka注册中心实现原理

            在实际生产环境中,为了防止微服务模块由于单个服务节点阻塞挂掉而导致整体服务雪崩,微服务模块需要部署多个服务节点,而当其他微服务模块代码在调用某服务模块时,需要写入被调用的服务节点的ip和端口,但多个服务节点的ip端口不一致,如何写入我们

    2024年02月03日
    浏览(32)
  • SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心

    单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点:架构简单;部署成本低(打jar包、部署、负载均衡就完成了) 缺点:耦合度高(维护困难、升级困难,不利于大项目开发) 分布式架构 根据业务功能对系统做拆分,每个业务功能模块作为独立

    2024年02月13日
    浏览(27)
  • 三、nacos注册中心实现原理分析

    1.Nacos架构图 Provider App:服务提供方-是指提供可复用和可调用服务的应用方。 Consumer App:服务消费方-是指会发起对某个服务调用的应用方。 Name Service:用过VIP(Vritual IP)或者DNS的方法实现Nacos高可用的服务路由。 Nacos Service:Nacos服务提供者,里面包含Open API 是功能访问入口

    2024年02月04日
    浏览(29)
  • SpringCloud之Eureka注册中心原理及其搭建

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 1、Eureka组件 Eureka包含两个组件:Eure

    2024年02月03日
    浏览(31)
  • Redis学习(三)分布式缓存、多级缓存、Redis实战经验、Redis底层原理

    单节点Redis存在着: 数据丢失问题:单节点宕机,数据就丢失了。 并发能力和存储能力问题:单节点能够满足的并发量、能够存储的数据量有限。 故障恢复问题:如果Redis宕机,服务不可用,需要一种自动的故障恢复手段。 RDB持久化 RDB(Redis database backup file,Redis数据库备份

    2024年02月16日
    浏览(27)
  • 【SpringCloud】02 注册中心Eureka的原理与使用

    本文是SpringCloud系列第二篇,请先阅读前置文章。 所有代码都基于01认识微服务,了解服务拆分与远程调用中的基础代码cloud-demo,可以前往下载。 在上一篇文章中,我们在OrderService类的queryOrderById方法里,使用RestTemplate里向user-service微服务发起调用请求,根据用户id查询用户

    2024年02月05日
    浏览(31)
  • SpringCloud(17~21章):Alibaba入门简介、Nacos服务注册和配置中心、Sentinel实现熔断与限流、Seata处理分布式事务

    Spring Cloud Netflix项目进入维护模式 https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now 说明 Spring Cloud Netflix Projects Entering Maintenance Mode 什么是维护模式 将模块置于维护模式,意味着 Spring Cloud 团队将不会再向模块添加新功能。我们将修复 block 级别的 bug 以及安全问题,我

    2024年01月19日
    浏览(48)
  • 【Spring Cloud】深入理解 Eureka 注册中心的原理、服务的注册与发现

    在微服务架构中,服务的注册与发现是至关重要的一环。为了实现这一目标,Eureka 注册中心应运而生。在本篇文章中,我们将深入理解 Eureka 注册中心的原理,以及探讨服务的注册与发现机制。 在微服务的协作中,服务之间的远程调用是常见的需求。然而,使用传统的 Rest

    2024年02月08日
    浏览(35)
  • Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!

    当应用开始脱离单机运行和访问时,服务发现就诞生了。目前的网络架构是每个主机都有⼀个独立的 IP 地址,服务发现基本都是通过某种方式获取到服务所部署的 IP 地址。 DNS 协议是最早将⼀个网络名称翻译为网络 IP 的协议,在最初的架构选型中,DNS+LVS+Nginx 基本满足所有

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包