前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud Alibaba+Nacos 2.2.5.Release 的基本使用和采坑问

Spring Cloud Alibaba+Nacos 2.2.5.Release 的基本使用和采坑问

作者头像
IT大咖说
发布2022-06-24 18:10:17
1.2K0
发布2022-06-24 18:10:17
举报
文章被收录于专栏:IT大咖说IT大咖说

◆ 前言

Nacos 是构建以“服务”为中心的现代应用架构的服务基础设施, 支持几乎所有主流类型服务的发现、配置和管理,是目前微服务项目构建的主流服务注册组件。本 Chat 以构建商品中心项目为例,重点在于了解 Nacos 的作用和熟悉 Nacos 的使用。

项目搭建

搭建 Spring Cloud + Spring Cloud Alibaba+Spring Boot 项目,各组件版本的正确匹配是关键和 pom 文件的书写规范。

项目结构:商品中心。

依赖配置:

代码语言:javascript
复制
<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>goods-center</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.4.3</spring-boot.version>
        <spring-cloud.version>2020.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </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>
        </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>

controller:

代码语言:javascript
复制
package org.example.goodscenter.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author lifeng
 * @date 2021-07-05 08:51
 */
@RestController
public class GoodsController {
    @GetMapping("/goods")
    public String getGoods(){
        return "GoodsCenter";
    }
}

Nacos 作注册中心

添加依赖:

代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在 application.yaml 中添加配置:

代码语言:javascript
复制
server:
  port: 7001
spring:
  application:
    name: goodsCenter
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848

启动 Nacos 后,访问 http://localhost:8848/nacos/index.html。

启动商品中心,即可在 Nacos 服务列表看到:

Nacos 作配置中心

Nacos 配置文件

添加依赖:

代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

添加配置,新增配置文件 bootstrap.yaml。

代码语言:javascript
复制
spring:
  application:
    name: goodsCenter
  profiles:
    active: dev #激活开发环境配置
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848
      config:
        server-addr: http://localhost:8848
        file-extension: yaml #指定配置文件的拓展名
        group: DEFAULT_GROUP #指定配置文件所在组

Nacos 配置文件 dataId 的完整格式如下:

代码语言:javascript
复制
{prefix}-{spring.profile.active}.{file-extension}

prefix 默认为所属工程配置 spring.application.name 的值(即 goodsCenter),也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。

spring.profile.active 即为当前环境对应的 profile,当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 {prefix}.{file-extension}。

file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

controller 层:

代码语言:javascript
复制
package org.example.goodscenter.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author lifeng
 * @date 2021-07-05 08:51
 */
@RestController
public class GoodsController {
    @GetMapping("/goods")
    public String getGoods(){
        return "GoodsCenter";
    }

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

    @RequestMapping("/test")
    public String test() {
        return this.test;
    }

}

启动项目后访问:

默认公共配置文件

在启动文件中可以看到有 2 配置文件,goodsCenter.yaml 和 goodsCenter-dev.yaml,后者是我们指定的,前者是默认的公共配置文件。

创建远程公共配置配置文件:

controller 层添加:

代码语言:javascript
复制
    @Value("${testPublic}")
    private String testPublic;

    @RequestMapping("/testPublic")
    public String testPublic() {
        return this.testPublic;
    }

启动项目后测试:

共享配置文件

新建共享配置文件:

配置文件添加:

代码语言:javascript
复制
shared-configs: public-config.yaml
refresh-enabled: true

完整配置文件如下:

代码语言:javascript
复制
spring:
  application:
    name: goodsCenter
  profiles:
    active: dev #激活开发环境配置
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848
      config:
        server-addr: http://localhost:8848
        file-extension: yaml #指定配置文件的拓展名
        group: DEFAULT_GROUP #指定配置文件所在组
        shared-configs: public-config.yaml
        refresh-enabled: true

controller 层添加:

代码语言:javascript
复制
    @Value("${publicConfig}")
    private String publicConfig;

    @RequestMapping("/publicConfig")
    public String publicConfig() {
        return this.publicConfig;
    }

启动项目后测试:

配置的优先级

1. applicant.yaml 和 bootstrap.yaml

重启项目后测试:7001 有效,8001 不生效。

小结:优先级 application.yaml>bootstrap.yaml。

2. goodsCenter-dev.yaml(Nacos 远程指定配置)

重启项目后测试:9001 有效,其他配置中的 server.port 不生效。

小结:优先级 goodsCenter-dev.yaml >application.yaml,Nacos 远程指定配置大于本地。

3. goodsCenter.yaml(Nacos 远程默认公共配置)

重启项目后测试:9001 有效,其他配置中的 server.port 不生效。

小结:优先级 goodsCenter-dev.yaml >goodsCenter.yaml,Nacos 远程指定配置大于公共默认配置。

4. public-config.yaml(共享配置)

重启项目后测试:9001 有效,其他配置中的 server.port 不生效。

小结:优先级 goodsCenter-dev.yaml >public-config.yaml,Nacos 远程指定配置优先级大于共享配置。

小结

  • 优先级最高:goodsCenter-dev.yaml
  • 其他:application.yaml 的优先级高于 bootstrap.yaml

5. 如何使本地配置优先级大于远程指定配置

在远程配置中添加:

代码语言:javascript
复制
spring:
  cloud:
    config:
      override-none: true
      allow-override: true
      override-system-properties: false

Spring Cloud Config 本地配置覆盖远程配置的参数解释:

  • allow-override:决定 override-system-properties 是否启用,默认为 true,false=禁用用户的配置。
  • override-system-properties:用来标识外部配置是否能够覆盖系统属性,默认为 true。
  • override-none:当 allow-override 和 override-none 同时为 true,远程配置的优先级降低,不能覆盖其他配置。

重启项目后测试:7001 有效,其他配置中的 server.port 不生效

实现 Nacos 配置自动刷新

在上述操作中,远程配置修改后,需要重启项目才生效,如何实现修改配置后项目会自动刷新。

在启动类和控制层上添加注解 @RefreshScope:

常见错误

1. 无法读取到 bootstarp.yaml 配置:

代码语言:javascript
复制
Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'test' in value "${test}"

原因以及解决:spring-cloud-dependencies 较新的版本不再默认加载 bootstrap 文件,如果需要加载 bootstrap 文件需要手动添加依赖。

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

2. Nacos 启动后一直打印 ClientWorker 日志:

代码语言:javascript
复制
2021-07-18 21:55:05.007  INFO 15137 --- [ost_8848-public] c.a.n.client.config.impl.ClientWorker    : [fixed-localhost_8848-public] [data-received] dataId=goodsCenter-dev.yaml, group=DEFAULT_GROUP, tenant=public, md5=616c5228b3db5c750f58659592a8bca5, content=test: helloWorld!
server:
    port: 9001
spring:
  cloud:
    config:
      override-none: true
    ..., type=yaml

设置文件中,将 namespace 设置了 public,注释掉即可,其他原因可参考连接:

https://blog.csdn.net/qq_35425070/article/details/108191842

3.

代码语言:javascript
复制
java.lang.IllegalArgumentException: Param 'serviceName' is illegal, serviceName is blank

原因:没有设置 application.name。

总结

Nacos 使服务注册与发现更加简单便捷,是 SpringCloudAlibaba 的核心组件之一。实现了微服务项目间的配置共享,随着技术框架核心依赖版本的不断升级,Nacos 在使用上也有需要注意和更新的地方。Nacos 远程配置存在不同类型。本地配置和远程配置的优先级,以及远程共享配置的灵活使用会是的项目配置管理更加高效完善。

来源:

https://www.toutiao.com/article/6991734351201321484/?log_from=43775beb412e3_1654054643038

“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com

来都来了,走啥走,留个言呗~

 IT大咖说  |  关于版权

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ◆ 前言
  • ◆项目搭建
  • ◆Nacos 作注册中心
  • ◆Nacos 作配置中心
  • ◆Nacos 配置文件
  • ◆默认公共配置文件
  • ◆配置的优先级
  • ◆实现 Nacos 配置自动刷新
  • ◆常见错误
  • ◆总结
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档