Spring Cloud Alibaba Nacos

Nacos: 注册中心、配置中心

一、安装Nacos

1. 下载安装nacos

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

spring-cloud-alibaba版本对应关系

1.2 下载

下载地址

往下拉,看到最稳定版本

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)基础上,进行一定偏移量自动生成。

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

2. 登录nacos客户端

账号密码都是nacos

nacos登录页面

至此nacos已经安装完成


二、做注册中心 nacos discovery

1. 添加依赖
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

引入依赖应该注意和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. 项目添加依赖
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

引入依赖同样需要注意和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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring CloudSpring Cloud Alibaba都是基于Spring Framework的开源框架,用于构建分布式系统和微服务架构。它们都提供了一系列的组件和工具来简化微服务开发和管理。 Spring Cloud是一个由Pivotal团队维护的项目,它集成了Netflix开源的一些组件,如Eureka作为注册中心、Ribbon作为负载均衡器、Feign作为服务调用工具等。同时,Spring Cloud还提供了其他功能,如Config Server用于动态管理配置、Gateway用于构建API网关等。 而Spring Cloud Alibaba则是阿里巴巴开源的项目,它在Spring Cloud的基础上进行了扩展和定制,增加了一些阿里巴巴自己的组件和工具。比如,它使用Nacos作为注册中心和配置中心,使用Sentinel作为熔断降级工具。 总的来说,Spring CloudSpring Cloud Alibaba都是用于构建微服务架构的框架,它们的区别在于Spring Cloud集成了Netflix组件,而Spring Cloud Alibaba集成了阿里巴巴的一些组件。根据具体的需求和技术栈选择使用哪个框架可以更好地满足开发和管理微服务的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Cloud AlibabaSpring Cloud的区别](https://blog.csdn.net/weixin_43888891/article/details/126653270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值