前言
接着上章【SpringCloudAlibaba】,继续学习Nacos服务发现和配置管理
一、什么是Nacos?
Nacos和Eureka有着相同的能力,甚至更为强大,作为Dubbo 生态系统中重要的注册中心实现。官方对它有如下定义:
Nacos致力于帮助您发现,配置和管理微服务。它提供了一组简单有用的功能,使您能够实现动态服务发现,服务配置,服务元数据和流量管理。
Nacos使构建,交付和管理微服务平台变得更容易,更快捷。它是通过微服务或云原生方法支持以服务为中心的现代应用程序体系结构的基础架构。
这里我们看到Nacos不仅是服务发现组件,同时也是一个配置管理组件,也就是说它不仅可以用来取代Eureak作为注册中心, 也可以用来取代Spring Cloud Config 做配置统一管理。本篇文章意在探讨Nacos的服务注册与发现功能。
二、使用步骤
1.Nacos服务端安装和持久化
1.1Nacos服务端安装
官方提供了Nacos的服务端供我们下载使用,我们启动Nacos后将我们的微服务注册进入Nacos即可。
下载地址:https://github.com/alibaba/nacos/releases
启动Nacos:解压后,
windows执行bin目录下的startup命令 :startup.cmd -m standalone
linux 执行 :sh startup.sh -m standalone
访问Nacos,端口8848:http://127.0.0.1:8848/nacos/index.html ,用户名和密码都是:nacos
1.2 基于数据库持久化Nacos
找到nacos安装目录config/application.properties 文件,编辑数据库信息,修改内容如下
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456
找到config/ nacos-mysql.sql 文件 ,创建数据库 nacos-config,然后导入该sql脚本文件
2.客户端项目结构搭建
2.1 服务调用流程
我们这里要演示的案例是两个服务的通信,用户服务(user-server)作为服务提供者需要编写接口返回User实体对象,订单服务(order-server)作为消费者需要调用用户服务获取User实体对象,浏览器调用订单服务,订单服务调用用户服务或到User实体后返回给容器,用户和订单都注册到Nacos中,如下:
注意:这里的订单服务和用户服务都用到了User实体,所以为了让User实体共用,我们为User实体抽取了一个公共的user-common模块,用户服务和订单服务都去依赖这个模块即可使用User实体。
2.2 项目结构搭建
我们根据上面的图例来搭建项目环境,这里使用多模块方式演示,搭建父工程,提供者服务,消费者服务,以及公共的user-common模块,结构如下:
springcloudalibaba-parent
pom.xml
springcloudalibaba-user-common //公共的user实体,服务调用传输对象
springcloudalibaba-order-server-1020 //消费者服务
springcloudalibaba-user-server-1010 //提供者服务
- 父工程搭建
导入依赖:
<!--公共的一些配置-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!--SpringBoot-->
<parent>
<groupId> org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<!--SpringCloud-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
3.服务注册到Nacos
3.1.导入依赖
修改springcloudalibaba-user-server 导入Nacos服务注册和发现依赖
<dependency>
<groupId>com.alibaba.cloud </groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--加入WEB依赖是为了方便后面写Controller-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3.2.配置主配置类
创建配置类加上@EnableDiscoveryClient注解开启服务发现功能,代码如下
//服务注册与发现
@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class) ;
}
}
3.3.配置文件
配置文件主要配置端口,服务名,nacos注册中心地址
server:
port: 1010
spring:
application:
name: user-server
cloud:
nacos:
discovery:
server-addr: localhost:8848 #注册中心地址
4.服务启动和测试
启动服务提供者,观察Nacos服务列表 , user-server已经注册进去了
3.服务注册到Nacos
3.1 导入依赖
<dependency>
<groupId>com.alibaba.cloud </groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--加入WEB依赖是为了方便后面写Controller-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3.2 配置启动类
创建配置类加上@EnableDiscoveryClient注解开启服务发现功能,代码如下:
//服务注册与发现
@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class);
}
}
3.3配置yml文件
server:
port: 1010
spring:
application:
name: user-server
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #注册中心地址
运行启动类,就可以看到Nacos服务列表 ,user-server已经注册进去了
4.服务通信
服务通信可以使用Ribbon,OpenFeign,甚至Dubbo,使用方式和在SpirngCloudNetflix中没有任何区别。
三、Nacos统一配置管理
1. Nacos配置中心
1.2 Nacos添加配置
第一步:打开Nacos监控面板 - 进入配置列表 -点击 “+” 图标添加配置 如下:
第二步:填写Data ID,选择YAML,编辑配置文件内容
这里定义了一个名字为application-user-dev.yaml的配置,使用的是YAML格式。
- Data ID : 非常重要,可以看做是配置的文件的名字,在程序中拉取配置文件的时候需要指定Data ID。
- Group : 分组,默认是 DEFAULT_GROUP , 可以针对不同的项目指定不同的配置组。
2. 客户端接入配置中心
2.1 导入依赖
在工程 springcloudalibaba-user-server的pom中 ,添加配置中心依赖nacos-config,代码如下:
<!--配置中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.2 .编写Controller
Controller用来做配置刷新测试,对应了yml配置文件中的配置temp.notify项目。@RefreshScope注解是用来做配置自动刷新。那么当我们修改了Nacos中的配置文件,Controller中读取到的配置temp.notify将会自动变化。
@RefreshScope //刷新配置
@RestController
public class UserController {
@Value("${temp.notify}")
private String notify;
@GetMapping("/user/{id}")
public User getById(@PathVariable Long id){
System.out.println("测试配置notify="notify);
return new User(id,"zs:"+id, "我是zs");
}
}
2.3 修改yml配置
将原来的配置文件application.yml修改成bootstrap.yml,然后增加如下内容:
spring:
profiles:
active: dev #环境
cloud:
nacos:
config:
server-addr: localhost:8848 #配置中心
file-extension: yaml #配置文件格式
prefix: application-user #配置前缀 ,默认使用sring.application.name
group: DEFAULT_GROUP #默认分组
提示:客户端是如何从Nacos中找到配置文件的呢?
- spring.cloud.nacos.config.server-addr :配置了Nacos的地址
- spring.cloud.nacos.config.file-extension:指定了配置文件的格式为YAML,默认是properties,
- spring.cloud.nacos.config.prefix:配置前缀,如果不配置前缀默认会把 服务名即spring.application.name的值作为前缀
- spring.cloud.nacos.config.group :分组名,默认是DEFAULT_GROUP对应了Nacos配置中的Group
- spring.profiles.active:配置了环境为dev .该配置可以实现多配置多环境管理
根据如上配置,那么config客户端会将:前缀+环境+后缀 拼接成的文件名“application-user-dev.yaml” 去Nacos上查找是否有对应Data ID的配置文件。
2.4 注意
- 云端配置文件的后缀应该是 yaml而不是yml
- 客户端配置需要指定:spring.profiles.active=dev 环境名
- 客户端配置 :前缀 + 环境名 + 后缀应该和云端配置文件的DataId一致
3. 命名空间
命名空间可以用来隔离不同项目的配置文件,在Nacos中配置了命名空间后,那么Java客户端需要指定命名空间后才能拉取到该命名空间下的配置文件。
3.1.创建命名空间
添加命名空间如下:
这里建立了一个名字为“test”的命名空间,点击确定,然后你需要关注一下命名空间的ID,这个是需要在Java客户端进行配置的。如下:
3.2.在命名空间创建配置
进入配置列表 ,切换到新建立的命名空间“test”,然后创建配置,如下:
3.3.客户端配置
需要在bootstrap.yml中指定一下从哪个命名空间拉取配置:
spring:
cloud:
nacos:
config:
namespace: 8ef8c1e5-6d20-4efc-80c8-2b2c05541fa3 #命名空间的ID
注意:这里的namespace对应了 Nacos中“test”这个命名空间的ID,意思是从“test”这个命名空间去找 application-user-dev.yaml的配置文件。
总结
对 Nacos服务发现和配置管理 基础知识学习和了解。