首先说明版本,我使用的spring cloud alibaba是较新的版本,遇到一些问题网上很难找到对应的解答。
版本:
spring boot、spring cloud alibaba以及使用的依赖的版本(可以略过)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<alibaba-spring-cloud.version>2.2.0.RELEASE</alibaba-spring-cloud.version>
<discovery.version>6.0.1</discovery.version>
<alibaba-nacos.version>2.1.0.RELEASE</alibaba-nacos.version>
<spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
<spring.redission.version>3.12.5</spring.redission.version>
<swagger.version>2.9.2</swagger.version>
<spring-boot.mybatis>2.1.2</spring-boot.mybatis>
<alibaba.druid>1.0.16</alibaba.druid>
</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>${alibaba-spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>discovery-plugin-starter-nacos</artifactId>
<version>${discovery.version}</version>
</dependency>
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>discovery-plugin-strategy-starter-service</artifactId>
<version>${discovery.version}</version>
</dependency>
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>discovery-plugin-config-center-starter-nacos</artifactId>
<version>${discovery.version}</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>${spring.redission.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${spring-boot.mybatis}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${alibaba.druid}</version>
</dependency>
</dependencies>
</dependencyManagement>
目标1:使用nacos实现读取配置
nacos和服务相关配置:
server:
port: 41111
servlet:
context-path: /customer
spring:
application:
name: yuyang-customer
cloud:
nacos:
config:
group: applications
file-extension: yml
encode: UTF-8
refresh-enabled: true
config-retry-time: 3
profiles:
active: dev
接下来我们看一下nacos配置中心的配置文件有哪些
通过nacos配置读取规则=dataId-group.后缀的方式,我们知道这个配置是可以被读取到的,下图可以说明配置是正常可以读取到的
总结:nacos作为配置中心读取配置,规则还是比较简单的。那么问题来了:一般我们会将多个服务的公共配置存放到一个配置项里,作为多个服务公共的配置。
目标2:使用nacos实现多配值文件读取
首先我们先在nacos控制台添加一个公共的配置
你会发现有个比较不太和谐的groupId:yuyang.yml。是的没错,就是这么恶心,不这么写,没有办法读取到这个配置。这就是因为shared-configs里的dataId要求必须加后缀造成的。
配置里的内容,都是些公共配置:
feign:
httpclient:
enabled: false
okhttp:
enabled: true
sentinel:
enabled: true
spring:
application:
strategy:
sentinel:
enabled: true
cloud:
sentinel:
enabled: true
transport:
dashboard: xxxxx:xxx
heartbeat-interval-ms: 5000
port: 32223
log:
dir: \logs\sentinel\csp
switch-pid: true
redis:
host: www.javaavaj.com
lettuce:
pool:
max-active: 50
max-idle: 11
max-wait: 10000
password: yuyang
port: 31111
timeout: 3000
datasource:
url: jdbc:mysql://xxxxx:xxx/scyuyang?useSSL=false&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&autoReconnect=true
username: root
password: yuyang
maxActive: 100
initialSize: 2
minIdle: 8
maxWait: 60000
testOnBorrow: false
testWhileIdle: true
testOnReturn: false
management:
endpoints:
web:
exposure:
include: '*'
nacos中已经提供了共享配置的配置(有点绕),我们修改一下服务里面的配置:
server:
port: 41111
servlet:
context-path: /customer
spring:
application:
name: yuyang-customer
cloud:
nacos:
config:
group: applications
file-extension: yml
encode: UTF-8
refresh-enabled: true
config-retry-time: 3
# 老版本shared-dataids 在这里已经被废弃
shared-configs[0]:
# data-id要求必须有后缀名(这个要求很正常,但是配合配置中心一点也不好用)
data-id: yuyang.yml
group: applications
refresh: true
profiles:
active: dev
shared-configs 就是我们要配置的属性,我们来看一下这个配置项的源码类型,更清晰一些
@ConfigurationProperties("spring.cloud.nacos.config")
public class NacosConfigProperties {
public static final String PREFIX = "spring.cloud.nacos.config";
public static final String COMMAS = ",";
public static final String SEPARATOR = "[,]";
private static final Pattern PATTERN = Pattern.compile("-(\\w)");
private static final Logger log = LoggerFactory.getLogger(NacosConfigProperties.class);
@Autowired
@JsonIgnore
private Environment environment;
private String serverAddr;
private String encode;
private String group = "DEFAULT_GROUP";
private String prefix;
private String fileExtension = "properties";
private int timeout = 3000;
private String maxRetry;
private String configLongPollTimeout;
private String configRetryTime;
private boolean enableRemoteSyncConfig = false;
private String endpoint;
private String namespace;
private String accessKey;
private String secretKey;
private String contextPath;
private String clusterName;
private String name;
//就是他
private List<NacosConfigProperties.Config> sharedConfigs;
private List<NacosConfigProperties.Config> extensionConfigs;
......
//静态内部类
public static class Config {
private String dataId;
private String group;
//新版本新增的可以对共享的文件进行监听配置刷新
private boolean refresh;
......
启动项目:
再看一下nacos这个公共配置是否被监听到了
ok,以上就是nacos 共享配置的配置,一定要注意的是一下几点:
- 项目中shared-configs的配置方式
- nacos控制台中公共配置的dataId=shared-configs.dataId。会带后缀名!!