大家好,我是哪吒。

本系列为SpringCloud微服务系列,上一篇学习了[图解Nginx,体系架构演变 + Nginx反向代理与负载均衡](/post/720280…) 读哪吒编程,品技能人生。

一、什么是Nacos?

一个更易于构建云原生应用的动态服务发现、服务装备和服务办理渠道。

图解Nacos,注册中心演变 + Nacos核心功能

Nacos的要害特性:

图解Nacos,注册中心演变 + Nacos核心功能

二、注册中心演变及其设计思想

1、RestTemplate调用长途服务

假如此时,服务端接口接口名或参数或恳求方法更改了,那么就得同步修正此restTemplate方法,感觉很麻烦

图解Nacos,注册中心演变 + Nacos核心功能

@SpringBootTest
class Test {
   @Resource
   private RestTemplate restTemplate;
   @Test
   void testSimple()  {
      // 恳求地址
      String url = "http://www.nzbc.com/updateUser";
      // 要发送的数据目标
      User user = new User();
      user.setUserId(1);
      user.setName("哪吒编程");
      user.setMsg("读哪吒编程,品技能人生");
      // 发送post恳求
      User result = restTemplate.postForObject(url, user, User.class);
      System.out.println(result);
   }
}

2、经过Nginx维护服务列表(upStream)

图解Nacos,注册中心演变 + Nacos核心功能

经过Nginx维护服务列表(upStream),假如服务较多的话,在Nginx经过upStream的方法去装备的话,Nginx装备文件会变得十分的难以维护。

3、经过Nacos实现注册中心

图解Nacos,注册中心演变 + Nacos核心功能

这种是最简略的Nacos注册中心,有若干个服务,都注册到Nacos注册中心,调用之前,先到Nacos获取对应接口,然后进行实际的调用。

可是,思考一个问题,假如Nacos宕机了,怎么办?假如从Nacos获取到接口后,调用服务2时,服务2宕机了,怎么办?

4、心跳版Nacos

图解Nacos,注册中心演变 + Nacos核心功能

心跳版Nacos,服务1和服务2和Nacos之间维护一个心跳联系,每5秒跳一次,频率不能太快或许太慢,否者会嗝屁的。

假如Nacos在5秒内没有收到心跳,则表明服务挂了,Nacos会下线此服务

对于超越15秒没有收到客户端心跳的服务实例,会将它的healthy特点置为false,客户端无法调用healthy为false的服务。

假如超越30秒没有收到心跳,Nacos会直接将此服务除掉

也能够经过服务端主动刊出的方法,停止注册。

服务1调用服务2时,服务1会经过守时使命到Nacos中获取在线的服务,确保所调用的服务一直都是健康在线的状况。

获取到之后,用缓存将其保存起来,然后经过负载均衡器调用服务2,此时,将不再运用服务端的负载均衡Nginx了。

三、Nacos Discovery

SpringBoot中引入Nacos Discovery,实现与Nacos的无缝衔接,Nacos Discovery能够将服务自动注册到Nacos服务端,而且能够动态感知此服务,并改写服务列表。并将服务的host、port、URL等信息注册到Nacos。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

Nacos 的装备项信息:

图解Nacos,注册中心演变 + Nacos核心功能

四、Nacos中心功用

图解Nacos,注册中心演变 + Nacos核心功能

1、服务注册

Nacos Client会经过发送REST恳求向Nacos Server注册自己的服务,供给自身的元数据,比如host、port、url等信息,Nacos Server在收到注册恳求后,会将这些数据信息存储在一个双层的内存map中。

2、服务心跳

服务注册后,服务顾客和Nacos Server之间会维护一个心跳,守时告诉server,此服务还活着,避免被除掉去。

3、服务同步

Nacos Server集群之间会互相同步已注册的服务,用来确保服务列表的一致性。

4、服务发现

服务顾客在调用服务供给者的服务时,会发送一个REST恳求到Nacos Server,获取健康的服务列表,然后将其缓存到本地,一同敞开一个守时使命,守时拜访Nacos Server,然后更新本地缓存。

5、服务健康检查

Nacos Server会敞开一个守时使命用来检查注册服务实例的健康情况,对于超越15秒没有收到客户端心跳的服务实例,会将它的healthy特点置为false,客户端无法调用healthy为false的服务,假如超越30秒没有收到心跳,Nacos会直接将此服务除掉。

五、作为注册中心

1、Nacos现在功用最全,用的也最多;

2、Eureka,因为挺更的原因,比较新的技能都不支撑了,现在许多公司都将Eureka换成Nacos了,不引荐运用;

3、Zookeeper,用的最多的当地就是和Dubbo一同运用,不支撑负载均衡战略,但能够经过其它组件实现;

4、Consul支撑的也许多;

CAP,C一致性,A可用性,P分区容错性

Nacos Eureka Zookeeper Consul
一致性协议 CP + AP CP AP CP
拜访协议 HTTP/DNS HTTP TCP HTTP/DNS
健康检查 TCP/HTTP/MYSQL/Client Beat Client Beat Keep Live TCP/HTT[/gRPC/Cmd
负载均衡战略 权重/metadata/Seletor Ribbon Fabio
雪崩维护
自动刊出 支撑 支撑 支撑 支撑
监听 支撑 支撑 支撑 支撑
数据中心 支撑 支撑 支撑 不支撑
跨注册中心同步 支撑 不支撑 不支撑 支撑
Spring Cloud集成 支撑 支撑 支撑 支撑
Dubbo集成 支撑 不支撑 支撑 支撑
K8S集成 支撑 不支撑 支撑 不支撑

六、作为装备中心

1、SpringBoot集成Nacos

Nacos运用key/value方式存储装备信息,为分布式体系中的外部化装备供给服务支撑。

(1)maven文件

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

(2)装备文件

spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
blog.name=哪吒编程
blog.language=java

(3)主方法发动类

@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
        String name = applicationContext.getEnvironment().getProperty("blog.name");
        String language = applicationContext.getEnvironment().getProperty("blog.language");
        System.err.println("姓名 :"+name+"; 拿手技能: "+language);
    }
}

2、支撑装备的动态更新

一秒改写一次。

@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
        while(true) {
            //当动态装备改写时,会更新到 Enviroment中,因此这儿每隔一秒中从Enviroment中获取装备
            String name = applicationContext.getEnvironment().getProperty("blog.name");
       	 	String language = applicationContext.getEnvironment().getProperty("blog.language");
        	System.err.println("姓名 :"+name+"; 拿手技能: "+language);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}

3、可支撑profile粒度的装备

4、支撑自定义 namespace 的装备

开发测验环境和出产环境的资源(如装备、服务)隔离等,比如dev和prod。

5、支撑自定义 Group 的装备

在没有明确指定 ${spring.cloud.nacos.config.group}装备的情况下, 默许运用的是 DEFAULT_GROUP 。假如需要自定义自己的 Group,能够经过以下装备来实现:

spring.cloud.nacos.config.group=DEVELOP_GROUP

6、装备优先级

profile > 默许装备文件 > extension-configs(下标越大优先级越高) > shared-configs(下标越大优先级越高)

7、@RefreshScope

一般都是经过@Value的方式读取装备文件中的信息,可是无法感知修正后的值,需要利用@RefreshScope动态改写。

8、Spring Cloud Config 横向比照Nacos

(1) Spring Cloud Config需要结合Git运用,动态变更需要配合Bus 消息总线来告诉所有的客户端改变;

(2)Spring Cloud Config没有可视化界面;

(3)Nacos运用长轮询更新装备,速度上秒杀Spring Cloud Config;