🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解分布式系统的 Gossip协议 请看 : Gossip协议:分布式系统中的“八卦”传播艺术
其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等
如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning
前言:
上文我们了解到 Nacos 的作用,以及在本地启动 Nacos 的服务器,接下来,在本篇文件会详细的讲解 Nacos 的使用和配置。🎈
一、服务注册发现
整合 Spring Cloud Alibaba 的 Nacos 简单的很,直接启动 Alibaba提供的 Nacos 服务即可,这样就能让程序员把更多的经历放在核心业务上。
以下是一个简单的架构图:
接下来我要按照这个简单的架构图来讲解!
参考上面的架构图,需要创建两个模块,分别是nacos-provider
(服务提供者)、nacos-consumer
(服务消费者)
nacos-provider
:注册进入nacos-server,对外暴露服务nacos-consumer
:注册进入nacos-server,调用nacos-provider的服务
1、nacos-provider服务提供者创建
1. 添加 Maven 依赖
在pom文件中需要添加 spring-cloud-starter-alibaba-nacos-discovery
这个依赖,代码如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
这里没有指定版本是因为父模版指定了 spring-cloud-alibaba-dependencies
的版本,所以子模块直接引入依赖即可,因为这样能够更好地达到版本管理的效果。
具体还请看:【Spring Cloud Alibaba】:Nacos 入门讲解
2.配置YML文件
server:
port: 9901
spring:
application:
# 指定服务名称,在nacos中的名字
name: nacos-provider
cloud:
nacos:
discovery:
# nacos的服务地址,nacos-server中IP地址:端口号
server-addr: 127.0.0.1:8848
3.开启服务注册和发现功能
大部分 SpringBoot 引入了某些功能模块之后都要手动的在启动类添加@EnableXxxx
来开启某个功能,否则无法引入自动配置。这里开启服务注册发现功能的注解是:@EnableDiscoveryClient
@EnableDiscoveryClient //开启服务注册发现功能
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProvideApplication.class, args);
}
}
4.编写接口
由于 nacos-provider
作为服务的提供者,肯定是需要提供服务的,这里编写一个接口来供消费者服务。
@RestController
@RequestMapping("/nacos")
public class testController {
@GetMapping("/test")
public String test(){
return "调用了服务者提供服务接口";
}
}
5.启动项目
启动项目就是在项目的启动类中启动,点这绿色的小三角符号。
启动完成之后,可以在 Nacos 中查看是否以及进行了服务的注册,可以看到 nacos-provider 已经成功注册到了 Nacos 中。
2、nacos-consumer服务消费者创建
nacos-consumer
和 nacos-provider
步骤差不多
1.添加 Maven 依赖
在 nacos-consumer
服务的pom文件添加 spring-cloud-starter-alibaba-nacos-discovery
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.配置YML文件
server:
port: 9902
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
service-url:
nacos-provider: http://nacos-provider #微服务的访问名称
3.开启服务注册和发现功能
使用 @EnableDiscoveryClient
注解来开启服务注册和发现功能
@SpringBootApplication
@EnableDiscoveryClient //开启功能的注解
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
4.调用 nacos-provider 的接口
首先创建一个 RestTemplate ,将其注册到 IOC 容器中,然后添加@LoadBalanced
注解来开启负载均衡。
开启负载均衡前需要添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
public class AutoBeanConfig {
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
编写调用接口:
@RestController
public class ConsumerController {
@Resource
private RestTemplate restTemplate;
//获取配置文件中的微服务访问地址
@Value("${service-url.nacos-provider}")
private String servicePrivadeUrl;
@GetMapping("/test")
public ResponseEntity<String> test() {
return restTemplate.getForEntity(servicePrivadeUrl + "/nacos/test", String.class);
}
}
注意: 因为已经将 nacos-provider
注入到了 Nacos 中了,所以是可以直接通过服务名直接找到对应的服务的,而 servicePrivadeUrl
注入的就是服务名。
5.启动项目
启动之后就能看到 Nacos 中已经有两个服务了
然后进行接口的调用看看能不能调用成功,在浏览器中访问:http://localhost:9902/test
,可以看到调用成功了。
总结:可以看到,Nacos 的服务注册和发现是如此的简单。还不需要自己搭建注册中心,直接提供好了。
二、配置管理
为什么需要配置管理呢?🤔试想一下、如果你的一个线上项目想要修改某个配置,比如数据源变了,要添加新的数据源,这个时候修改完了应该怎么办?把项目停掉重启?你觉得这样做合理吗,显然是不合理的吧。
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
而 Nacos 一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
1、添加配置文件
首先,在 Nacos 添加配置文件,如下图步骤:
填写完配置信息之后,进行发布
Data ID是什么?dataId是一个配置的唯一标识,怎么取值呢?格式如下
${prefix}-${spring.profiles.active}.${file-extension}
- prefix:前缀,默认是
spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。 - spring.profiles.active: 即为当前环境对应的 profile。当
spring.profiles.active
为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项
spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties 和 yaml 类型。
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
2、拉取配置
创建一个模块,名叫 config-demo 父类为 ,来获取 Nacos 的配置内容
首先添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
创建一个 bootstrap.yml
文件,该文件是用来设置 Nacos 的配置,该文件会在 application.yml
之前被读取
配置如下
spring:
application:
name: nacos-config # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
根据配置文件的内容,他会去 Nacos 中读取作为 nacos-config-dev.yaml
的Data ID里面的内容,也就是我们上面在 Nacos 中添加的。
在 application.yml
文件设置改模块的端口为9903
server:
port: 9903
3、读取配置
创建一个 controller 来测试一下
@RestController
public class NacosController {
@Value("${datas.version}") //读取Nacos的配置信息
private String version;
@GetMapping("/test")
public String test(){
return "这是在Nacos中添加的配置信息: version = " + version;
}
}
启动项目,访问 http://localhost:9903/test
,结果如下:
恭喜你,读取 Nacos 的配置信息成功!🎉
但是目前还不能动态刷新(热更新), 也就是修改了 Nacos 中的配置信息,无需启动项目就能实时的读取新的配置信息。不相信?🤔那你请看!
不启动,重新访问 http://localhost:9903/test
那怎么才能实现热更新呢?别急,往下看!
4、配置热更新
方式一:添加 @RefreshScope 注解
在 @Value 注入的变量所在类上添加注解 @RefreshScope
重新启动项目,访问http://localhost:9903/test
修改 Nacos 中的配置信息:
再次访问http://localhost:9903/test
方式二:使用@ConfigurationProperties注解代替@Value注解。
添加一个类,来读取 Nacos 的配置信息
@Component
@Data
@ConfigurationProperties(prefix = "datas")
public class DatasProperties {
private String version;
}
然后再 controller 中使用这个类来代替@Value
重启应用,访问http://localhost:9903/test
修改 Nacos 的配置内容:
访问http://localhost:9903/test
5、多环境共享
其实微服务启动时,会去 nacos 读取多个配置文件,例如:
[spring.application.name]-[spring.profiles.active].yaml
,例如:userservice-dev.yaml[spring.application.name].yaml
,例如:userservice.yaml
而[spring.application.name].yaml
不包含环境,因此可以被多个环境共享。
1)添加环境共享配置
我们首先在 nacos 中添加一个 nacos-config.yaml
2)读取环境共享配置
在 nacos-config 服务中修改 DatasProperties 类,读取新添加的属性内容:
修改 controller 类的内容
3)运行两个ConfigApplication
复制一个 nacos-config 服务,修改端口号为,修改Active profiles,然后运行两个程序。
分别访问 http://localhost:9903/test
和 http://localhost:9904/test
可以看出来,不管是 dev
,还是 test
环境,都读取到了 content 这个属性的值。
4)配置共享的优先级
三、多环境配置隔离
一般在业务开发的时候,至少会有三个环境,也就是开发(dev),测试(test),生产环境(prod)。
每个环境肯定配置是大部分是不一样的,所以说,怎么才能很好的在不同的环境使用不一样的配置呢?🤔是的,Nacos 就能够很好的区分以上三种不同的配置。
那 Nacos 是如何区分的呢?答案就是 Namespace!
Namespace(命名空间):解决多环境及多租户数据的隔离问题 在多套不同的环境下,可以根据指定的环境创建不同的Namespace,实现多环境的数据隔离
查看配置信息所处在那个命名空间:
1、命名空间的创建
创建一个命名空间:
作者这里创建了3个不同的命名空间
创建完成之后,那应该怎么使用呢?怎么指定那个命名空间呢?答案就是: 命名空间ID
2、添加配置信息
首先在 dev
这个命名空间下添加配置信息
3、读取不同环境下的配置信息
修改配置文件 bootstrap.yml
配置完毕,启动项目,访问 http://localhost:9903/test
四、业务配置隔离
在实际项目中,是有很多的微服务的,不同服务之间的配置是不一样的,那这个时候如果都创建在一起,那会显得非常的臃肿,难以区分,Nacos 针对这个问题是如何做的呢?🤔
答案就是 Group,该单词大家都认识吧,也就是分组的意思。😁
Group:Nacos 中的一组配置集,是组织配置的维度之一,简单的说则是不同的系统或微服务的配置文件可以放在一个组里。Nacos如果不指定Group,则默认的分组是DEFAULT_GROUP。
对于有多个微服务而言,比如订单系统,用户系统,针对这两个不同的微服务,可以将他们单独的分为一个组,订单系统分在ORDER_GROUP
、用户系统分在USER_GROUP
。
1、创建配置信息指定Group分组
在命名空间 dev 环境下创建一个配置信息,指定分组
2、读取Group的配置信息
修改配置文件 bootstrap.yml
的内容
配置完成,启动项目,访问 http://localhost:9903/test
五、Nacos实现共享配置
共享配置,主要体现在随着项目中的微服务数量越来越多😣,而这些微服务多多少少都会有一些共同的配置,比如数据源信息啊。而这个时候我们就可以将这些共同的配置抽取出来,作为项目中共有的配置。
Nacos 就能很好的实现共享配置,接下来让我来带你一步一步地操作。😁
1、添加一个环境共享配置
注意: 因为我们是在public命名空间下创建的共享配置,所以在微服务的配置文件中不指定namespace的值默认就是读取在public命名空间下的配置信息
2、读取共享配置
修改 nacos-config 的配置文件 bootstrap.yaml
的内容
这里就通过 @Value
注解来获取 Nacos 的配置内容
启动项目,访问 http://localhost:9903/test1
注意: 如果共享配置信息放在了其他命名空间或者指定了分组,需要填写相应的namespace和Group
六、Nacos的持久化
Nacos默认使用的是内嵌的数据库 Derby
,如果想要更换数据库,比如 mysql
,也是非常简单的。
首先在 MySQL 中创建一个数据库,名为 nacos_config
(名字随意哈),然后执行 Nacos 提供的 SQL 脚本,在 Nacos 下载目录的 conf
文件夹下
SQL 脚本执行完成之后,生产的表如下:
然后修改配置文件的数据源
在配置文件中取消 MySQL 数据源的注释,配置成自己的数据源即可
修改完毕,重启 Nacos-server
七、Nacos集群的搭建
Nacos推荐集群模式部署,这样可以避免单点故障,官方给出的 Nacos 的集群图:
其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。
企业中大致会是这样的架构:
那如何搭建集群呢?
首先进入到 conf
文件下,找到 cluster.conf.example
文件复制一份并修改名称为 cluster.conf
放到当前目录下
修改内容如下:
192.168.124.1:8847
192.168.124.1:8848
192.168.124.1:8849
192.168.124.1就是你的服务器IP,:
后面的是Nacos的端口号
修改完成之后,将nacos文件复制两份
然后分别修改两个个文件夹中的application.properties
nacos1:
server.port=8847
nacos2:
server.port=8849
然后分别启动三个 nacos 节点,我这里先启动两个,来查看效果,双击 startup.cmd
文件
访问 http://localhost:8848/nacos
,点击集群管理,可以看到
但是一般会使用 nginx 来进行反向代理,这里就不演示 nginx 的搭建了。
nginx 配置文件的内容大致为:
upstream nacos{
server 192.168.124.1:8847
server 192.168.124.1:8848
server 192.168.124.1:8849
}
server{
listen 80;
location / {
proxy_pass http://nacos;
}
}
你以为这样就完了? 不,还没有完!
你既然搭建了集群,那肯定是要修改项目的 bootstrap.yaml
的
或者:
到目前为止,你已经掌握了Nacos的大部分知识了,该文章也告一段落了
拓展
Nacos 默认是 AP,但可以通过配置切换到 CP 模式。 选择哪种模式取决于你的业务需求。 如果对可用性要求更高,选择 AP;如果对数据一致性要求更高,选择 CP。
深入了解CAP知识请看:CAP定理和BASE理论 趣学!