本文编写一个程序来说下Nacos开发实战部分,nacos可以作为注册中心和配置中心来使用,在本文中都会说到,会编写对应的程序实例来说明。
文章目录
环境准备
nacos启动
本文不会说Nacos相关的概念与理论知识,以及如何安装nacos服务,如有需要,请自行查看博主的其他文章。启动nacos服务
进入nacos的控制面板
mysql数据库配置
当nacos作为配置中心的时候,需要将配置信息保存在数据库中进行持久化。我这里使用的nacos版本是1.4.3,mysql数据库的版本是8.0.13。
注意:nacos1.3.1版本以下与mysql8.0+会产生冲突。nacos1.4.3版本中默认是集群的形式来启动,如果是单机版本,请修改startup.cmd中的mode。
最后需要在配置文件中修改mysql数据库的连接信息,注意:nacos官方给的db.url可能启动不了。
根据nacos-mysql.sql数据库脚本建立对应的脚本信息
配置中心测试
启动nacos以后,打开nacos的控制面板,新建一个如下配置
查看数据库中对应的配置信息
项目管理规范
springboot,netflix和cloud alibaba之间有版本之间的对应关系,本文选择的版本如下
为了后续方便使用SpringCloud Alibaba进行开发, 首先创建一个pom类型的父项目, 主要用于项目技术栈版本管理, 创建一个maven项目,名称为spring-cloud-alibaba-example, 去除src文件, 修改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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ah.wideth</groupId>
<artifactId>spring-cloud-alibaba-example</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<com-alibaba-cloud.version>2.2.7.RELEASE</com-alibaba-cloud.version>
</properties>
<!--对项目版本进行管理-->
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${com-alibaba-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
后续创建的项目都放到此目录下, 只需要声明groupId和artifactId, 会自动引用父项目spring-cloud-alibaba-example的版本。与其说是父项目, 不如说是根项目: 因为下面每学习一个新的技术, 就会新建一个真正的父项目, 而在对应的父项目下面又会创建许多的子项目
Nacos服务发现与注册案例
项目结构层次图
创建一个父项目nacos-example, 修改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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-alibaba-example</artifactId>
<groupId>ah.wideth</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<packaging>pom</packaging>
<modules>
<module>provider</module>
<module>consumer</module>
</modules>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-example</artifactId>
<dependencies>
<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>
<!--解决nacos-client2.0报错的问题-->
<exclusions>
<exclusion>
<artifactId>nacos-client</artifactId>
<groupId>com.alibaba.nacos</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.4.1</version>
</dependency>
</dependencies>
</project>
服务提供者provider
创建服务提供者项目provider, 修改其pom文件, 创建配置文件application.yml, 启动类, 创建相关的controller。
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>nacos-example</artifactId>
<groupId>ah.wideth</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>provider</artifactId>
</project>
配置文件application.yml
server:
port: 8081
spring:
application:
name: nacos-provider
cloud: #nacos注册中心地址的配置法
nacos:
discovery:
server-addr: localhost:8848 # nacos 注册中心的地址
启动类
package ah.wideth;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/***
* 服务提供
* 者启动类
*/
@SpringBootApplication
@EnableDiscoveryClient //开启服务的注册与发现
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
System.out.println("服务提供者8081启动了!!");
}
}
controller
package ah.wideth.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/***
* 服务提供
* 者测试接口
*/
@RestController
public class ProviderController {
@GetMapping("/hello")
public String hello(){
return "hello nacos-provider-8081";
}
}
服务消费者consumer
创建服务提供者项目consumer, 修改其pom文件, 创建配置文件application.yml, 启动类, 创建相关的controller。
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>nacos-example</artifactId>
<groupId>ah.wideth</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consumer</artifactId>
</project>
配置文件application.yml
server:
port: 8082
spring:
application:
name: nacos-consumer
cloud: #nacos注册中心地址的配置
nacos:
discovery:
server-addr: localhost:8848 # nacos 注册中心的地址
启动类
package ah.wideth;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
System.out.println("服务消费者8082启动了!!");
}
}
config
package ah.wideth.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ConsumerConfig {
// 定义 RestTemplate Bean
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
controller
package ah.wideth.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
// 引入 RestTemplate 和 LoadBalancerClient
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/hello")
public String hello() {
// 根据服务名获取服务实例
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
// 发起调用,返回调用结果
return restTemplate.getForObject(serviceInstance.getUri() + "/hello" , String.class);
}
}
Nacos远程调用测试
本文简单使用RestTemplate来进行服务之间的调用,后续会继续使用nacos整合openFegin,和nacos整合dubbo来进行服务之间的调用。
登录nacos的图形化界面 http://localhost:8848/nacos
服务提供者调用测试
服务消费者调用测试
Nacos_EndPoint_配置项
Nacos Discovery 内部提供了一个 Endpoint, 对应的 endpoint id 为 nacosdiscovery。我们通过该 Endpoint,能获取到:
- 当前服务有哪些服务订阅者
- 当前应用 Nacos 的基础配置信息
endpoint 的设计背景
当 nacos server 集群需要扩缩容时,客户端需要有一种能力能够及时感知到集群发生变化。及时感知到集群的变化是通过 endpoint 来实现的。也即客户端会定时的向endpoint 发送请求来更新客户端内存中的集群列表。
下面将修改 Provider 子模块,实现 Nacos Discovery 对外暴露 EndPoint
修改 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">
<parent>
<artifactId>nacos-example</artifactId>
<groupId>ah.wideth</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>provider</artifactId>
<dependencies>
<!--服务监控 用于查看服务订阅者信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
修改 application.yml
server:
port: 8081
spring:
application:
name: nacos-provider
cloud: #nacos注册中心地址的配置法
nacos:
discovery:
server-addr: localhost:8848 # nacos 注册中心的地址
# Endpoint 本身对外界隐藏显示,我们需要在配置里面开启对 Endponit 的显示支持。
# exposure.include:对外界保留哪些 Endpoint,若是所有则使用* ;
management:
endpoints:
web:
exposure:
include: "*"
重启项目后访问:http://localhost:8081/actuator/
查看服务相关的信息:http://localhost:8081/actuator/nacosdiscovery
附上Nacos Discovery Stater 配置项(在application.yml配置)
Nacos配置中心案例
nacos中的几个概念
命名空间(Namespace)
命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间
配置分组(Group)
配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组
配置集(Data ID)
在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集
项目搭建架构
在 nacos-example 的基础上,搭建一个 config-client,用来搭建nacos 配置中心的案例测试,如下图
建 config-client 模块,并修改 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">
<parent>
<artifactId>nacos-example</artifactId>
<groupId>ah.wideth</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>config-client</artifactId>
<dependencies>
<!-- 加依赖 nacos-config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
<!--Spring Boot Maven 打包插件, 用于 java -jar jarPath -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
本地配置信息输出
在说配置中心之前,先写个小例子来输出yaml文件中的配置信息。添加配置(application.yaml):
test:
name: local-config
添加一个测试接口,用于输出配置值:
package ah.wideth.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/***
* 配置中心
* 测试接口
*/
@RestController
public class ConfigClientController {
@Value("${test.name}")
private String test_name;
@GetMapping("/getConfigInfo")
public String getConfigInfo(){
return test_name;
}
}
测试结果
成功输出了本地配置。
Nacos中新建配置
进入 Nacos 控制的配置列表页面:
Data ID 项填写服务名 config-client.yaml,配置格式选择 YAML,配置内容中填写:
test:
name: nacos-config
这里把配置的值改为了 “nacos-config”,用于与之前的 “local-config” 作为区分,然后点击页面底部的发布按钮。
服务整合Nacos配置
Nacos 配置的依赖在第一步已经添加好了,下面主要是修改配置。
首先,把之前的 application.yaml 文件名改为 bootstrap.yaml,这是因为 bootstrap.yaml 的优先级是最高的。
然后,在 bootstrap.yaml 中添加配置:
server:
port: 8888
spring:
application:
name: config-client
cloud:
nacos:
config: # nacos作为配置中心
server-addr: localhost:8848
file-extension: yaml
注意,现在服务本地配置文件中已经没有 “test.name” 这个配置项了。
重新启动服务,再次刷新页面
此次输出的值为 Nacos 中配置的 “nacos-config”,说明已经成功读取了 Nacos 中的配置信息。
现在需要说明一下服务为什么可以自动找到 Nacos 中的配置文件
服务启动时,会读取 bootstrap.yaml 中指定的 nacos config 服务器地址,然后根据 spring.application.name 配置项的值与 spring.cloud.nacos.config.file-extension 的值构造出 Data ID,由此就可以读取到 Nacos 中的配置文件了。
配置信息动态刷新
如果希望在 Nacos 修改配置之后,实例可以动态获取最新值,则需要添加一个注解 @RefreshScope。
代码如下:
package ah.wideth.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;
/***
* 配置中心
* 测试接口
*/
@RefreshScope
@RestController
public class ConfigClientController {
@Value("${test.name}")
private String test_name;
@GetMapping("/getConfigInfo")
public String getConfigInfo(){
return test_name;
}
}
重新启动服务。下面在 Nacos 控制台修改配置:
在现有值的后面添加了字符串 “-new”,以作为区分:
确认无误后,点击确认发布按钮。这样配置就修改完成了,下面刷新页面:
可以看到,已经变成了刚刚修改后的值。注意,修改配置后可没有重启服务,说明已经成功实现了配置的动态刷新。
访问指定环境下的配置文件
创建两个命名空间, 用于管理一个项目不同环境下的配置文件。分别为dev和pro。
命名空间创建后, 在配置列表中就可以选择对应命名空间,然后创建不同环境下的配置文件。在开发环境dev中新建配置。
修改bootstrap.yml
server:
port: 8888
spring:
application:
name: config-client
cloud:
nacos:
config: # nacos作为配置中心
server-addr: localhost:8848
namespace: 46ff6296-10dd-4cfb-86e0-b85b72b42198 #命名空间的ID
group: DEFAULT_GROUP
file-extension: yaml
profiles:
active: dev # 使用开发环境配置文件
测试访问结果
本文小结
本文详细介绍了nacos作为注册中心和配置中心是如何使用的,对掌握nacos有极大的帮助。