1、Nacus 服务搭建及使用
2、Nacos 配置中心
3、Nacos 服务注册与发现之OpenFeign服务间调用
4、Spring Security & Oauth2 认证授权
5、网关(Gateway)的搭建及使用
6、网关(Gateway自定义断言和过滤器)
在《Nacos之服务注册与发现》中,针对 Nacos 的服务发现与注册做了简单介绍,但是 Nacos 也可以作为配置中心。
之前用 Spring Config 作为配置中心来使用,我们需要借助 git 或者其他存储服务来存放我们的配置,但是 Nacos 作为配置中心,使用起来很简单,也很方便。
在 服务注册与发现 一文中,对 Nacos 的启动做了简单介绍,现在直接使用。
首先我们需要在Nacos的 配置管理 > 配置列表中添加服务的配置,配置方式如下:
参数说明:
Data ID:就是我们的应用名称,也是 spring.application.name 的值 home-server。
Group:默认是 DEFAULT_GROUP,用于将我们的同一类配置文件区分管理,比如我把所有应用的本地测试环境配置都写到 local 组里面。
配置内容:就是我们需要配置的具体配置了,有多重配置方式可选,YAML 就是项目中的 yml 配置文件。
在 Nacos 配置页面配置好之后,我们需要在我们的应用中使用到这些配置,那就需要从配置中心拉取配置。
需要加入配置中心的依赖 jar 包,版本由父 pom 统一管理。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
虽说是配置都放在了 Nacos ,但是应用中还是要知道配置中心的地址才能去拉取服务需要的配置,但是配置中心的地址就不在 application.yml 中配置了,需要在 bootstrap.yml 中配置,因为 Spring Boot 加载配置是有优先级的,会 先加载 bootstrap.yml,然后在加载 application.yml 配置,所以在 application.yml 中的配置会负载从 Nacos 配置中心拉取到的配置。
测试类见下面,运行结果如图,已经拉取到了 test.value 的值了。
@SpringBootTest(classes = HomeApplication.class)
@RunWith(SpringRunner.class)
public class ConfigTest {
@Value("${test.value}")
private String value;
@Test
public void loadConfig(){
System.out.println("拉去到配置 test.value 的值是:" + value);
}
}
前面只对 Nacos 的配置中心使用做了简单的介绍,接下来对配置进行一个更深层次的说明。
Nacos 配置的 key 有三元素确定唯一性,Namespace 默认是空串,公共命名空间(Public,默认是 DEFAULT_GROUP),还有 Data ID / Service。
动态刷新配置时,会把配置更新到 Environment 中,所以当没秒获取一次配置的值时,主要修改了 Nacos配置 中心的值时,就会获取到最新的配置。
代码如下:
@SpringBootApplication
@EnableFeignClients
public class HomeApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(HomeApplication.class, args);
while (true){
String testValue = context.getEnvironment().getProperty("test.value");
System.out.println("动态获取到 test.value 的值是:" + testValue);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
获取到的配置打印如下图:
从截图中,可以看到先是打印 first, 当我从 Nacos 改成 second,则会立刻刷新配置并且拿到修改后的值。
Nacos Config 在加载配置的时候,不仅加载了 Data ID是 {spring.application.name} . {file-extension:properties} 为前缀的配置,还加载了 {spring.application.name} . {profile} . {file-extension:properties} 为前缀的基础配置,在工作中都会遇到 dev, sit, uat, prod 等多个环境的时候,那么我们就可以用 ${spring.profiles.active} 参数来指定加载的配置。
注意:特别要注意,在 Nacos 添加类似 {spring.application.name} . {profile} . {file-extension:properties} 配置的时候,一定要注意需要在名称加上后缀,比如:user-server.yaml,不能省略掉后缀直接写成 user-server,这样是不会 Nacos Config 是不会加载到的,类似如下配置:
bootstrap.yml 中添加如下配置,或者是在 启动是传入参数都行。
spring.profiles.active: sit 则指定读取 user-server-sit.yaml 配置。
spring:
application:
name: user-server
cloud:
nacos:
config:
server-addr: localhost:8848
group: local
file-extension: yaml
profiles:
active: sit
Namespace配置比较简单,只需要在 Nacos 命名空间新加一个空间名称(比如:localtest),然后在 bootstrap.yml 中指定 namespace 的 id 即可,配置如下:
spring:
application:
name: user-server
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: e0d82135-7163-4820-a8f5-24f434977fa1
file-extension: yaml
Group配置也简单,首先 Nacos 在新 添加配置 的时候,指定 group(默认是:DEVAULT_GROUP),然后在 bootstrap.yml 中指定 spring.cloud.nacos.config.group 即可。
Data ID 是组织划分配置的维度之一,Data ID 通常用于区分系统的配置集,每个配置集都可以被一个有意义的名称标识,通过自定义动态 Data ID 配置,可以解决多个应用之间共享配置的问题,还可以支持一个应用有多个配置文件。
配置一个 spring.cloud.nacos.config.shared-configs[0].data-id: common.yaml,组是默认值。
spring:
application:
name: user-server
cloud:
nacos:
config:
server-addr: localhost:8848
group: local
file-extension: yaml
shared-configs[0]:
data-id: common.yaml
group: DEFAULT_GROUP
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(UserApplication.class, args);
String property = context.getEnvironment().getProperty("env.name");
System.out.println("当前环境为:" + property);
String username = context.getEnvironment().getProperty("common.username");
System.out.println(username);
}
}
spring:
application:
name: user-server
cloud:
nacos:
config:
server-addr: localhost:8848
group: local
file-extension: yaml
shared-configs[0]:
data-id: common.yaml
group: DEFAULT_GROUP
extension-configs[0]:
data-id: extension.yaml
group: DEFAULT_GROUP
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(UserApplication.class, args);
String property = context.getEnvironment().getProperty("env.name");
System.out.println("当前环境为:" + property);
String username = context.getEnvironment().getProperty("common.username");
System.out.println("获取到共享配置为:"+username);
String productCode = context.getEnvironment().getProperty("extension.product");
System.out.println("获取到扩展配置为:"+productCode);
}
}
Nacos Config 提供了三种配置可从配置中心拉取到配置
1、通过内部相关规则(应用名、应用名+yaml)自动生成 Data ID 配置。
2、通过spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置
3、通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
当三种方式同时存在是,它们的优先级为 1 > 2 > 3
优先级从高到低:
1、nacos-config-product.yaml 精准配置
2、nacos-config.yaml 同工程不同环境配置
3、 ext-config: 扩展配置
4、shared-dataids:共享配置
此注解使用方便,只需要加到有 @Value() 的类上,就可以动态刷新被 @Value() 标注字段的值。
@RestController
@RequestMapping("/index")
@RefreshScope
public class IndexController {
@Value("${user.token}")
private String token;
@GetMapping("config")
public String config(){
return token;
}
}
修改 Nacos 配置的参数,token 的值就可以动态被刷新。
Nacos 默认是将配置存储到文件中,如果 Nacos 不搬家还行,但是 一旦 Nacos 移到别处或者是 服务器 出问题,那么你的配置则全部丢失,系统不就瘫痪了,而且 Nacos 如果是自动化部署指不定部署到那台服务,所以配置很容易丢失,那么就需要把 Nacos的配置持久化到指定的数据库才安心。
只需要开启 database 即可,这里有个坑的点就是,即使是 用户名 和 密码 配置错了,也会报 No Datasource set 错,所以要小心配置。