spring boot + nacos多环境部署

混江龙づ霸主 提交于 2019-11-29 08:28:04

spring boot + nacos多环境部署

问题描述

nacos 是什么这里就不阐述了,在本篇博客中作用是作为spring boot动态配置的中心,配合spring cloud 可以很容易的实现多环境的部署,但是配合spring boot就出现问题,无法实现。示例如下

在这里插入图片描述
application.properties配置内容如下

server.port=8088
spring.profiles.active=local
nacos.config.server-addr=127.0.0.1:8848

application-local.properties配置内容如下

nacos.config.group=LOCAL

application-myself.properties配置内容如下

nacos.config.group=MYSELF

预期效果就是maven根据不同的环境打包,这样很方便,项目整体改动也很小
刚好nacos有spring boot集成的方案
github地址

但是整个项目拉下来之后发现根本不行,会有报错: endpoint not blank,应该是nacos配置中心地址没有配置或者没有找到
所以没办法那就自己搞

解决思路

nacos配置两种方式,一种是硬编码一种是纯配置文件配置,所以有两种解决方式
一、
硬编码,也就是在启动类上加注解

@NacosPropertySource(
        groupId = "MYSELF",
        dataId = "eco-mock",
        autoRefreshed = true,
        type = ConfigType.PROPERTIES
)

差不多就像这样,像个办法在项目启动前改变这个group的值,或者这个dataId的值(用来区分不同的配置环境)

二、
纯配置文件

#开启配置预加载功能
nacos.config.bootstrap.enable=true

# 主配置服务器地址
nacos.config.server-addr=127.0.0.1:8848
# 主配置 data-id
nacos.config.data-id=eco-mock
# 主配置 group-id
nacos.config.group=MYSELF
# 主配置 配置文件类型
nacos.config.type=properties
# 主配置 最大重试次数
nacos.config.max-retry=10
# 主配置 开启自动刷新
nacos.config.auto-refresh=true
# 主配置 重试时间
nacos.config.config-retry-time=2333
# 主配置 配置监听长轮询超时时间
nacos.config.config-long-poll-timeout=46000
# 主配置 开启注册监听器预加载配置服务(除非特殊业务需求,否则不推荐打开该参数)
nacos.config.enable-remote-sync-config=true

通过某种方式让 nacos.config.group=MYSELF这个数值改变或者让application.properties变成我们指定的环境配置

准备工作

nacos 配置中心的具体配置
dataId:eco-mock
group:myself

eco.test.nacos=myself
eco.enable.sendMsg=false

dataId:eco-mock
group:local

eco.test.nacos=local
eco.enable.sendMsg=false

配置文件如上问题描述

再注入的代码中输出数据

@Configuration
@Slf4j
public class CommonParam {
    public static String TEST_NACOS;

    @NacosValue(value = "${eco.test.nacos}",autoRefreshed = true)
    public void setTestNacos(String testNacos) {
        log.info("修改 eco.test.nacos ==> {}", testNacos);
        this.TEST_NACOS = testNacos;
    }
}

具体实施

方案一(个人推荐)

首先注解的中的值如果要修改只能在类加载初始化的时候,那就是启动类静态代码块中进行修改

import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Map;
import java.util.Properties;
@NacosPropertySource(
        groupId = "",
        dataId = "eco-mock",
        autoRefreshed = true,
        type = ConfigType.PROPERTIES
)
@EnableScheduling
@SpringBootApplication
public class MockApplication {
    
    static {
        try {
            Properties properties = new Properties();
            properties.load(MockApplication.class.getClassLoader().getResourceAsStream("application.properties"));
			// 从配置文件中读取当前部署的环境
            String profile = properties.getProperty("spring.profiles.active");
			// 读取指定环境对应的group
            properties.load(MockApplication.class.getClassLoader().getResourceAsStream(String.format("application-%s.properties", profile)));
            String groupId = properties.getProperty("nacos.config.group");

			// 进行赋值
            NacosPropertySource annotation = MockApplication.class.getAnnotation(NacosPropertySource.class);
            InvocationHandler ih = Proxy.getInvocationHandler(annotation);
            Field memberValuesField  = ih.getClass().getDeclaredField("memberValues");
            memberValuesField .setAccessible(true);
            Map map = (Map) memberValuesField .get(ih);
            map.put("groupId", groupId);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(MockApplication.class);

        springApplication.run(args);
    }

}

先修改application.properties配置 spring.profiles.active=local

在这里插入图片描述
启动日志如下

再application.properties配置 spring.profiles.active=myself
在这里插入图片描述
说明配置成功
线上项目只需要修改为spring.profiles.active=@activatedProperties@然后部署根据maven指定环境即可

方案二

可以看下这篇博客中的maven方案
思路相同,因为配置文件预加载加载的是application.properties,
那么我只需要将指定的配置文件比如说application-local.properties打包成application.properties即可
具体实施我就不写了,大同小异

总结

如果有更好更优雅的解决方案希望留言学习下,谢谢!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!