SpringCloud:服务注册和配置中心-Nacos(2)

以前我们将所有的配置信息写到了GitHub上,用Config+Bus来进行自动刷新和动态的更新。现在我们可以直接把配置文件写进Nacos,然后再用Nacos做类似于config这样的功能,直接从Nacos上抓取我们的配置信息

Nacos作为配置中心——基础配置

主要是添加一个:nacos-config依赖

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

1.1 建module

cloudalibaba-config-nacos-client3377

1.2 pom

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud6</artifactId>
        <groupId>com.tinstu.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-config-nacos-client3377</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--web + actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--一般基础配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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>

</project>

1.3 yml

这里需要配置两个,一个bootstrap和一个application。
原因:Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
全局的放在:bootstrap.yml 自己的放在:application.yml

bootstrap:

微服务端口:3377,服务名nacos-config-client,注册进nacos:localhost:8848 作为配置客户端

bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置

# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

application:

application.yaml

spring:
  profiles:
    active: dev # 表示开发环境

bootstrap + application 就表示我要去配置中心找名为dev.yaml的文件。

1.4 主启动类

NacosConfigClientMain3377

package com.atguigu.cloudalibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

1.5 业务类

通过Spring Cloud原生注解@RefreshScope 实现配置自动更新

ConfigClientController

package com.atguigu.cloudalibaba.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

1.6 在Nacos中添加配置信息

Nacos中的匹配规则
理论:
Nacos中的dataid的组成格式与SpringBoot配置文件中的匹配规则
官网:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

注意nacos只识别yaml,不支持yml

最终公式:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
结果: nacos-config-client-dev.yaml

实操

配置新增:

1.7 测试

启动3377
发送请求:http://localhost:3377/config/info

自带动态刷新:修改nacos中的yaml配置文件,再次调用查看配置,发现配置刷新了。

2.3 Namespace+Group+Data ID三者关系?为什么这么设计?

类似Java里面的package名和类名,最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。

默认情况:
Namespace=public,Group=DEFAULT_GROUP, 默认Cluster是DEFAULT

Nacos默认的命名空间是public,Namespace主要用来实现隔离。
比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。

Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去

Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。

最后是Instance,就是微服务的实例

3. 三种方案加载配置

DataID,Group,namesapce

通过配置文件的active:group: namespace:来指定DataID,Group,namesapce

4. Nacos集群和持久化配置(重点)

集群官网文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

4.1 官网说明

1.架构图:

2.要将配置持久化到数据库中:MySQL

不用nacos内嵌的数据库

3.通俗易懂的Nacos集群架构图

4.重点说明:

重启Nacos后,以前的配置文件不会消失,Nacos默认自带的是嵌入式数据库derby,但是,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。每个nacos都有自己独立的嵌入式数据库,存放的数据不一致。
为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。

nacos支持的三种部署模式:

  • 单机模式:用于测试和单机使用
  • 集群模式:用于生产环境,确保高可用
  • 多集群模式:用于多数据中心场景

4.2 Nacos嵌入式数据库derby切换到mysql

Nacos默认自带的是嵌入式数据库derby,那么如果做集群时每个nacos都自带一个derby,那么就有三个存储配置稳健的数据库,显然数据的统一性存在问题。

windows单机版derby到mysql切换步骤

1.首先在nacos安装目录的conf目录下找到一个名为nacos-mysql.sql的sql脚本,然后执行
注意:数据库nacos_config需要自己创建

2.在conf目录下找到application.properties 末尾加入以下配置

spring.datasource.platform=mysql
 
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=GMT
db.user=数据库账号
db.password=数据库密码

3.重新启动nacos,可以看到是个全新的空记录界面,以前是记录进derby

在bin目录下的cmd 输入 startup.cmd -m standalone  执行,这里还是单机模式,只不过数据库从derby迁移到了mysql

重启之后之前的配置都没了,说明迁移成功

4.在naocs新建配置时,会自动保存到mysql数据库中

4.3 Linux版Nacos+MySQL生产环境配置

centos7/Ubuntu/ + maven(3.2+)+mysql(5.6.5+)+JDK1.8
预计需要1个Nginx+3个nacos注册中心+1个mysql

4.3.1 Nacos 下载Linux版

下载nacos-linux:https://github.com/alibaba/nacos/releases/tag/2.0.3 
解压: tar -zxvf nacos-server-2.0.3.tar.gz

4.3.2 集群配置步骤(重点)

(1) Linux服务器上mysql数据库配置

跟windows一样,linxu的nacos 在 /nacos/conf 目录下有一个nacos-mysql.sql的sql脚本
可以通过navcat客户端远程连接,然后执行。

(2) application.properties 配置

nacos/conf 下,修改内容:

#******************  单机模式支持mysql  *******************#
spring.datasource.platform=mysql
 
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=数据库账号
db.password=数据库密码

(3) Linux服务器上nacos的集群配置cluster.conf

梳理出3台nacos集器的不同服务端口号 3333 4444 5555

(4) 编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端口

nacos/bin 目录下有startup.sh,平时单机版的启动,都是./startup.sh即可。
集群启动,我们希望可以类似其它软件的shell命令,传递不同的端口号启动不同的nacos实例
命令:./startup.sh -p 3333 表示启动端口号为3333的nacos服务器实例,和上一步的cluster.conf配置的一致。
注意:2.0版本的-p被占用了,可以用大写P或者其他字母,刚改完浏览器会有延迟,过一会才会好。

修改前:

修改后:

然后分别执行开启3333、4444、5555三个nacos,成功开启nacos集群

(5) Nginx的配置,由它作为负载均衡器

nginx/conf 下nginx.conf文件为默认配置文件 启动nginx通过-c可以指定配置文件启动。我这里将原来的配置文件拷贝为nginx_nacos.conf

启动nginx,cd到nginx/sbin下 ,执行:

./nginx -c /usr/local/nginx/conf/nginx_nacos.conf

别忘了防火墙开启1111端口的访问

firewall-cmd --add-port=1111/tcp --permanent
firewall-cmd --reload

(6) 测试

测试通过nginx访问nacos,成功登陆

然后我们新建一个配置文件:

成功存到Linux的数据库中!

4.4 微服务cloudalibaba-provider-payment9002启动注册进nacos集群

修改9002的application.yml文件。

server:
  port: 9002

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
#        server-addr: localhost:8848 #配置Nacos地址,注册到Nacos
        server-addr: 192.168.190.134:1111 # 注册到nacos集群,通过nginx代理
# 做监控需要把这个全部暴露出来
management:
  endpoints:
    web:
      exposure:
        include: '*'

启动9002,注册成功

阅读剩余
THE END