Apollo(阿波罗)——携程推出的分布式配置管理中心 & 启动Apollo & SpringBoot集成 & @ConfigurationProperties的使用姿势_阿波罗配置中心

476 阅读4分钟

./demo.sh start即可运行

在这里插入图片描述

springBoot集成

gitee代码仓库:gitee.com/pet365/spri…

1.官方给出的案例

github.com/apolloconfi…

在这里插入图片描述

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配置变化时自动更新注入的值,需要配合使用EnvironmentChangeEventRefreshScope。相关代码实现,可以参考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