Apollo配置中心

文章目录

  • 配置中心
  • springboot集成Apollo
    • Apollo安装
    • springboot集成

配置中心

原来的单体项目,我们在做配置的时候其实是很轻松的,一个配置文件就可以搞定了,但是在分布式环境下,如果想动态改变系统配置,无非就是以下几种方式:

  • 将配置写入数据库,定时任务定时轮询,更新系统配置,但是这种方案有一定的延时,而且定时轮询也会消耗大量的数据库资源
  • 人肉修改每台机器上的配置文件
  • 将配置写到分布式缓存,每次业务调用都从缓存读取最新配置。这种方式是反伸缩模式的,而且缓存很容易成为热点和单点

那么配置中心就是解决了上述的这些问题

Apollo配置中心流程

Apollo配置中心_第1张图片

用户通过管理后台发布配置之后,后台会请求adminService将配置更新到DB,然后异步通知configService读取DB中的配置信息,configService读取到DB中的配置信息后通知client

内部的异步通知的实现:

在内部其实是通过releaseMessage的表来保存所有adminService的异步通知,每次adminService接收到配置更新的消息就会在releaseMessage新增一条消息记录

configService内部有一个线程每秒检查一次releaseMessage表,检测到有新配置消息,就会对客户端进行通知

configService通知客户端的方式

configService通知客户端的方式有主动推送,也有客户端主动的拉取

客户端的主动拉取是备用机制,因为客户端和服务端的连接是一个长连接,为了防止连接断开,需要每隔一段时间主动更新配置

那么主要还是configService主动推送,原理:就是客户端请求configService下的接口,但是这个接口不会理解返回结果,而是把请求挂起,考虑到会有数万的客户端向服务端发起连接,因此服务端采用async servlet来服务http long polling请求。如果60s内没有该客户端关心的配置发布,那么会返回304给客户端,如果有,则传回对应的配置信息并且该请求立刻返回,客户端获取到返回的namespace后请求configService获取最新配置

springboot集成Apollo

Apollo安装

导入数据库

Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。

https://github.com/nobodyiam/apollo-build-scripts.git

分别导入

source /your_local_path/sql/apolloportaldb.sql
source /your_local_path/sql/apolloconfigdb.sql

配置数据库连接信息

Apollo服务端需要知道如何连接到你前面创建的数据库,所以需要编辑demo.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息。

#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)

注意:不要修改demo.sh的其它部分

执行脚本启动

./demo.sh start

有以下输出代表成功:

==== starting service ====
Service logging file is ./service/apollo-service.log
Started [10768]
Waiting for config service startup.......
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup....
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Started [10846]
Waiting for portal startup......
Portal started. You can visit http://localhost:8070 now!

查看Apollo配置中心

打开http://localhost:8070

Apollo配置中心_第2张图片

springboot集成

引入依赖

        <dependency>
            <groupId>com.ctrip.framework.apollogroupId>
            <artifactId>apollo-clientartifactId>
            <version>1.1.0version>
        dependency>

启动类开启注解

@SpringBootApplication
@EnableApolloConfig
public class ApolloDemo {

    public static void main(String[] args) {
        SpringApplication.run(ApolloDemo.class,args);
    }
}

yaml配置文件添加配置

server:
  port: 8761

app:
  id: apollodemo  # appid添加Apollo后台中的appid,一般是服务名
apollo:
  meta: http://47.103.95.233:8080
  bootstrap:
    enabled: true 
    eagerLoad:
      enabled: true

logging:
  level:
    com:
      gf:
        controller: debug

获取配置

获取配置通过spring的注解@Value来获得

@Configuration
public class JavaConfig {
    @Value("${timeout:20}")
    private int timeout;

    public int getTimeout() {
        return timeout;
    }
}

你可能感兴趣的:(springcloud)