当前位置: 首页 > article >正文

Spring-Cloud-Nacos基础使用教程

简介

  • 官网:Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网
  • 三大特点:
    1. 动态配置服务:动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。
    2. 服务发现和管理:动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos 支持 DNS-Based 和 RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos 也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助 Nacos,您可以更容易地为您的服务实现断路器。
    3. 动态 DNS 服务:通过支持权重路由,动态 DNS 服务能让您轻松实现中间层负载均衡、更灵活的路由策略、流量控制以及简单数据中心内网的简单 DNS 解析服务。动态 DNS 服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以消除耦合到厂商私有服务发现 API 上的风险。

一、动态配置服务

1、快速启动

  • nacos下载地址:Nacos Server 下载 | Nacos 官网
  • 下载好后解压,修改set MODE = "cluster" 集群模式为 set MODE = "standalone"单机模式,并且打开nacos/bin/startup.cmd(如果是windows系统的话)命令
  • 然后双击startup.cmd(如果是windows系统的话)命令启动项目
  • 启动完成后,在浏览器地址栏访问localhost:8848/nacos,如果能正常打开网页,则启动成功
  • 网页的账号密码默认都为nacos

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、搭配项目SpringCloud使用

  • 上面Nacos服务端我们已经启动成功,接下来就是创建项目(客户端)连接服务端了

  • 创建项目步骤

    1. 创建SpringCloud项目,勾选Spring Web、Nacos Service Discovery、Nacos Configuration依赖即可,Nacos Configuration是动态配置、Nacos Service Discovery是服务发现

      在这里插入图片描述

  1. 去除application.properties文件中所有内容(正常业务功能用到的是写进去的),并且添加bootstrap.yml配置文件,添加项目端口、项目名配置,以及nacos配置信息

  2. 创建controller测试接口,测试读取Nacos中的配置文件中数据

  3. 注意:还需要手动引入一个包,否则项目启动不会先扫描bootstrap.yml文件

    <!--springcloud2020 版本开始 Bootstrap默认是禁用的-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
    

2.1、bootstrap.yml文件

server:
  port: 9999

spring:
  application:
    name: study-nacos-service

  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        namespace: public # 命名空间 默认 public
        group: DEFAULT_GROUP # 配置文件所在组,默认 DEFAULT_GROUP
        file-extension: yaml # 配置文件类型,匹配文件会自动匹配 study-nacos-service(spring.application.name) + .yaml
        prefix: ${spring.application.name} # 配置文件名,默认 study-nacos-service(spring.application.name)值,完整格式:${prefix}-${spring.profiles.active}.${file-extension}

2.2、TestController文件

以下使用了两种读取方式

  • test:使用代码获取
  • test2(常用):使用@value+@RefreshScope注解获取
package com.tcc.studynacos.controller;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
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;

import java.util.Properties;
import java.util.concurrent.Executor;

@RestController
@RefreshScope // 添加以后,userName会根据nacos配置修改而修改
public class TestController {

    /** nacos 服务地址 */
    private static String serverAddr = "localhost:8848";
    /** 一般是项目名(spring.application.name) + .文件后缀(.properties/.yml) */
    private static String dataId = "study-nacos-service.yaml";
    /** 配置 所在的 组,默认是 DEFAULT_GROUP */
    private static String group = "DEFAULT_GROUP";

    @Value("${myuser.name}")
    private String userName;


    @GetMapping("test")
    public void test() throws Exception {
        Properties properties = new Properties();
        properties.put("serverAddr", serverAddr);

        ConfigService configService = NacosFactory.createConfigService(properties);
        String content = configService.getConfig(dataId, group, 3000);
        System.out.println(content);

        // 监听器,配置变更进入监听器的回调函数 订阅配置
        configService.addListener(dataId, group, new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
                System.out.println("recieve1:" + configInfo);
            }
            @Override
            public Executor getExecutor() {
                return null;
            }
        });

        // 测试让主线程不退出,因为订阅配置是守护线程,主线程退出守护线程就会退出。 正式代码中无需下面代码
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    @GetMapping("test2")
    public void test2() throws Exception {
        System.out.println(userName);
    }
}

2.3、study-nacos-service.yaml文件

在这里插入图片描述

2.4、测试效果

test接口

访问http://localhost:9999/test,然后查看控制台

在这里插入图片描述

test2接口

访问http://localhost:9999/test2,然后查看控制台

在这里插入图片描述

3、不同环境配置

  • 学过SpringBoot的都知道有一个配置spring.profiles.active,配置过后会先应用application.properties/.yaml,再应用application-xxx.properties/.yaml配置文件,并且后面的会覆盖前面的值

  • 现在多了一个bootstrap.properties/.yaml文件,那么就会复杂一些,大概如下

    在这里插入图片描述

  • 不止是代码里写的会应用到,并且nacos里面配置的study-nacos-service-dev.properties/yaml会应用到(这里是不区分是在bootstrap/application哪个里面写的),并且启动的时候也可以在控制台看到

    在这里插入图片描述

3.1、在nacos上添加study-nacos-service-dev.yaml配置文件

在这里插入图片描述

3.2、修改TestControllr测试接口

由于test接口方法不常用,只是用于演示,则删除,test2方法代替test方法

package com.tcc.studynacos.controller;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
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;

import java.util.Properties;
import java.util.concurrent.Executor;

@RestController
@RefreshScope // 添加以后,userName会根据nacos配置修改而修改
public class TestController {

    /** study-nacos-service.yaml 配置文件中的属性 */
    @Value("${myuser.name}")
    private String userName;

    /** study-nacos-service-dev.yaml 配置文件中的属性 */
    @Value("${common.username}")
    private String userName2;


    @GetMapping("test")
    public void test() {
        System.out.println(String.format("userName: %s, userName2: %s", userName, userName2));
    }
}

3.3、测试

请求http://localhost:9999/test,查看控制台测试结果,并且如果动态修改

在这里插入图片描述

如果我们动态修改了nacos上的配置属性值,那么可以当看到代码上会输出修改的详细信息

在这里插入图片描述

4、共享配置(shared-configs)

  • 指的是多个服务或应用可以共用的一套配置。这些配置通常是跨服务的基础设置,如数据库连接信息、第三方服务认证信息等,这些配置的变更会影响到所有依赖它的服务,因此保持集中管理和同步更新尤为重要。

  • 类型为数组,可以配置多个文件,多个文件的话,数组下标大的文件相同属性会覆盖掉前面下标小的的

  • 配置的加载顺序和优先级:主配置(user-service.yaml) > 扩展配置(user-service-extension.yaml) > 共享配置(common.yaml

  • 我这里演示,配置的common.yaml里面myuser.name=liSiuser-service.yaml里的myuser.name=zhangSan重复,验证优先级

  • bootstrap.yaml配置如下,如果配置多个,只需要在下面接着使用- data-id:xxx表示集合的下一项配置,学过yaml的语法的都知道

    在这里插入图片描述

4.1、nacos配置

user-service.yaml
myuser:
  name: zhangSan
  age: 18
common.yaml
myuser:
  name: liSi
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mydb
    username: root
    password: 123456

4.2、TestController

package com.tcc.user.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 // 添加以后,userName会根据nacos配置修改而修改
public class TestController {

    // 使用nacos中的配置
    @Value("${myuser.name}")
    private String userName;

    @Value("${myuser.age}")
    private String age;

    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    /**
     * 远程调用
     * @Author: tcc
     * @Date: 2025/1/21 10:37
     */
    @GetMapping("test")
    public void test() {
        System.out.println("userName:" + userName + ",age:" + age);
        System.out.println("数据库地址:" + url);
        System.out.println("数据库用户名:" + username);
        System.out.println("数据库密码:" + password);
    }
}

4.3、验证

访问http://localhost:8888/test,查看控制台输出,可以看到userName使用的是主配置user-service.yaml里面的值(zhangSan),并且数据库配置可以正常读取

在这里插入图片描述

5、扩展配置(extension-configs)

  • 指在基础配置之外,为特定服务或模块添加的额外配置集,通常针对一个服务,比如该项目需要单独修改共享项目中的数据库地址信息

  • 类型为数组,可以配置多个文件,多个文件的话,数组下标大的文件相同属性会覆盖掉前面下标小的的

  • 配置的加载顺序和优先级:主配置(user-service.yaml) > 扩展配置(user-service-extension.yaml) > 共享配置(common.yaml

  • 我这里演示,配置的user-service-extension.yaml里面myuser.name=wangWucommon.yaml的myuser.name=liSi和user-service.yaml里的myuser.name=zhangSan重复,验证优先级

  • bootstrap.yaml配置如下

    在这里插入图片描述

5.1、nacos配置

其他两个不变配置文件不变,user-service-extension.yaml配置文件如下

myuser:
  name: wangWu
myLogging:
  level:
    root: DEBUG

5.2、TestController

package com.tcc.user.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 // 添加以后,userName会根据nacos配置修改而修改
public class TestController {

    // 使用nacos中的配置
    @Value("${myuser.name}")
    private String userName;

    @Value("${myuser.age}")
    private String age;

    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${logging.level.DEBUG}")
    private String logLevel;

    /**
     * 远程调用
     * @Author: tcc
     * @Date: 2025/1/21 10:37
     */
    @GetMapping("test")
    public void test() {
        System.out.println("userName:" + userName + ",age:" + age);
        System.out.println("数据库地址:" + url);
        System.out.println("数据库用户名:" + username);
        System.out.println("数据库密码:" + password);
        System.out.println("日志级别:" + logLevel);
    }
}

5.3、验证

访问http://localhost:8888/test,查看控制台输出,可以看到userName使用的是主配置user-service.yaml里面的值(zhangSan),并且数据库配置可以正常读取

二、服务发现和管理

  • 服务发现一般是配合服务之间远程调用使用的,我们只需要在调用的时候,确定被调用者的服务名称+/xxx+参数即可
  • 这样在实际调用的时候,nacos会拿着服务名称去匹配注册在nacos里的所有服务,如果匹配到,则替换为服务对应的ip地址,
  • 如果有多个相同服务名注册(集群),那么则可以配合权重字段以及远程调用Dubbo/openFeign实现负载均衡的功能

1、将当前项目注册到nacos

  1. 我们的项目要先有spring-cloud-starter-alibaba-nacos-discovery的依赖,如果上面创建项目的时候勾选了Nacos Service Discovery则已经包含
  2. 之前版本可能需要在启动类上添加注解@EnableDiscoveryClient,我这个版本不需要,加上也无碍
  3. 修改bootstrap.yaml配置文件,添加discovery配置
  4. nacos上查看是否注册成功

1.1、bootstrap.yaml配置文件

改完记得重启

spring:
  application:
    name: study-nacos-service
  profiles:
    active: dev
  cloud:
    nacos:
      config: # nacos配置中心
        server-addr: localhost:8848
        username: nacos
        password: nacos
        namespace: public # 命名空间 默认 public
        group: DEFAULT_GROUP # 配置文件所在组,默认 DEFAULT_GROUP
        file-extension: yaml # 配置文件类型,匹配文件会自动匹配 study-nacos-service(spring.application.name) + .yaml
        prefix: ${spring.application.name} # 配置文件名,默认 study-nacos-service(spring.application.name)值
      discovery: # nacos服务发现
        enabled: true # 开启服务发现 默认为true
        server-addr: localhost:8848 # nacos地址
        namespace: public # 命名空间 默认 public


1.2、查看网页

在这里插入图片描述

在这里插入图片描述

2、新建两个模块(User/Shopping)

  • 重新创建两个项目,也可以创建两个模块(User/Shopping),模拟用户调用商品模块购买商品
  • 我这里创建了两个子模块的项目结构,方便演示
  • 项目(shopping)引入:web、nacos-discovery、spring-cloud-starter-bootstrap依赖即可
  • 项目(User)引入:web、nacos-config、nacos-discovery、spring-cloud-starter-bootstrap、openfeign、spring-cloud-starter-loadbalancer依赖即可

父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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.tcc</groupId>
    <artifactId>MySpringCloudProject</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>User</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.version>1.8</java.version>
        <spring-boot.version>2.6.13</spring-boot.version>
        <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
        <spring-cloud.version>2021.0.5</spring-cloud.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.1、shopping项目结构

2.1.1、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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- 根据自己父模块的pom.xml修改 -->
    <parent>
        <groupId>org.tcc</groupId>
        <artifactId>MySpringCloudProject</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.tcc</groupId>
    <artifactId>Shopping</artifactId>
    <name>Shopping</name>
    <description>Shopping</description>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--springcloud2020 版本开始 Bootstrap默认是禁用的-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <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>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.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>
</project>
2.2.2、bootstrap.yaml
  • 要先把application.properties里面东西全部删除,全部配置到bootstrap.yaml里面即可
server:
  port: 6666

spring:
  application:
    name: shopping-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos地址
        username: nacos
        password: nacos
        namespace: public # 命名空间 默认 public
2.2.3、启动类
  • 这里为了方便测试,直接把启动类当成Controller编写接口测试了
package com.tcc.shopping;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ShoppingApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShoppingApplication.class, args);
    }

    /**
     * 为了简单,写到启动类里面了
     * @Author: tcc
     * @Date: 2025/1/21 12:42
     */
    @GetMapping("getShopping")
    public String getShopping(@RequestParam("num") Integer num) {
        return "购买了:" + num + "个商品";
    }
}
2.2.4、启动项目
  • 项目成功启动后,查看nacos网页,查看shopping-service服务是否注册成功

在这里插入图片描述

2.2、User项目结构

2.2.1、pom.xml
  • 注意:要添加spring-cloud-starter-loadbalancer依赖,不然会报错
<?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">
    <parent>
        <groupId>org.tcc</groupId>
        <artifactId>MySpringCloudProject</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.tcc</groupId>
    <artifactId>User</artifactId>
    <name>User</name>
    <description>User</description>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--springcloud2020 版本开始 Bootstrap默认是禁用的-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 引入 openFeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!-- SpringCloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-starter-loadbalancer 了 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <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>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.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>
</project>
2.2.2、bootstrap.yaml
server:
  port: 8888

spring:
  application:
    name: user-service
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        namespace: public # 命名空间 默认 public
        group: DEFAULT_GROUP # 配置文件所在组,默认 DEFAULT_GROUP
        file-extension: yaml # 配置文件类型,匹配文件会自动匹配 study-nacos-service(spring.application.name) + .yaml
        prefix: ${spring.application.name} # 配置文件名,默认 study-nacos-service(spring.application.name)值
      discovery:
        server-addr: localhost:8848 # nacos地址
        username: nacos
        password: nacos
        namespace: public # 命名空间 默认 public
2.2.3、启动类
package com.tcc.user;

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

@SpringBootApplication
@EnableDiscoveryClient // 开启nacos 服务注册
@EnableFeignClients // 开启feign
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}
2.2.4、TestShoppingFeign
  • feign怎么使用,就不介绍了,Spring-Cloud-Feign-03
  • 注意:这里和shopping里定义的接口,如果是get请求一定要加@RequestParam注解,强制为get请求;如果是post,一定要加@RequestBody注解,强制为post请求,否则可能默认为post请求,报错,因为我这里定义的是get请求
package com.tcc.user.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient("shopping-service")
public interface TestShoppingFeign {

    @GetMapping("getShopping")
    public String getShopping(@RequestParam("num") Integer num);
}

2.2.5、TestController
package com.tcc.user.controller;

import com.tcc.user.feign.TestShoppingFeign;
import org.springframework.beans.factory.annotation.Autowired;
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 // 添加以后,userName会根据nacos配置修改而修改
public class TestController {

    // study-nacos-service.yaml 配置文件中的属性
    @Value("${myuser.name}")
    private String userName;

    // 这里要注入feign,使用@Autowired 或 @Resource都可
    @Autowired
    private TestShoppingFeign testShoppingFeign;

    /**
     * 远程调用
     * @Author: tcc
     * @Date: 2025/1/21 10:37
     */
    @GetMapping("test")
    public void test() {
        String shopping = testShoppingFeign.getShopping(3);
        System.out.println(userName + shopping);
    }
}
2.2.6、查看是否注册成功

在这里插入图片描述

2.2.7、访问接口测试

访问http://localhost:8888/test查看控制台是否正常输出

在这里插入图片描述

3、元数据

  • 当服务注册成功的时候,我们可以附带一些元数据信息,比如版本号、服务类型等,这些信息有助于更灵活地管理和使用服务

3.1、通过配置文件配置

bootstrap.yaml

在这里插入图片描述

启动服务,查看服务列表->详情

在这里插入图片描述

3.2、通过代码配置

  • 启动类添加如下代码,即可添加成功

在这里插入图片描述

三、功能总结

  • nacos共有如下三个分区

    在这里插入图片描述

  • 一般测试环境和生产环境的nacos会分开部署两套,并不会共用同一个服务

  • 通过上面案例可以发现

    • 动态配置服务:可以实现在网页上动态修改配置文件,项目并不用重启,会自动监听修改
    • 服务发现和管理:远程调用我们不必像传动那样http:// + ip + 接口地址,直接使用http:// + 服务名 + 接口地址ip是不能确定的,很有可能被修改的,但是服务名是在创建项目的时候确定的,基本不会进行修改!
  • 还有一个动态 DNS 服务,这个功能不常用,这里就不演示了,有需要的自行学习吧。

  • 下面内容为升级使用,如果你只使用的话,会上面两个功能即可;如果你要搭建的话,则需要了解下面的功能!

四、配置Nacos数据库

  • 我们现在使用的是Nacos内置数据库,要看数据什么的只能通过内置的网页查看,并且如果这个nacos文件夹丢失,则找不到所有配置了

  • 为此,我们需要搭建自己的数据库,以及nacos需要的表,sql文件在nacos/conf/mysql-schema.sql里面,步骤如下

    1. 搭建mysql数据库,并且创建库

    2. 执行nacos/conf/mysql-schema.sql,把里面内容放到数据库中执行,创建表

    3. 修改nacos/conf/application.properties文件,把如下这个地方修改为自己数据库配置,上面该解注的解注

      在这里插入图片描述

  1. 启动nacos,查看数据查询是否正常,新增配置文件,对比表数据是否一致

  2. 我这里全部配置完毕后,新增了一个配置文件

    在这里插入图片描述

  1. 打开自己库中的config_info表里,可以看到自己创建的那条数据已经保存到库里了

    在这里插入图片描述

五、nacos集群配置

  • 通常情况,在SpringCloud多模块项目中,会有很多模块,甚至成百个模块共同使用一个nacos服务
  • 而当nacos服务挂掉后,那么就会导致所有服务异常关停,并且启动失败,这样会导致整个项目瘫痪,是不可接受的
  • 那么我们就要给nacos配置集群模式,防止意外发生

1、nacos配置

  • nacos文件中,我们需要修改三个文件内容后重启即可

    1. nacos>bin>startup.cmd:修改启动模式

      • 在这里插入图片描述
  1. nacos>conf>application.properties:修改启动端口

    • 这里我在一台电脑上演示集群,并不是多台电脑部署,正式环境肯定多台,不需要修改端口
    • 我这里copy了三份nacos,端口分别改为8848\8858\8868
    • 在这里插入图片描述
  1. nacos>conf>cluster.conf:修改文件名,以及集群地址

    • conf目录下,有一个cluster.conf.example,我们手动把后面.example去掉,然后修改里面地址为你三个cos启动后的ip:+port,一般为内网ip,不使用127.0.0.1

    • 我这里三个全部配置为这三个地址

      在这里插入图片描述

  • 配置完成后全部重启

2、bootstrap.yaml配置

  • nacos中的server-addr配置原本是配了一个地址,如果配置集群的话,只需要在后面使用,拼接即可

在这里插入图片描述

3、验证

  • 我们需要先启动三个nacos集群服务
  • 然后编写接口,获取nacos中的配置文件数据
  • 最后一个nacos一个的停掉,中间查看是否能正常读取数据

3.1、启动nacos

在这里插入图片描述

3.2、TestController

package com.tcc.user.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 // 添加以后,userName会根据nacos配置修改而修改
public class TestController {

    // 使用nacos中的配置
    @Value("${myuser.name}")
    private String userName;

    /**
     * 远程调用
     * @Author: tcc
     * @Date: 2025/1/21 10:37
     */
    @GetMapping("test")
    public String test() {
        System.out.println("userName:" + userName);
        return userName;
    }
}

3.3、分别访问三个nacos网页

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.4、访问接口

三个全部启动,访问localhost:8888/test(测试项目接口)

在这里插入图片描述

在这里插入图片描述

停掉nacos,再次访问,查看控制台依旧正常,然后查看8858/8868页面显示的节点状态

在这里插入图片描述

停掉nacos2,再次访问,查看控制台依旧正常,然后查看8858/8868页面显示的节点状态

在这里插入图片描述

停掉nacos3,重启项目,就会报错,启动不成功,访问接口是可以正常访问的,因为这些属性的值依然保留在内存中


http://www.kler.cn/a/544419.html

相关文章:

  • MongoDB 是什么
  • 阿里云 DeepSeek 模型部署与使用技术评测
  • cv2.Sobel
  • 每日十题八股-补充材料-2025年2月12日
  • 【黑马点评】 使用RabbitMQ实现消息队列——3.批量获取1k个用户token,使用jmeter压力测试
  • 小白学网络安全难吗?需要具备哪些条件?
  • [MySQL]2-MySQL索引
  • TCP 和 UDP 可以绑定相同的端口吗?
  • 批量修改mysql字符串字段子字符串
  • Win10环境借助DockerDesktop部署Open web UI集成DeepSeek
  • 9、Python面试题解析:函数的用法和高级
  • STM32 HAL库 CANbus通讯(C语言)
  • 基于SpringBoot+Vue的求职招聘管理系统
  • 自然语言处理NLP入门 -- 第一节基础概念
  • 【嵌入式Linux应用开发基础】open函数与close函数
  • oracle dbms_sqltune 使用
  • Visual Studio Code 的 AI 编程助手
  • 概率论、组合数学知识点汇总
  • 加油口,电梯门的对称性对 TCP/IP 传输协议的启示
  • 通义灵码 2.0 全新升级,阿里云正式推出繁星计划
  • 云原生小记:负载均衡
  • 字节跳动后端一面
  • es凌晨自己把索引删除了,包括es自己的索引
  • 【STM32】输入捕获实现超声波测距
  • 大模型基本原理(四)——如何武装ChatGPT
  • 四、自然语言处理_08Transformer翻译任务案例