nacos作为配置中⼼兼容xml配置⽂件
  最近公司想要⽤配置中⼼,因为公司⽤的有传统的spring项⽬,有springboot项⽬,为了兼容都能够采⽤配置中⼼,做了⼀些尝试,经过⽐较还是倾向于使⽤nacos,传统dubbo采⽤spring⽅式读取xml读取配置⽂件的⽅式启动,其配置数据源,redis,rabbitmq等采⽤的是xml的配置,xml中取值是个问题,为了兼容xml能从远程配置中⼼更好的取值,做了⼀系列尝试。
  ⽐较当前的⼀些配置中⼼
Nacos的部署结构⽐较简单,运维成本较低。Apollo部署组件较多,运维成本⽐Nacos⾼。Spring Cloud Config⽣产⾼可⽤的成本最⾼。
Apollo⽀持Spring Boot和Spring Cloud项⽬,但是实现⽅式不同于标准,⽆法做⽆缝迁移,从Spring Cloud迁移到Apollo,存在代码改造和兼容性成本。
Nacos通过Spring Cloud for Alibaba⽀持Spring Boot和Spring Cloud⽣态,符合Spring⽣态中的标准实现⽅式,可以⽆缝从Spring Cloud Conig迁移到Nacos。
Apollo和Nacos相对于Spring Cloud Config的⽣态⽀持更⼴,在配置管理流程上做的更好。
Apollo相对于Nacos在配置管理做的更加全⾯,但使⽤起来也要⿇烦⼀些。
Nacos使⽤起来相对⽐较简洁,在对性能要求⽐较⾼的⼤规模场景更适合。此外,Nacos除了提供配置中⼼的功能,还提供了动态服务发现、服务共享与管理的功能,降低了服务化改造过程中的难度。Nacos⽬前项⽬上的⼈⼒投⼊、社区的活跃度等也⽐较⾼
整体上来看,Nacos的读写性能最⾼,Apollo次之,Spring Cloud Config的依赖Git场景不适合开放的⼤规模⾃动化运维API
⼀、传统的spring加载xml项⽬启动兼容
典型启动⽅式是:
1public static void main(String[] args) throws IOException {
2        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
3new String[] {"l"});
4        context.start();
5        System.out.println("------------");
6        ad(); // 为保证服务⼀直开着, 利⽤输⼊流的阻塞来模拟.
7    }
这种项⽬不适合通过注解进⾏,所以只能采⽤配置,⽹上参考的有些坑,主要是jar包冲突的问题,这⾥放上我修改的jar依赖
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId>
<version>0.3.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
</exclusions>
</dependency>
1<?xml version="1.0" encoding="UTF-8" ?>
2<beans xmlns="/schema/beans" xmlns:nacos="nacos.io/schema/nacos"
3      xmlns:xsi="/2001/XMLSchema-instance"
4      xsi:schemaLocation="nacos.io/schema/nacos nacos.io/schema/nacos.xsd
5/schema/beans /schema/beans/spring-beans.xsd">
6
7
8<!--nacos配置,这⾥是使⽤配置⽂件的⽅式,这只是其中的⼀种⽅式-->
9<!--开启注解-->
10<nacos:annotation-driven></nacos:annotation-driven>
11<!--指定nacos配置地址-->
12<nacos:global-properties server-addr="localhost:8848"/>
13<!--指定dataId,group-id, 是否是⾃动刷新-->
14<nacos:property-source data-id="dubbo-config" group-id="DEFAULT_GROUP" auto-refreshed="true"/>
15</beans>
同时需要将该xml导⼊到基本的l中
<import resource="l" />
nacos配置中⼼上添加的配置内容需要什么配置什么即可。
采⽤注解形式
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="/schema/beans" xmlns:nacos="nacos.io/schema/nacos"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="nacos.io/schema/nacos nacos.io/schema/nacos.xsd
/schema/beans /schema/beans/spring-beans.xsd">
<!--开启注解-->
<nacos:annotation-driven></nacos:annotation-driven>
</beans>
@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "dubbo-config", autoRefreshed = true)
public class nacosConfig {
}
3、或者在l⾥⾯整合好nacos的xml内容(命名空间,开启注解)采⽤注解
xmlns:nacos="nacos.io/schema/nacos"
xsi:schemaLocation="nacos.io/schema/nacos nacos.io/schema/nacos.xsd
同时需要注意
<nacos:annotation-driven></nacos:annotation-driven>放置的前后位置,不合适会报错,多更换⼏个位置试试就可以了,xml的加载顺序是从上到下来加载
⼆、springboot项⽬兼容xml,这⾥有三种⽅式,可以采⽤上⾯的⽅式,也可以采⽤官⽅⽂档的注解⽅式,但是发现采⽤上⾯的⽅式配置动态刷新没有成功,⽽采⽤注解⽅式,需要注意的是注⼊值应该采⽤@NacosValue(value ="${xxxx}",autoRefreshed = true)⽅能能够实现⾃动刷新,⽽采⽤@Value("${xxxx}")不能实现⾃动刷新
第⼀种,采⽤同上⾯的⽅式
第⼆种,采⽤注解⽅式,jar包采⽤传统spring整合的jar包,依赖同上,
fig;
import com.alibaba.nacos.api.annotation.NacosProperties;
import com.alibaba.fig.EnableNacosConfig;
import com.alibaba.fig.NacosPropertySource;
import t.annotation.Configuration;
import t.annotation.ImportResource;
@Configuration
//@ImportResource({ "classpath:l" })注:这个是采⽤xml配置需要添加的,因为不是采⽤显⽰加载l启动
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "being-springboot-config", autoRefreshed = true)
public class NacosConfig {
}
然后在controller注⼊值时采⽤是注⼊值应该采⽤@NacosValue(value ="${xxxx}",autoRefreshed = true)即可实现实时刷新,并且访问数据库什么的都是正常的
第三种,采⽤如下jar包,然后完全按照官⽅⽂档来即可
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.1</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
</exclusions>
</dependency>
application.properties
启动类上加注解
@SpringBootApplication
@NacosPropertySource(dataId = "xxxx你nacos上的dataId", autoRefreshed = true)
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
同样的,采⽤@NacosValue(value ="${xxxx}",autoRefreshed = true)⽅能能够实现⾃动刷新,⽽采⽤@Value("${xxxx}")不能实现⾃动刷新,并且@NacosValue(value ="${xxxx}")也不能实时刷新,autoRefreshed默认为false
三、springboot直接采⽤springcloud的jar配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
采⽤上述jar包去兼容xml的取值时,报不能加载属性值错误。没有成功,后来发现是application-name
写错了,修改过来后,直接可⽤兼容。
四、⼀个springboot集成springcloud jar⽆xml配置的demo
  直接采⽤完全注解的⽅式加载,写了⼀个⼩demo,采⽤三中依赖,不⽤排除上⾯exclusions中的包,⼀个独⽴的demo,集成redis集,运⾏ok
1、bootstrap.properties
server.port=8002
spring.application.name=xxx-test
spring.profiles.active=local
spring.fig.file-extension=properties
spring.fig.server-addr=127.0.0.1:8848
#spring.fig.namespace=d6775f80-ed7a-409a-8dbc-49b2cddee4d1
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.fig.prefix来配置。
spring.profile.active 即为当前环境对应的 profile,详情可以参考 。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
file-exetension 为配置内容的数据格式,可以通过配置项 spring.fig.file-extension 来配置。⽬前只⽀
持 properties 和 yaml 类型。
通过 Spring Cloud 原⽣注解 @RefreshScope 实现配置⾃动更新:
@RestController
@RefreshScope
public class TestController {
private Logger logger = Class());
@Autowired
RedisTemplate<String,String> template;
@Value("${id}")
private String id;
@GetMapping("/getId")
public String getId(){
logger.info("看⼀看id的变化: {}",id);
template.opsForValue().set("hello","world");
String result = template.opsForValue().get("hello");
return "redis result: "+result+"\tid: "+id;
}
}
Redis属性及配置
st.config;
2
3
4import org.springframework.beans.factory.annotation.Value;
5import org.t.config.annotation.RefreshScope;
6import org.springframework.stereotype.Component;
7
8 @Component
9 @RefreshScope
10public class RedisProperties {
11    @Value("${pireSeconds}")
12private int expireSeconds;
13    @Value("${redis.clusterNodes}")
14private String clusterNodes;
15    @Value("${redismandTimeout}")
16private int commandTimeout;
17    @Value("${redis.maxTotal}")
18private int maxTotal;
19    @Value("${redis.maxTotal}")
20private int maxIdle;
21    @Value("${redis.maxWaitMillis}")
22private int maxWaitMillis;
23    @Value("${stOnBorrow}")
24private boolean testOnBorrow;
25    @Value("${redis.maxRedirects}")
26private int maxRedirects;
27
28public int getExpireSeconds() {
29return expireSeconds;
30    }
31
32public void setExpireSeconds(int expireSeconds) {
34    }
springboot结构35
36public String getClusterNodes() {
37return clusterNodes;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。