./demo.sh start即可运行
springBoot集成
gitee代码仓库:gitee.com/pet365/spri…
1.官方给出的案例
2.引入依赖,配置,主启动
引入依赖,注意最好引入高版本
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tianju</groupId>
<artifactId>springboot-apollo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<protoc.version>3.11.0</protoc.version>
<protoc-gen-grpc-java.version>1.17.0</protoc-gen-grpc-java.version>
<maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
<grpc.version>1.28.0</grpc.version>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.14</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
配置application.yml文件
server:
port: 9999
# 应用id,apollo中保持一致
app:
id: spring-boot-logger
apollo:
# 是否开启apollo
bootstrap:
enabled: true
# 设置命名空间namespace
namespaces: application
# apollo服务器 eureka地址
meta: http://localhost:8080
mysql:
username: root
myConfig: test
logging:
level:
com.tianju: debug
注解@EnableApolloConfig
package com.tianju;
import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableApolloConfig
public class ApolloApp {
public static void main(String[] args) {
SpringApplication.run(ApolloApp.class);
}
}
3.进行配置和读取
设置APPid
进行编辑配置
在表格视图中查看
配置需要发布后才能生效
配置发布后,再次访问参数
原因是用@ConfigurationProperties 这种姿势,需要处理一下才能动态更新
关于@ConfigurationProperties自动更新的问题
需要注意的是,@ConfigurationProperties如果需要在Apollo配置变化时自动更新注入的值,需要配合使用EnvironmentChangeEvent或RefreshScope。相关代码实现,可以参考apollo-use-cases项目中的ZuulPropertiesRefresher.java和apollo-demo项目中的SampleRedisConfig.java以及SpringBootApolloRefreshConfig.java
官网给出的案例:github.com/apolloconfi…
package com.tianju.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@ConfigurationProperties(prefix = "mysql")
public class MySQLPro {
private String username;
private String password;
}
package com.tianju.config;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfig;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/\*\*
\* 动态获取username
\*/
@Service
public class MySQLConfigService {
private static final Logger logger = LoggerFactory.getLogger(MySQLConfigService.class);
private static final String prefix = "mysql";
@ApolloConfig
private Config config;
@Autowired
private MySQLPro mySQLPro;
@ApolloConfigChangeListener
private void onChange(ConfigChangeEvent changeEvent){
Set<String> keyNames = config.getPropertyNames();
for (String key : keyNames){
logger.debug("the key is {}",key);
if (containsIgnoreCase(key, prefix)){
String username = config.getProperty("mysql.username", "admin-default");
String password = config.getProperty("mysql.password", "psdDefault");
Map map = new HashMap();
map.put("listenerUsername", username);
map.put("listerPassword", password);
logger.debug("new params is {}",map);
mySQLPro.setPassword(password);
mySQLPro.setUsername(username);
}
}
}
/\*\*
\* 比较str中是否包含了 searchStr
\* @param str 这里是配置中心所有key
\* @param searchStr 要匹配的key
\* @return
\*/
private static boolean containsIgnoreCase(String str, String searchStr) {
if (str == null || searchStr == null) {
return false;
}
int len = searchStr.length();
int max = str.length() - len;
for (int i = 0; i <= max; i++) {
// 忽略大小写进行比较
if (str.regionMatches(true, i, searchStr, 0, len)) {
return true;
}
}
return false;
}
public MySQLPro getMySQLPro() {
return mySQLPro;
}
}
遇到的问题
系统出错,请重试或联系系统负责人
云服务器访问失败
两个都要设置一下
配置不识别apollo,版本的问题
用2.1.0版本
Linux系统部署apollo无法获取【未解决】
总结
上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。
很多人担心学了容易忘,这里教你一个方法,那就是重复学习。
打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。
从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。
人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。
相关阅读docs.qq.com/doc/DSmxTbFJ1cmN1R2dB