补充学习:
Apollo管理多环境下的配置和踩坑实践 - 简书
Apollo-阿波罗配置中心超详细教程_apllo-CSDN博客
springboot本地local配置覆盖远程Apollo配置(含Apollo配置加载顺序说明)_本地覆盖apollo配置-CSDN博客
Apollo 配置中心详细教程 - 简书 (包含简单的用法 挺好)
SpringBoot 集成 Apollo 配置中心,一文搞定!(万字长文)-阿里云开发者社区 (最全面的配置了)
-----------
Apollo配置中心教程、详解-CSDN博客
术语说明:
application (应用)
Apollo是以应用(项目)为单位的,一个应用就是一个独立的个体,这个个体很好理解,就是实际使用配置的应用,Apollo客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置。
关键字:appId
environment (环境)
配置对应的环境,Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取相应的配置,一个应用可能有多个环境,每个环境的配置可能有些地方不一样。
关键字:env
cluster (集群)
一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。
关键字:cluster
namespace (命名空间)
一个应用下不同配置的分组,可以简单地把namespace类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等
关键字:namespaces(C++头文件经常导入这玩意)
重点是一个应用下,意思是一个应用可以有多个命名空间,说白了就是填写配置的地方,没什么高端的。就是让你不把所有配置写在同一块区域,到时候自己找的时候也麻烦。
例如:MySQL的配置用一个空间,redis的配置又用另一个,你可以随意分配
另一个作用
命名空间可以分为公共的和私有的,私有的就是只能你这个应用看到,别的应用看不到,公共的就是所有的应用都能看到你这个空间里面的配置,并且所有的应用都可以引用这个空间(就是将空间弄到自己的应用中来)。
我们往往会创建一个应用,专门用来设置公共的配置,然后其他应用继承这个空间就行了,这样做的好处是:各个应用相同的配置就不需要重复配置了,也可以统一更改
如图有两个集群,一个default,default有两个命名空间 别用True,应该是true小写的(语法)
Apollo的总体设计,从下往上看:
Config Service(8080端口)提供配置的读取、推送等功能,服务对象是Apollo客户端,就是你自己写的代码,你自己的项目就从这里拿到配置信息
Admin Service(8070端口)提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面),就是快速启动的那个操作界面
Eureka提供服务注册和发现,为了简单起见,目前Eureka在部署时和Config Service是在一个JVM进程中的,他俩就是在同一个项目中(快速启动的三个服务,就是三个boot项目)(8090端口)
Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳
springboot项目里面只需要配置Apollo的一些信息:
springboot执行web项目的时候,如果使用了Apollo配置中心,会先去配置中心中读取配置,再启动的
appId(读取哪个应用中的配置)
namespace(应用中的哪些命名空间)
meta-server(meta的地址,在哪个ip和端口读取配置)
在 Apollo 的配置中,apollo.meta
是用来指定 ConfigService 服务地址 的一个关键参数。具体解释如下:
1. meta
的作用
apollo.meta
指定的是 Apollo 配置中心的 ConfigService 服务端点。
客户端通过这个地址与服务端通信,以拉取配置数据或监听配置的实时更新。
2. 为什么需要 apollo.meta
Apollo 的服务端通常有多个组件(ConfigService、AdminService 等)。其中,ConfigService
是负责提供配置读取和推送服务的核心组件。
客户端需要知道 ConfigService
的地址才能正常运行,否则无法获取配置。
3. 常见场景
- 开发环境:通常会使用本地服务,像
http://127.0.0.1(loacalhost):8080
。(因为从官网下载下来就是默认ConfigService
的地址是这个了好像) - 测试/生产环境:需要指定实际的服务地址,例如
http://configservice.mycompany.com:8080
。
apollo.meta
就是用来告诉 Apollo 客户端(我们的代码),服务端的 配置服务地址 是什么。
4. 多环境支持
在复杂的环境中,你可以为不同的环境配置不同的 apollo.meta
值。例如:
# 开发环境 apollo.meta=http://dev-configservice.company.com:8080
# 测试环境 apollo.meta=http://test-configservice.company.com:8080
# 生产环境 apollo.meta=http://prod-configservice.company.com:8080
环境(读取哪个环境的配置:开发、测试、生产)
在Java程序启动脚本中,可以指定-Denv=YOUR-ENVIRONMENT
Idea中为java程序添加启动参数(含:VM options、Program arguments、Environment variable)_idea启动配置java启动参数-CSDN博客
还可以通过操作系统的System Environment ENV来指定
通过配置文件来指定env=YOUR-ENVIRONMENT;(windows C:\opt\settings\server.properties)(linux /opt/settings/server.properties)
集群(哪个集群的配制)
在Java程序启动脚本中,可以指定-Dapollo.cluster=SomeCluster
过Spring Boot的配置文件,apollo.cluster=SomeCluster
可以在server.properties配置文件中指定idc=xxx
例子1:
package Apollo;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService;
/**
* 功能:
* 作者:IT伟
* 日期:2025/1/2 22:59
*/
public class getConfigTest {
public static void main(String[] args) {
getConfigQuickStart();
getConfigFromNameSpace();
}
//获取默认命名空间的配置(application)
public static void getConfigQuickStart() {
Config appConfig = ConfigService.getAppConfig();
String property = appConfig.getProperty("sms.enable", null);
System.out.println("sms.enable的值是:" + property);
}
//获取自定义命名空间的参数
public static void getConfigFromNameSpace() {
Config config = ConfigService.getConfig("micro_service.test-namespace");
String port = config.getProperty("server.port", null);
System.out.println(port);
Config config2 = ConfigService.getConfig("application");
String port2 = config2.getProperty("server.port", null);
System.out.println(port2);
}
}
运行:
结果:
复现链接中例子:
启动springbootaplication才会加载application.xx配置文件
@org.springframework.boot.autoconfigure.SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class} )//@EnableAutoConfiguration @ComponentScan
@ComponentScan(basePackages = {"Apollo"})
public class SpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication.class, args);
}
}
没有springbootapplication报错
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>3.1.4</version> <!-- 根据你的需求调整版本 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.4</version>
</dependency>
不加上这部分,springboot会启动后自动关闭
SpringBoot项目启动后自动关闭:Process finished with exit code 0_springboot process finished with exit code 0-CSDN博客
SpringBoot项目启动报错:No active profile set, falling back to default profiles:default-CSDN博客
Apollo配置中心教程、详解-CSDN博客
这个证明先加载Apollo的,所以如下图所示,我在代码里面就没有用application命名了,否则会直接加载我的server.port,导致tomcat的一直是Apollo
这篇也很好(springboot用法更加全面):
微服务:简述微服务架构中的配置中心之Apollo_阿波罗配置中心-CSDN博客
问题:
一直没找到配置文件加载env的,后续有时间遇到在想,是否可以通过注解
Spring Boot 整合 Apollo 配置中心实战_springboot整合apollo-CSDN博客
配置 Apollo 客户端
在项目的 application.properties 或 application.yml 文件中添加 Apollo 相关配置:
# Apollo 配置中心地址,多个用逗号分隔
apollo.meta=http://[Apollo 服务端 IP]:8080
# 应用 ID,需与 Apollo 管理端创建的应用 ID 一致
app.id=your-app-id
# 环境,如 dev、test、prod 等
apollo.env=dev
# 集群,默认值可设为 default
apollo.cluster=default
代码解读
配置加载顺序方面,Apollo 会优先加载系统环境变量中的配置(以 APOLLO_ 开头),若未找到则读取上述配置文件内容,开发者可灵活利用这一点在不同部署场景下覆盖配置。
启用 Apollo 配置注入
在 Spring Boot 启动类上添加 @EnableApolloConfig 注解,开启 Apollo 配置自动注入功能:
原文链接:https://blog.csdn.net/weixin_43896211/article/details/144437102
但是看这里可以配置,想不懂,而且我不需要@enableapollo注解也可以