Spring-Cloud-Nacos基础使用教程
简介
- 官网:Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网
- 三大特点:
- 动态配置服务:动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。
- 服务发现和管理:动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos 支持 DNS-Based 和 RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos 也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助 Nacos,您可以更容易地为您的服务实现断路器。
- 动态 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服务端
我们已经启动成功,接下来就是创建项目(客户端)连接服务端了创建项目步骤
创建
SpringCloud
项目,勾选Spring Web、Nacos Service Discovery、Nacos Configuration
依赖即可,Nacos Configuration是动态配置、Nacos Service Discovery是服务发现
去除
application.properties
文件中所有内容(正常业务功能用到的是写进去的),并且添加bootstrap.yml
配置文件,添加项目端口、项目名配置,以及nacos
配置信息创建
controller
测试接口,测试读取Nacos
中的配置文件中数据注意:还需要手动引入一个包,否则项目启动不会先扫描
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=liSi
与user-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=wangWu
与common.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
中
- 我们的项目要先有
spring-cloud-starter-alibaba-nacos-discovery
的依赖,如果上面创建项目的时候勾选了Nacos Service Discovery
则已经包含- 之前版本可能需要在启动类上添加注解
@EnableDiscoveryClient
,我这个版本不需要,加上也无碍- 修改
bootstrap.yaml
配置文件,添加discovery
配置- 在
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
里面,步骤如下
搭建mysql数据库,并且创建库
执行
nacos/conf/mysql-schema.sql
,把里面内容放到数据库中执行,创建表修改
nacos/conf/application.properties
文件,把如下这个地方修改为自己数据库配置,上面该解注的解注
启动
nacos
,查看数据查询是否正常,新增配置文件,对比表数据是否一致我这里全部配置完毕后,新增了一个配置文件
打开自己库中的
config_info
表里,可以看到自己创建的那条数据已经保存到库里了
五、nacos集群配置
- 通常情况,在
SpringCloud
多模块项目中,会有很多模块,甚至成百个模块共同使用一个nacos
服务- 而当
nacos
服务挂掉后,那么就会导致所有服务异常关停,并且启动失败,这样会导致整个项目瘫痪,是不可接受的- 那么我们就要给
nacos
配置集群模式,防止意外发生
1、nacos配置
nacos文件中,我们需要修改三个文件内容后重启即可
nacos>bin>startup.cmd
:修改启动模式
nacos>conf>application.properties
:修改启动端口
- 这里我在一台电脑上演示集群,并不是多台电脑部署,正式环境肯定多台,不需要修改端口
- 我这里
copy
了三份nacos
,端口分别改为8848\8858\8868
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
,重启项目,就会报错,启动不成功,访问接口是可以正常访问的,因为这些属性的值依然保留在内存中