Nacos

Nacos注册中心和配置中心


Nacos 是 Alibaba 开发的用于微服务管理的平台,核心功能:服务注册与发现和集中配置管理。

  • Nacos 作为服务注册发现组件,可以替换Spring Cloud 应用中传统的服务注册于发现组件,如:Eureka、Consul 等,支持服务的健康检查。

  • Nacos 作为服务配置中心,可以替换 Spring Cloud Config、Apollo(阿波罗的分布式配置中心) 等。

为什么叫 Nacos?Naming 与 Configuration 的前两个字母的组合,最后的 s 代表 service 。从其命名也能看出其核心功能。

Nacos 的下载和安装


首先去 nacos 的 github 地址下载 release 安装包。下载地址

进入到 nacos/bin 目录下面,startup 命令用于启动 nacos ,shutdown 命令用于停掉 nacos 。

单模式启动一

  • windows 系统

执行 startup.cmd -m standalone 启动,单模式启动

  • linux/unix 系统

执行 startup.sh -m standalone 启动。

  • docker

编写docker-compose.yml文件 启动该文件 命令: docker-compose up

nacos:
  image: nacos/nacos-server:latest
  container_name: nacos-standalone-8848
  environment:
    - PREFER_HOST_MODE=hostname
    - MODE=standalone   #单机模式启动
  volumes:
    - ./8848/logs/:/home/nacos/logs   #前面是宿主机名  后面是容器目录名
    - ./8848/init.d/custom.properties:/home/nacos/init.d/custom.properties
  ports:
  - "8848:8848"

单模式启动二

1、修改startup.cmd文件

2、启动

  • windows 系统

执行 startup.cmd启动,单模式启动

  • linux/unix 系统

执行 startup.sh 启动。

运行界面

nacos 的默认服务端口是 8848 ,启动完成之后通过浏览器访问 nacos:http://192.168.1.44:8848/nacos/index.html

看到如下界面,需要登陆,默认的用户名密码都是 nacos ,登陆之后看到如下界面:

nacos 的单机 standalone 模式是开发环境中使用的启动方式,它对用户而言非常友好,几乎不需要的更多的操作就可以搭建 nacos 单节点。另外,standalone 模式安装默认是使用了 nacos 本身的嵌入式数据库 apache derby(Derby是一个Open source的产品,是一个小型的数据库) 。

注册中心


虽然 Eureka Server 会被我们用 Nacos 替换掉,但是我们仍会使用 Ribbon、OpenFeign 作为远程调用的基础组件。

微服务整合 nacos 服务发现:

  • spring-cloud-starter-alibaba-nacos-discovery 是 spring-cloud-alibaba-dependencies 子项目。所以它们的版本号都不需要我们手动维护,继承自父项目 dependencyManagement 中的定义。

  • 因为我们之前使用了 eureka ,所以用 nacos 的spring-cloud-starter-alibaba-nacos-discovery 将spring-cloud-starter-netflix-eureka-client 在 pom 文件中替换掉。

  • spring-cloud-starter-alibaba-nacos-discovery 也默认包含了 spring-cloud-starter-netflix-ribbon ,不需要单独引入 ribbon 。我们之前学习的所有的 ribbion 和 openfeign 相关的负载均衡、远程服务调用的知识在 nacos 下依然适用。

父POM文件

  • spring cloud alibaba version:2.2.5.RELEASE

  • spring boot version :2.3.11.RELEASE

  • spring cloud version:Hoxton.SR8

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <modules>
        <module>order</module>
        <module>gateway</module>
    </modules>
    <groupId>com.woniu</groupId>
    <artifactId>alibaba</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>alibaba</name>
    <description>Demo project for Spring Boot</description>
    <packaging>pom</packaging>
    <properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
        <spring.boot.version>2.3.11.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <dependencyManagement>
        <dependencies>
            <!--Spring Cloud alibaba的版本管理, 通过dependency完成继承-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
    
            <!--Spring Cloud的版本管理-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
    
            <!--SpringBoot的版本管理-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
    
        </dependencies>
    </dependencyManagement>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

模块POM

<dependency> <!-- 自动引入 Ribbon -->
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency> 
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在 application.yml(或 bootstrap.yml)中加入必要的服务注册中心信息配置(替换掉 eureka 相关配置):

spring:
  application:
    name: spring-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        username: nacos
        password: nacos

加上 @EnableDiscoveryClient 注解(去掉 @EnableEurekaClient 注解),开启 Spring Cloud 的服务注册与发现功能。spring cloud alibaba 遵守 spring cloud 规范,因此 @EnableDiscoveryClient 注解能激活、启用 nacos 的服务发现功能。

@SpringBootApplication
@EnableDiscoveryClient
public class SpringProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringProviderApplication.class, args);
    }
}

访问 Nacos 服务,通过 服务管理 -> 服务列表,看到我们注册的服务已经在列表中

zuul网关启动的时候,把springcloud-alibaba的版本升级到 2.2.5

服务注册中心相关概念和配置


微服务 group 分组

Nacos 的微服务分组概念,有两层含义:

  • 不同分组的微服务,彼此之间不能发现对方,也就不能进行远程服务调用。逻辑上,不同的分组意味着这是两个不同的独立项目。即微服务从配置中拉取到的注册表是微服务所在组的注册表。

  • 将微服务分组,方便我们查看,以及方便配置管理分类。

可以通过如下属性对微服务所属分组进行配置:

spring:
  cloud:
    nacos:
      discovery: 
        group: public_group

由于多个项目可能、可以使用同一个 nacos 作为注册中心,这种情况下,group 就是区分你我的标识,每个微服务从 nacos 上拉取的只有本组的注册表。 如果微服务没有指定组,默认分组是 default_group

示例:

spring:
  application:
    name: spring-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        username: nacos
        password: nacos
        group: public_group

配置中心


Nacos 作为配置管理中心,实现的核心功能就是配置的统一管理。

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

连接和使用配置中心

新建配置文件 bootstrap.yml ,新增 spring.cloud.nacos.config 节点配置,将服务指向正确的 nacos 服务端。

该配置文件中只保留 nacos 相关的配置即可,其他的配置放到 nacos 中统一管理。

注意,和 Spring Cloud Config 一样,连接配置中心的配置信息『 必须』写在 bootstrap.yml 配置文件中,而不是 application 配置文件中。 bootstrap 优先级高于apllication
server:
  port: 8180

spring:
  application:
    name: spring-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        username: nacos
        password: nacos
        group: public_group
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yaml   # nacos 配置文件后缀。注意是 yaml,不是 yml
        group: public_group  # 配置分组。未配置时,默认分组是 DEFAULT_GROUP

通过配置列表右侧的 + 按钮添加配置文件:

点击+之后

Data ID 是该配置文件在 Nacos 系统内的唯一标识。

在 Nacos Spring Cloud 中,dataId 的完整格式语法如下:

${prefix}-${spring.profile.active}.${file-extension}

  • prefix 的值默认与 spring.application.name (即服务名)的值相同。也可以通过配置项 spring.cloud.nacos.config.prefix 来手动配置,指定一个与 spring.application.name 不一样的值,不过一般不会动它。

  • spring.profile.active 即为当前环境对应的 profile ,如:xxx-service-dev.yml 中的 dev 就是指开发环境。

注意:当 spring.profile.active 为空时,对应的环境定义字符部分将不存在,即为 xxx-service.yml,而不是 xxx-service-.yml

  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。

注意,我们使用的『是 yaml 类型,不是 yml』。虽然二者是一个意思,但是『nacos 只认 yaml』。

Group 的值同 spring.cloud.nacos.config.group 的配置,界面填写的内容与项目中的配置二者『一定要统一』,否则无法正确读取配置,Group 起到配置『隔离』的作用。

入门案例

核心pom

<!--nacos配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

创建application.yml

servername: provider

创建bootstrap.yml

server:
  port: 8180

spring:
  application:
    name: spring-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        username: nacos
        password: nacos
        group: public_group
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yaml   # nacos 配置文件后缀。注意是 yaml,不是 yml
        group: public_group  # 配置分组。未配置时,默认分组是 DEFAULT_GROUP

controller类

@RestController
@RefreshScope
public class ProviderController {

    @Value("${server.port}")
    private String port;

    @Value("${servername}")
    private String servername;

    @RequestMapping(value = "/provider/{id}")
    public String provider(@PathVariable String id){
        if(id.equals("1")){
            throw new RuntimeException("异常");
        }
        return "provider id = " + id + "port = " + port + "  servername = " + servername;
    }
}

验证和动态刷新

执行以下代码进行验证:

如果想要实现动态刷新功能,那么在 @Value 所在的 @Component(@Controller、@Service、@Repository)上加上 @RefreshScope 即可实现动态刷新。

Nacos 的数据存储

Nacos 的数据是存储在它自带的内嵌 derby 数据库中的,数据文件就在 Nacos 的解压目录下的 data 文件夹中。

你也可以通过修改配置,让 Nacos 将它的数据存储在你指定的 mysql 数据库中。

Nacos 在它的 conf 目录下已经为你准备好了建表脚本:nacos-mysql.sql 。不过脚本中没有建库语句,为了后续配置简单起见,建议创建的库命名为 nacos 。

创建一个nacos数据库,然后在nacos的bin目录下找到nacos-mysql.sql文件,把该文件的建表语句拷贝mysql客户端下执行,注意要使用你刚才创建的nacos数据库下

create database nacos 
  DEFAULT CHARACTER SET utf8mb4 -- 乱码问题
  DEFAULT COLLATE utf8mb4_bin -- 英文大小写不敏感问题
;

在 conf 文件夹下的 application.properties 配置文件。从 31 行开始的一段配置就是数据库连接相关配置。把如下行数前面的注释去掉

spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

修改完 application.properties 配置文件之后,重启 Nacos,你会发现 Nacos 重新编程了一个『干净』的环境。

测试:登陆localhost:8848/nacos,在配置中心上新建一个配置,如:spring-provider.yaml,发现这个配置保存到了我们自己创建的nacos数据库里面

nacos集群配置

拷贝cluster.conf.example文件,并改名为cluster.conf

192.168.31.203:8848
192.168.31.203:8849
192.168.31.203:8850

直接双击启动启动脚本

微服务配置:

server-addr: 192.168.31.203:8848,192.168.31.203:8849,192.168.31.203:8850
spring:
  application:
    name: spring-provider
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.31.203:8848,192.168.31.203:8849,192.168.31.203:8850
        namespace: public
        username: nacos
        password: nacos
        group: public_group
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yaml   # nacos 配置文件后缀。注意是 yaml,不是 yml
        group: public_group  # 配置分组。未配置时,默认分组是 DEFAULT_GROUP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值