Spring+Springmvc项目使用Apollo配置中心

网上大部分教程是springboot的,但我自己项目是ssm的,并且需要接入配置中心统一管理配置项,查资料很少,所以特地记录一下,只记录怎么接入,Apollo安装请自行查找

1. 依赖项,普通项目进入Maven仓库下载jar包导入就行

我的spring版本是5.3.26, 你如果是其他版本需要自行降低版本或提高jar包的版本

<!-- https://mvnrepository.com/artifact/com.ctrip.framework.apollo/apollo-client -->
<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>2.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.ctrip.framework.apollo/apollo-core -->
<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-core</artifactId>
    <version>2.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.inject/guice -->
<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    <version>5.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/failureaccess -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>failureaccess</artifactId>
    <version>1.0.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.yaml/snakeyaml -->
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.33</version>
</dependency>

2. app.properties配置文件

springboot可以直接集成在application.properties配置文件中

新建的app.properties一定要放在resource目录下, 不然Apollo识别不到

2024-11-22 发现部署测试环境东方通目录下有问题, 经排查,发现在本地环境运行时IDEA会自动将resources目录下文件自动复制一份到classes目录下,所以可以正常访问,但是打包后部署测试环境时有可能会有访问不到配置文件的情况。

只需要将META-INF这个放在服务器上项目的classes目录下即可,本地环境也可以将配置文件目录直接挪到src目录下

在这里插入图片描述
配置文件内容

#接入Apollo的项目ID
app.id=APPID
#配置中心地址
apollo.meta=http://config-service-url
#注入默认项目空间application
apollo.bootstrap.enabled = true
#如果希望把日志相关的配置(如logging.level.root=info或logback-spring.xml中的参数)
#也放在Apollo管理使Apollo的加载顺序放到日志系统加载之前
apollo.bootstrap.eagerLoad.enabled=true
#集群
apollo.cluster=default
#访问密钥
apollo.access-key.secret=
#自定义配置文件的缓存路径,确保有权限可以操作目录
apollo.cache-dir=/data/config

3. 代码访问

API方式是最简单、高效使用Apollo配置的方式,不依赖Spring框架即可使用。

//从默认的配置空间中获取参数, 需要设置一个默认值,再获取不到配置中心中的值时返回
Config config = ConfigService.getAppConfig();
String key = "key";
String val = "val";
String value = config.getProperty(key, val);
//从指定的配置空间中获取值.例如dev.yml,注意要全称
Config config = ConfigService.getConfig("dev.yml");
String key = "key";
String val = "val";
String value = config.getProperty(key, val);
//非yaml/yml格式的namespace 获取时需要使用ConfigService.getConfigFile接口并指定Format,如ConfigFileFormat.XML。
String someNamespace = "test";
ConfigFile configFile = ConfigService.getConfigFile("test", ConfigFileFormat.XML);
String content = configFile.getContent();

4. 监听配置变化事件

监听配置变化事件只在应用真的关心配置变化,需要在配置变化时得到通知时使用,比如:数据库连接串变化后需要重建连接等。

如果只是希望每次都取到最新的配置的话,只需要按照上面的例子,调用config.getProperty即可。

Config config = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never null
config.addChangeListener(new ConfigChangeListener() {
    @Override
    public void onChange(ConfigChangeEvent changeEvent) {
        System.out.println("Changes for namespace " + changeEvent.getNamespace());
        for (String key : changeEvent.changedKeys()) {
            ConfigChange change = changeEvent.getChange(key);
            //对于变化的值, 做重新赋值操作
            System.out.println(String.format("Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
        }
    }
});
Apollo官方文档
https://www.apolloconfig.com/#/zh/client/java-sdk-user-guide
### Spring MVC框架集成Apollo配置管理 #### 创建Spring Boot项目 为了使应用程序能够利用Apollo作为其配置中心,在创建一个新的Spring Boot项目时,需要引入必要的依赖项。通常情况下,这可以通过Maven或Gradle构建工具完成。 对于Maven而言,`pom.xml`文件应包含如下依赖: ```xml <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>{latest_version}</version> </dependency> <!-- 如果使用的是Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` #### 启用Apollo配置加载功能 为了让Spring应用能自动读取来自Apollo的配置数据,需在启动类上添加`@EnableApolloConfig`注解[^2]。此操作使得程序可以在运行期间动态获取由Apollo提供的最新设置值。 ```java // 开启Apollo的配置加载功能 @EnableApolloConfig @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 自定义配置属性映射到Java Bean 当希望某些配置参数可以直接注入至业务逻辑层中的时候,则可通过自定义实体类的方式实现这一点。假设存在一组名为`app.properties`的应用级配置,那么可以编写相应的POJO来接收这些键值对。 ```java @ConfigurationProperties(prefix = "app") @Component public class AppProperties { private String name; private Integer port; // getters and setters... } ``` 此时,只要确保Apollo端已发布相同前缀(`app`)下的对应条目,上述字段就会被自动填充相应的内容。 #### RESTful API示例 最后给出一段简单的REST风格的服务代码片段用于展示如何结合两者优势快速搭建微服务架构下的模块化开发模式。这里同样运用到了前面提到过的@Controller变种——@RestController简化版控制器声明方式以及@RequestMapping衍生出来的@GetMapping快捷路由匹配语法糖。 ```java @RestController class HelloController { @Autowired private AppProperties appProps; @GetMapping("/greet") public ResponseEntity<String> greet() { return new ResponseEntity<>("Hello from service running on " + this.appProps.getName() + ":" + this.appProps.getPort(), HttpStatus.OK); } } ``` 通过以上步骤即可成功地把Spring MVC同Apollo紧密结合起来,从而享受到集中式管理和实时生效带来的便利之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值