nacos安装
- 下载地址:https://github.com/alibaba/nacos/releases/tag/1.3.2,本文选择nacos1.3.2 windows版本;
- 解压之后双击startup.cmd即可启动nacos服务
- 启动成功界面如下
- 4.启动失败界面会一闪而过,常见问题有两种:1、db.num is null,2、Unable to start embedded Tomcat
解决办法:
a)本地新建nacos数据库,字符集utf-8,将/nacos/config/nacos-mysql.sql文件导入数据库 - b)修改**/nacos/config/application.properties**文件,将数据库设置为自己新建数据库地址
- c)修改/nacos/bin/startup.cmd文件,原文件为集群模式启动,修改为standalone单机模式启动
- 启动成功后运行http://localhost:8848/nacos,默认用户名和密码都为nacos,进入nacos
Nacos注册中心
- 新建父项目,pom文件如下
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.springcloud</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringCloud</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</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>
</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>
</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>
- 新建子项目provide1,pom文件如下
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.springcloud</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.springcloud</groupId>
<artifactId>provider1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider1</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
- 将application.properties文件重命名为bootstrap.yaml文件,添加配置
server:
port: 9001
spring:
application:
name: provide1
cloud:
nacos:
discovery:
server-addr: localhost:8848
- 在启动程序class上添加@EnableDiscoveryClient注解,目的是为了让注册中心能够发现,扫描到改服务。
- 启动项目,进入nacos控制台界面,provide1服务已成功注册至nacos
Nacos配置中心
- 添加privode1服务配置文件privode1.yml,点击发布
- 添加mysql.yml公共配置文件,点击发布
- 修改provide1服务中bootstrap.yaml文件, 引入provide1.yml配置文件,file-extension设置配置文件后缀名,可使用ext-config进行多文件配置,此处引入mysql.yml公共配置文件。
server:
port: 9001
spring:
application:
name: provide1
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yml
prefix: ${spring.application.name}
ext-config:
- dataId: mysql.yml
refresh: true
- 添加Provide01Controller,添加@RefreshScope注解,使该控制器bean范围内的配置都可实现springCloud热配置
@RefreshScope
@RestController
@RequestMapping("/provide1")
public class Provide01Controller {
@Value("${spring.datasource.driver-class-name}")
private String driver;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${user.age}")
private Integer age;
@GetMapping("/info")
public Map<String,Object> getDatasourceInfo(){
Map<String,Object> map = new HashMap<>();
map.put("driver",driver);
map.put("url",url);
map.put("username",username);
map.put("password",password);
map.put("age",age);
return map;
}
- 启动项目,浏览器输入http://localhost:9001/provide1/info,出现mysql.yml文件的信息,证明provide1服务已成功从nacos读取配置文件。
- 再次修改nacos控制台mysql.yml文件中age为18,点击发布后
privode1服务已成功刷新读取的配置文件并已重新热部署,再次刷新http://localhost:9001/provide1/info页面,age参数更新为18
Nacos配置中心namespace、group、dataId
1. namespace命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
2. group分组
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。说人话,就是可以分组,不同的系统或微服务的配置文件可以放在一个组里。比如用户系统和订单系统的配置文件都可以放在同个组中。
3. dataId
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。这个概念来自于官方文档,说人话就是配置文件的名字,相当于主键的作用
- 案例安排起来,新建命名空间prod与dev
- prod命名空间下添加,添加以下文件
- 在实际开发中,通常将开发环境与生产环境配置发布在nacos的不同命名空间内,这里使用spring.profiles.active进行配置文件区分,新建bootstrap-dev.yaml和bootstrap-prod.yaml,修改bootstrap.yaml配置,详细如下
bootstrap-dev.yaml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yml
# 指定命名空间
namespace: b9aabac5-fa08-4597-9a0a-61c9121b4509
# 指定分组,不写则默认为DEFAULT_GROUP
group: test
ext-config:
- dataId: mysql.yml
refresh: true
namespace: b9aabac5-fa08-4597-9a0a-61c9121b4509
group: DEFAULT_GROUP
bootstrap-prod.yaml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yml
namespace: 7e9cd221-8123-40d1-8375-e2301edbb276
group: test
ext-config:
- dataId: mysql.yml
refresh: true
namespace: 7e9cd221-8123-40d1-8375-e2301edbb276
group: DEFAULT_GROUP
bootstrap.yaml
server:
port: 9001
spring:
application:
name: provide1
profiles:
# 生产环境prod 开发环境dev
active: prod
项目结构如下
7. 修改控制器文件,运行项目
@RestController
@RequestMapping("/provide1")
public class Provide01Controller {
@Value("${spring.datasource.driver-class-name}")
private String driver;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${user.age}")
private Integer age;
@Value("${nacos.namespace}")
private String namespace;
@Value("${nacos.group}")
private String group;
@GetMapping("/info")
public Map<String,Object> getDatasourceInfo(){
Map<String,Object> map = new HashMap<>();
map.put("driver",driver);
map.put("url",url);
map.put("username",username);
map.put("password",password);
map.put("age",age);
map.put("namespace",namespace);
map.put("group",group);
return map;
}
}
- 再次进入http://localhost:9001/provide1/info页面刷新,可以看到,命名空间prod的配置文件参数已经被加载到privode1服务里面了,后面只需要对bootstrap-prod.yaml或者bootstrap-dev.yaml文件的 namespace参数以及group参数修改,就可以加载到不同的配置文件了!!!!!
完结
后面陆续踩坑:Feign、Sentinel、kafka、gateway、zipkin、Seata、Dubbo ,欢迎各位大佬指点!!!