spring cloud alibaba - nacos简介

一 nacos简介

        nacos是spring cloud alibaba生态中非常重要的一个组件,它有两个作用:1)注册与发现中心;2)配置中心。

        在继续介绍nacos之前,先介绍一个理论,cap理论,在分布式系统中一致性(consistency),可用性(availability),分区容错性(partition tolerance)三者不可兼得。对C、A、P做一个简单的介绍:

        1、C(consistency):一致性,同一时刻的同一请求的实例返回结果相同,属于强一致性性,也就是说,在集群环境中,对外提供的服务信息是完全一致的,但是在效率上面可能会有一定的损耗;

        2、A(availability):可用性,所有实例的读写请求在一定的时间内可以得到正确的响应,它是弱一致性,可能在极短的时间内,不同实例获取到的信息是不一致的,但是服务可用并且最终数据是一致的;

        3、P(Partition tolerance):分区容错性,在网络异常的情况下,仍旧能够提供正常的响应,这是在微服务系统中必须要保证的;

因为P是分布式服务中必须要保证的,那么现在就是CP和AP的组合。

        nacos有注册中心的作用,我们常见的配置中心还有zk和eureka,他们的区别见下表:

配置中心 CAP理论 控制台
nacos CP/AP
zookeeper CP
eureka AP

nacos在启动时,默认是AP模式,可以通过以下指令将nacos变为CP模式,在我们经常使用的微服务中,我们是选择使用AP模式的,此时的所有实例都属于临时实例。临时实例和持久实例最显著的区别就是在健康检查发现服务有问题时,持久实例被标注为不健康,而临时实例会直接剔除。

curl -X PUT 'IP:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

二 nacos基本使用

1 nacos服务端

        接下来,介绍一下nacos的使用方式,nacos大体分为两部分:nacos服务端和nacos客户端,首先是nacos服务端,这一部分是不需要做任何改动,直接启动服务即可。有两种方式,一种是直接下载打包好的服务,直接通过命令运行即可;一种是下载nacos源码,然后进行启动(nacos是普通的spring boot项目)。

1.直接下载打包服务

        第一步,去nacos官网下载对应环境的服务端项目,下载地址是:Releases · alibaba/nacos · GitHub,但是需要注意一点,目前在nacos官网(Nacos 快速开始)中,推荐使用的nacos版本是2.0.3。

 根据环境的不同去下载不同的压缩文件,下载完毕以后进行解压,进入到bin目录

 根据不同的服务器环境,选择不同的脚本进行执行:

1)linux:

sh startup.sh -m standalone

2)windows

startup.cmd -m standalone

需要注意的是,后缀standalone指的是以单例的方式进行启动。

2.源码方式启动

        git源码地址:nacos源码地址,下载git项目,然后导入idea(或者其它开发工具),然后进行启动,需要注意的是在编译项目过程中会出现com.alibaba.nacos.consistency.entity包下的类找不到,此时再控制台执行mvn compile命令即可,等待编译完成即可启动项目。

D:\nacos>mvn compile

启动类在源码中的console模块下:

 启动项目以后,观察控制台,会打印访问地址以及项目启动信息,如下:

通过上面方式启动以后,访问控制台打印的访问地址,会出现一下页面:

nacos的用户名密码默认为:nacos/nacos,进行登录。

2 nacos客户端

        nacos服务端正常启动以后,接下来就是客户端的访问,用来介绍nacos的注册/发现中心以及配置中心,项目使用普通的spring boot项目。

1.注册/发现中心

首先项目中需要引入以下依赖:

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

然后在项目启动类中添加注解:

@SpringBootApplication
// nacos使用需要使用的注解
@EnableDiscoveryClient
public class SelfNacos9001Application {

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

}

接下来就是在配置文件中添加对应的配置信息,配置nacos服务端的相关地址:

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        # 注册中心地址
        server-addr: 172.30.10.103:8848

然后启动项目,打开nacos服务端的控制台,即可发现注册页面的注册信息了:

可以启动多个实例,就会发现实例数处会有相关的变化。nacos允许同一个服务注册多个实例,也就是说一个服务是可能存在多个节点,那么nacos客户端是如何确认在发生服务调用的时候,调用到哪个服务呢?答案是ribbon,nacos客户端已经自动继承了ribbon(负载均衡)。

2.配置中心 

首先需要引入以下依赖

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

然后在配置文件中添加以下配置

spring:
  profiles:
    # 当前环境,在真实项目中,一般分为多个项目,dev为开发环境
    active: dev
  application:
    # 项目名称
    name: nacos-provider
  cloud:
    nacos:
      config:
        # 注册中心地址
        server-addr: 172.30.10.103:8848
        # 配置文件后缀,即配置文件格式
        file-extension: yaml
        # 命名空间,在后续nacos配置中会出现该参数是如何获取的
        namespace: 4b57e563-2039-42f4-86b1-9c4c7cf58bfc

编写验证代码:

@RestController
@RequestMapping("/test")
// 动态刷新配置
@RefreshScope
public class NacosConfigTestController {

    @Value("${nacos.config}")
    private String configInfo;

    public String test(){
        return configInfo;
    }
}

        简单的客户端就开发完成了,接下来还需要在nacos服务端进行相关的配置,首先就是在上面代码中提到的命名空间,因为我们在真实开发中会存在多套环境,我们一般会使用nacos的命名空间来进行环境的划分(也可以使用分组实现,但是一般不推荐),下面先进行命名空间的新增,如下图:

         新增完以后,即可在命名空间这个栏目查询新增的命名空间的ID(这个ID如果进行自定义,则以自定义为准,否则就会自动生成,这里采用自动生成的方式),下图中红框内容即为配置到namespace节点的内容

       接下来就是在dev这个命名空间中创建配置文件,配置文件的名字是根据上面的配置信息进行命名的,规则是 {spring.application.name}-{spring.profiles.active}.{spring.config.file-extension},如果根据上面的配置,那么配置文件的名字就是nacos-provider-dev.yaml

 

 接下来就可以启动项目,然后进行验证了。

三 nacos集群

        nacos配置的相关信息是保存在哪里呢?我们会发现,当我们重启nacos服务以后,我们配置的信息还是存在的,就证明nacos不是将信息保存在内存中,nacos在默认情况下,是将这些数据会持久化到它的内嵌数据库中,它的内嵌数据库是derby数据库。

        那么当我们在部署nacos集群的话,如果每个nacos节点还是使用自己的内嵌数据库,就会面临一个问题:数据同步问题。其实nacos是支持外置数据库的方式,当我们使用外置数据库,这样就能解决不同数据库之间的数据同步问题。下面我们看一下如何使用外置数据库:

        第一步,进入到已经解压好的nacos文件夹下,进入到conf文件夹,这里面有两个重要文件,一个是application.properties,一个是nacos-mysql.sql

         第二步,在准备好的mysql数据库中,执行nacos-mysql.sql脚本文件,但是需要注意,该脚本文件中没有创建database的脚本,需要手动进行创建,然后在该database中执行上述脚本文件。

        第三步,修改application.properties文件,在该配置文件中找到下图对应的位置,然后将注释打开

         完成上面三步以后,启动nacos项目,nacos的相关配置信息就会存储到指定的mysql数据库中了。在我们进行nacos集群部署的时候,就可以将这个集群的数据存储到一个mysql集群中,就解决了数据同步问题,那么nacos的集群模型就如下图一样:

        

         外部请求访问slb代理或者nginx集群,然后再slb/nginx中配置nacos集群的负载,需要注意nacos集群不是主从结构,然后nacos节点将持久化数据保存到mysql集群中,然后各个nacos之间进行通信完成各个节点间的数据同步。

        nacos的集群配置非常简单,还是进入到conf文件夹下,然后复制一份cluster.conf.example文件,命名为cluster.conf,然后进行修改,如下图:

需要注意的是,nacos集群部署在linux系统中进行验证,验证时如果nacos节点是部署到一台服务器中时,需要去application.properties配置文件中修改端口号,还需要注意一点,nacos启动的时候会占用port+1000和port+1001进行grpc通讯,所以注意设置的端口值。

猜你喜欢

转载自blog.csdn.net/weixin_38612401/article/details/125292657