Spring Cloud Alibaba Nacos

Nacos: 注册中心、配置中心

一、安装Nacos

1. 下载安装nacos

1.1 nacos的版本需要配合项目中Spring Cloud Alibaba的版本使用

spring-cloud-alibaba版本对应关系

1.2 下载

下载地址

Spring Cloud Alibaba Nacos_第1张图片

1.3 本地单机版使用

解压,进入bin目录(nacos\bin),编辑startup.cmd设置为单机启动

rem set MODE="cluster"
set MODE="standalone"

双击startup.cmd启动nacos

1.4 服务器集群部署
  1. 解压nacos到不同机器的对应目录下,这里是/usr/local/nacos

    cd /usr/local
    tar -zxvf nacos-server-2.1.0.tar.gz -C /usr/local
    
  2. 进入nacos/conf目录下,修改application.properties的数据源配置,集群需要使用外置数据源

    vim application.properties
    

    把下面关于数据源的配置放开并修改

    #*************** Config Module Related Configurations ***************#
    ### If use MySQL as datasource:
    spring.datasource.platform=mysql
    
    ### Count of DB:
    db.num=1
    
    ### Connect URL of DB:
    db.url.0=jdbc:mysql://${数据库ip}:${数据端口号}/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=root
    db.password.0=123456
    
    ### Connection pool configuration: hikariCP
    db.pool.config.connectionTimeout=30000
    db.pool.config.validationTimeout=10000
    db.pool.config.maximumPoolSize=20
    db.pool.config.minimumIdle=2
    
    #*************** Naming Module Related Configurations ***************#
    
  3. cluster.conf.example改为cluster.conf,添加节点配置

    cp cluster.conf.example cluster.conf
    vim cluster.conf
    

    把下面的ip修改成集群的各个服务器的信息

    #
    # Copyright 1999-2021 Alibaba Group Holding Ltd.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #
    
    #it is ip
    #example
    ${ip1}:${port1}
    ${ip2}:${port2}
    ${ip3}:${port3}
    
  4. mysql创建nacos数据库,数据库名与上面配置的一致,导入sql文件,文件位置:conf/nacos-mysql.sql

  5. 如果出现内存不足:修改启动脚本bin/startup.sh的jvm参数

    JAVA_OPT="${JAVA_OPT} ‐server ‐Xms512m ‐Xmx512m ‐Xmn256 ‐XX:MetaspaceSize=64m ‐XX:MaxMetaspaceSize=128m"
    
  6. 进入bin目录,启动nacos

    sh start.sh
    nacos is starting with cluster
    nacos is starting,you can check the /usr/local/nacos/logs/start.out
    
  7. 查看日志

    tail -200f ../logs/start.out
    
    #出现以下内容即为启动成功
    INFO Nacos started successfully in cluster mode. use external storage
    
  8. 踩坑记录

    1. 数据源错误:

      • 检查配置文件内容是否配置错误

      • 检查数据库是否只支持本地连接

        select host from user where user = 'root';
        

        如果是localhost表示只能使用本地连接(127.0.0.1或者localhost),不能使用真正的ip连接

        修改:

        update user set host = '%' where user = 'root';
        
    2. 当在一台服务部署了连续端口号的nacos,如8848,8849,8850,启动正常的nacos端口号+1却启动不起来

      • 这是因为nacos2.0以后,集群部署不能使用连续的端口号,具体原因请自行查阅资料

        根据官方说明总结:
        8846启动占用9846、9847端口
        8847启动占用9847、9848端口
        8848启动占用9848、9849端口
        不难发现,8847会同时影响到8846和8848,所以才会出现奇怪的事情,且检查8847端口又看不出什么问题,因为问题不在8847而在9847和9848。

    3. nacos成功启动但是页面访问不到

      • 需要开放端口号

        #查看防火墙的状态,看看是否开启
        systemctl status firewalld
        #如果没有开启,那么开启防火墙
        systemctl start firewalld
        #查询指定端口是否已经开放 返回yes/no
        firewall-cmd --query-port=8848/tcp
        #如果返回no,添加指定需要开放的端口:
        firewall-cmd --add-port=8848/tcp --permanent
        #如果需要关闭端口
        firewall-cmd --remove-port=8848/tcp --permanent
        #重载入添加的端口
        firewall-cmd --reload
        # 查看所有打开的端口:
        firewall-cmd --zone=public --list-ports
        #查询指定端口是否开启成功
        firewall-cmd --query-port=8848/tcp
        
    4. nacos成功访问,但是项目启动报错Request nacos server failed

      • Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。

      • 端口 与主端口的偏移量 描述
        9848 1000 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
        9849 1001 服务端gRPC请求服务端端口,用于服务间同步等

2. 登录nacos客户端

账号密码都是nacos

Spring Cloud Alibaba Nacos_第2张图片

至此nacos已经安装完成


二、做注册中心 nacos discovery

1. 添加依赖

	com.alibaba.cloud
	spring-cloud-starter-alibaba-nacos-discovery

引入依赖应该注意和SpringBoot版本的兼容性,否则启动会报错

由于 `Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本:

查看最新版本去下面的github网站查看
版本说明-github

2. 在启动类添加@EnableDiscoveryClient注解 (spring-cloud-alibaba 2.2.9.RELEASE版本不需要了,具体从哪个版本开始我也不知道)
package com.example.nacos.discovery;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 
@SpringBootApplication
@EnableDiscoveryClient
public class NacosDiscoveryApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosDiscoveryApplication.class, args);
    }
}
3. 配置命名空间
4. 在bootstrap.yml中添加nacos服务的地址,以及注册中心的相关配置

bootstrap加载优先级高于application

spring:
  application:
    name: nacos-practise
  cloud:
    nacos:
      # 注册中心
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: ${namespaceID}
        #ephemeral: false         # 默认为true(临时实例),表示当服务宕机,超过心跳就会把实例剔除掉,设置为false表示不会被剔除掉
        #service: consumer        # 服务名称,默认取${spring.application.name},也可以通过该配置项配置
        #group: DEFAULT_GROUP     # 更细的相同特征的服务进行归类分组管理
        #weight: 1                # 权重,通常结合负载均衡策略,权重越高流量越大
5. 启动项目,登录nacos,进入对应的命名空间查看项目是否已经被注册进去了

三、做配置中心 nacos config

nacos config可以动态读取配置文件的值

1. 配置命名空间
2. 编辑配置信息

在Nacos-Server中新建配置,其中Data ID它的定义规则是:${prefix}-${spring.profile.active}.${file-extension}

  • prefix默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。
  • spring.profile.active即为当前环境对应的profile,可以通过配置项spring.profile.active来配置。
  • file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。目前只支持propertiesyaml类型。

注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

3. 项目添加依赖

	com.alibaba.cloud
	spring-cloud-starter-alibaba-nacos-config

引入依赖同样需要注意和SpringBoot版本的兼容性

4. 在bootstrap.yml中添加nacos配置
spring:
  application:
    name: nacos-practise
  profiles:
    active: practise
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      # 如果开启了权限,则必须要设置用户名和密码
      username: nacos
      password: nacos
      # 配置中心
      config:
      	# namespace必须是命名空间ID,如果是public命名空间,没有命名空间ID,则不配置此项
      	namespace: ${namespaceID}
      	prefix: ${spring.application.name}
      	# 文件扩展名,默认是properties;此处需要和 Data Id 配置的扩展名一致,即yaml-yaml;yml-yml
      	file-extension: yml
      	group: DEFAULT_GROUP
5. 多环境配置的三种方式
  1. 通过DataId和profiles实现
    在配置文件中指定spring.profiles.active = **,然后在nocas客户端新建对应的${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}配置来区分不同的环境。

  2. 通过Group实现
    为不同的环境新建不同的分组,然后在配置文件中指定spring.cloud.nacos.config.group=组名,这样也可以实现不同环境的区分。

  3. 通过Namespace实现
    这种方式是官方建议的方式,通过创建不同的命名空间使用不同的环境配置

  4. 最佳的配置方式
    Namespace:环境
    Group:项目
    Data Id:工程

6. 权限管理

如果使用权限管理,需要在nacos中的application.properties中开启权限

### If turn on auth system:
nacos.core.auth.enabled=true
7. 测试项目动态读取nacos配置文件中的数据

使用@Value获取的值需要使用@RefreshScope动态刷新配置信息
注意:@Scheduled定时任务里获取到的值不能动态刷新

8. 拓展

当微服务数量很庞大时,将所有配置都书写到一个配置文件中,显然不是太合适。对此我们可以将配置按照功能的不同,拆分为不同的配置文件。

例如:

数据库配置:

spring:
  datasource: 
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 123456

redis配置:

spring:
  redis:
  	database: 0

mybatis配置:

mybatis:
  mapper-locations: classPath:mybatis/mapper/*.xml
  configuration: 
  	log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
  	
pagehelper:
  auto-dialect: mysql

此时在nacos中可以配置三个Data Id :datasource.yml、redis.yml、mybatis.yml

项目配置文件:

spring:
  application:
    name: nacos-practise
  profiles:
    active: practise
  cloud:
    nacos:
      # 配置中心
      config:
      	server-addr: 127.0.0.1:8848
      	# 如果开启了权限,则必须要设置用户名和密码
      	username: nacos
        password: nacos
      	namespase: ${namespaceID}
      	prefix: ${spring.application.name}
      	file-extension: yml 
      	group: DEFAULT_GROUP
      	extension-configs:				# 优先级:后配置的 > 先配置的,也就是说后读取到的会覆盖前面读取到的
          - data-id: datasource.yaml
          	group: DEFAULT_GROUP   		# 默认为DEFAULT_GROUP
          	refresh: true   			# 是否动态刷新,默认为false
          - data-id: redis.yaml
          	group: DEFAULT_GROUP
          	refresh: true
          - data-id: mybatis.yaml
          	group: DEFAULT_GROUP
          	refresh: true

配置的优先级
配置中心有的优先使用配置中心的,没有则使用本地配置

目前提供了三种配置能力从 Nacos 拉取相关的配置

  • A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
  • B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
  • C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置

当三种方式共同使用时,他们的一个优先级关系是:A < B < C

你可能感兴趣的:(SpringCloud,nacos,spring,cloud)