微服务-配置中心
微服务架构中存在很多服务,每个服务都有自己的配置文件,这些配置文件如果集成在服务中,也是难以维护的,于是便可以使用配置中心来管理这些配置文件。
nacos既可以作为 注册中心 ,也可以作为 配置中心 ,使用nacos配置中心,你可以将服务里的配置文件写在nacos上通过nacos面板来修改管理服务的配置而无需停止服务。
如果使用nacos作为注册中心而不作为配置中心,添加配置:spring.cloud.nacos.config.enabled =false 即可。
可以以请求方式发布、获取配置:
发布配置:post,http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld
获取配置:get,http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test
nacos服务端搭建是十分容易的,只需下载+配置+启动就行,参考注册中心这篇:点击前往
建议:使用mysql作为持久化。
客户端即每个配置要被管理的服务,服务的搭建还如往常一样搭建,只不过配置文件发生一些变化,以下就认为你已经创建了一个服务模块/项目,并以此起步。
1.客户端引入nacos config依赖:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
2.创建一个bootstrap.yml(或properties),配置nacos config的配置 :
spring:
cloud:
nacos:
config: #nacos的信息,添加后可以省略注册中心的nacos此类信息
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
contextPath: /nacos
#--------------------------
file-extension: yaml #显示的声明dataId文件扩展名
3.application.yml(或properties),除特殊配置外,只留下下面2个配置:
server:
port: 41150
spring:
application:
name: server-producer
到这里你会发现你有2个配置文件: bootstrap.yml、application.yml 。这时你可能就有疑问了,不是说好的将配置交给配置中心管理了吗,怎么服务里还变多了呢。
那么我来给你解释一下吧:
bootsteap.yml:这里只配置配置中心的信息,服务通过它去获取服务所需配置,而且这里的内容基本不变。
application.yml:这里只配置端口+服务名,因为首次启动服务时,需要通过它注册达到nacos,然后才能获取配置。
可以看出,上面的配置基本上就是固定的,而且基本上不会被修改,实际项目中配置文件远远不止这些,其他配置都将被放在配置中心统一管理。
4.在nacos配置中心添加配置文件 :
点击添加后页面如下:配置名要和服务名一致,后缀带不带都行。
第一次发布配置后,重启项目即可。之后修改配置都不需要启动服务。
服务与配置文件的匹配:
文件名=服务名,建议显示指定配置文件后缀。
多同名配置会互相覆盖,比如server、server.yml在指定yml格式后,两个文件会覆盖。
更多特性自己摸索,使用:服务名.yml 并 在bootstrap.yml指定格式为yaml 一定能用。
测试一下效果:按照阿里的示例进行举例。
在客户端创建一个测试类,并在nacos上配置中文件添加属性,然后注入到属性中,启动后控制台就会打印。
@Configuration
public class TestConfig {
@Value("${user.names}")
public String test1;
@Value("${user.pwds}")
public String test2;
@PostConstruct
public void getUser(){
System.out.println("name=" + test1 + "|pwd=" + test2);
}
}
启动后,会发现打印的数据就是配置中心上的数据了。
此节代码来自于:阿里云-知行动手实验室
配置发生变化后,服务中绑定的属性值将刷新,会刷新的情况有3种:
@RestController
@RefreshScope
public class NacosConfigDemo {
@Value("${user.name}")
private String userName;
@Value("${user.age}")
private int userAge;
@PostConstruct
public void init() {
System.out.printf("[init] user name : %s , age : %d%n", userName, userAge);
}
@RequestMapping("/user")
public String user() {
return String.format("[HTTP] user name : %s , age : %d", userName, userAge);
}
}
@RefreshScope
@ConfigurationProperties(prefix = "user")
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@RestController
@RefreshScope
@EnableConfigurationProperties(User.class)
public class NacosConfigDemo {
@Value("${user.name}")
private String userName;
@Value("${user.age}")
private int userAge;
@PostConstruct
public void init() {
System.out.printf("[init] user name : %s , age : %d%n", userName, userAge);
}
@PreDestroy
public void destroy() {
System.out.printf("[destroy] user name : %s , age : %d%n", userName, userAge);
}
@RequestMapping("/user")
public String user() {
return String.format("[HTTP] user name : %s , age : %d", userName, userAge);
}
}
nacos是配置中心也是注册中心,实现nacos的高可用和 注册中心 高可用一样。
namespace命名空间
nacos可以实现配置文件之间隔离,不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置,可以实现不同开发环境(开发、测试、生产等)配置文件的隔离。
创建命名空间也很容易
切换命名空间
创建后,在客户端bootstrap.yml添加如下配置进行绑定:
spring:
cloud:
nacos:
config:
namespace: c70a9f91-a687-427f-97bb-5a6e54289a6e
Group分组
在创建配置时可以指定分组,自定义分组在bootstrap.yml添加如下:
spring:
cloud:
nacos:
config:
group: DEVELOP_GROUP
自定义配置名
三种情况完整配置案例:
spring:
application:
name: myserver
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
extension-configs[0]: # 1.在默认组,不支持动态刷新
data-id: myconfig-1.yaml
extension-configs[1]: # 2.不在默认组,不支持动态刷新
data-id: myconfig-2.yaml
group: MY_GROUP
extension-configs[2]: # 3.不在默认的组,支持动态刷新
data-id: myconfig-3.yaml
group: MY_GROUP
refresh: true
总结:默认配置名+默认组时才会自动刷新,否则需指定refresh: true才自动刷新。
注意:
Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本文将通过大量的手绘图,给大家谈谈Spring Cloud微服务架构的底层原理。
实际上,Spring Cloud 是一个全家桶式的技术栈,包含了很多组件。本文先从其最核心的几个组件入手,来剖析一下其底层的工作原理。也就是 Eureka、Feign、Ribbon、Hystrix、Zuul 这几个组件。 EFRHZ