第1章 Apollo项目实战

能力目标

  • 掌握Apollo安装
  • 掌握Apollo配置操作
  • 能够实现SpringBoot集成Apollo
  • 能够实现Apollo适用功能【自动刷新、监听器、配置加密、1灰度发布】

1 Apollo应用

【推荐】我认为这是最完整的Apollo教程从入门到精通_数据库

项目地址:​​github.com/ctripcorp/a…​

使用手册(多读多看):​​github.com/ctripcorp/a…​

1.1 初识Apollo

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

1)核心功能:


1:Apolloenvironmentclusternamespace
2:zk
3:namespace便
4:English

:
Apollo1

:
便

:


:
1:
2:便

:
便使

Java.Net:
1:Java.Net便
2:Spring PlaceholderAnnotationSpring BootConfigurationProperties便使Spring 3.1.1+
3:HttpJava.Net便使

API:
1:Apollo
2:Apollo
3:使xml, json
4:使DAL
5:ApolloApollo

:
1:Apollo
2:MySQLJavaMySQLApollo
3:Apollo

2)谁在用它

国内很多大厂都在用Apollo作为分布式配置中心,如果你们的网站也在用,在​​github.com/ctripcorp/a…​

携程、华为、京东、智联招聘、中国移动、360金融、中通快递、转转、贝壳网、土巴兔、平安银行、有赞等众多国内大厂在用Apollo。

【推荐】我认为这是最完整的Apollo教程从入门到精通_数据库_02

1.2 Apollo单机部署

我们接下来实现Apollo安装,安装前我们先介绍一下单机版装的架构,如下图:

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_03

上图展示了Apollo单机部署架构,我们对其中每个节点进行解释说明:

Apollo Config Service: Apollo 

Apollo Admin Service:Apollo Portal

Apollo Portal:Apollo API

环境说明:

MySQL:MySQL5.75.6.5+
Apollo:JDK1.8+
Apollo:JDK1.7+

Apollo安装方式有多种,官方提供了快速安装模式和Docker安装模式,我们把两种安装模式都实现一次,但如果是生产环境请使用分布式部署方案

(​​github.com/ctripcorp/a…​

1.2.1 快速安装

1)JDK版本:

[root@skywalking ~]# java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

2)MySQL版本:

SELECT VERSION()
-----------------
5.7.32-log

3)安装包下载:

Apollo已经准备好了一个Quick Start安装包​​apollo-quick-start.zip​​,里面包含了可以自动启动的jar包、以及所有依赖jar包、数据库脚本、内置Tomcat容器等,安装包共63M,大家只需要下载到本地,就可以直接使用,免去了编译、打包过程。

Github下载地址:​​github.com/nobodyiam/a…​

Quick Start只针对本地测试使用,所以一般用户不需要自己下载源码打包,只需要下载已经打好的包即可。不过也有部分用户希望在修改代码后重新打包,那么可以参考如下步骤:

1:apollo-configservice, apollo-adminserviceapollo-portalpom.xmlspring-boot-maven-pluginmaven-assembly-plugin

2:mvn clean package -pl apollo-assembly -am -DskipTests=true

3:apollo-assembly/targetjarrenameapollo-all-in-one.jar

4)创建数据库:

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

注意:如果你本地已经创建过Apollo数据库,请注意备份数据。我们准备的sql文件会清空Apollo相关的表。

【推荐】我认为这是最完整的Apollo教程从入门到精通_Java_04

5)配置数据库连接:

我们的数据库地址不是固定的,Apollo服务端需要知道如何连接到你前面创建的数据库,因此需要修改数据库连接地址,在安装包里有一个启动脚本​​demo.sh​​,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息:

# apollo config db info
apollo_config_db_url="jdbc:mysql://192.168.200.129:3306/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"
apollo_config_db_username=root
apollo_config_db_password=root

# apollo portal db info
apollo_portal_db_url="jdbc:mysql://192.168.200.129:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"
apollo_portal_db_username=root
apollo_portal_db_password=root

6)启动服务:

Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用,如果端口没有被使用,我们可以直接启动程序,启动程序执行​​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!

启动完成后访问 ​​http://192.168.200.129:8070/,可以看到Apollo配置界面,登录账号apollo,密码admin​

【推荐】我认为这是最完整的Apollo教程从入门到精通_java_05

1.2.2 Docker容器安装

如果您对Docker非常熟悉,可以使用Docker的方式快速部署Apollo,从而快速的了解Apollo。确保docker-quick-start文件夹已经在本地存在,如果本地已经clone过Apollo的代码,则可以跳过此步骤。

在docker-quick-start目录下执行​​docker-compose up​​,第一次执行会触发下载镜像等操作,需要耐心等待一些时间。

搜索所有​​apollo-quick-start​​开头的日志,看到以下日志说明启动成功:

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

不过基于Docker安装需要注意一些问题:

1:13306宿访localhost:13306root

2:docker exec -it apollo-quick-start bash /apollo-quick-start/service/apollo-quick-start/portal

安装完成后访问​​http://192.168.200.129:8070/,可以看到Apollo配置界面,​

【推荐】我认为这是最完整的Apollo教程从入门到精通_数据库_06

2 基本使用

登录apollo,进行如下操作

2.1 创建项目

1、登录后界面如下:

【推荐】我认为这是最完整的Apollo教程从入门到精通_后端_07

2、创建项目

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_08

点击创建应用,会出现如下表单:

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_09

创建应用参数说明:

  • 部门:选择应用所在的部门。部门数据来自​​ApolloPortalDB​​​ 库的​​ServerConfig​​​ 表的​​Key = organizations​​ 对应的记录。
  • 应用 AppId:用来标识应用身份的唯一 id,格式为 string,需要和客户端​​app.properties​​​ 中配置的​​app.id​​ 对应。
  • 应用名称:应用名,仅用于界面展示。
  • 应用负责人:默认具有项目管理员权限。
  • 项目管理员:可以创建 Namespace 和集群、分配用户权限。

创建完成后如下图所示:

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_10

2.2 创建配置

我们在默认的​​namespace​​​下创建配置信息,默认的​​namespace​​​支持的是​​properties​​​形式的配置,即:​​k=v​​结构的

1、将​​hailtaxi-driver​​​项目的配置托管到​​apollo​​​中,在​​apollo​​中创建配置

【推荐】我认为这是最完整的Apollo教程从入门到精通_数据库_11

2、创建好的配置还未发布,一定要发布

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_12

3、将​​hailtaxi-driver​​​项目的其余配置从​​nacos​​​中转移到​​apollo​

【推荐】我认为这是最完整的Apollo教程从入门到精通_后端_13

也就是说​​hailtaixi-driver​​项目中的所有配置如下:

management:
endpoint:
health:
show-details: always
app:
name: 黑马顺风车
version: v1.0
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/hailtaxi-driver?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root

seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: my_seata_group
enable-auto-data-source-proxy: true
use-jdk-proxy: false
excludes-for-auto-proxying: firstClassNameForExclude,secondClassNameForExclude
client:
rm:
async-commit-buffer-limit: 1000
report-retry-count: 5
table-meta-check-enable: false
report-success-enable: false
saga-branch-register-enable: false
lock:
retry-interval: 10
retry-times: 30
retry-policy-branch-rollback-on-conflict: true
tm:
degrade-check: false
degrade-check-period: 2000
degrade-check-allow-times: 10
commit-retry-count: 5
rollback-retry-count: 5
undo:
data-validation: true
log-serialization: jackson
log-table: undo_log
only-care-update-columns: true
log:
exceptionRate: 100
service:
vgroup-mapping:
my_seata_group: default
enable-degrade: false
disable-global-transaction: false
transport:
shutdown:
wait: 3
thread-factory:
boss-thread-prefix: NettyBoss
worker-thread-prefix: NettyServerNIOWorker
server-executor-thread-prefix: NettyServerBizHandler
share-boss-worker: false
client-selector-thread-prefix: NettyClientSelector
client-selector-thread-size: 1
client-worker-thread-prefix: NettyClientWorkerThread
worker-thread-size: default
boss-thread-size: 1
type: TCP
server: NIO
heartbeat: true
serialization: seata
compressor: none
enable-client-batch-send-request: true
registry:
type: nacos
nacos:
application: seata-server
server-addr: 192.168.200.129:8848
group : "SEATA_GROUP"
namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
username: "nacos"
password: "nacos"

注意:seata的​​namespace​

而​​apollo​​​中默认私有的​​application​​​的​​namespce​​​中支持的是​​properties​​​形式的,故需要将​​yaml​​​转换成​​properties​

可以使用在线转换工具:​​www.toyaml.com/index.html​

将转换完成的​​properties​​​添加到​​apollo​​中,可以使用批量添加

【推荐】我认为这是最完整的Apollo教程从入门到精通_数据库_14

添加完成后,发布!!!

2.3 应用接入

1、在​​hailtaxi-driver​​​项目中 添加​​apollo​​的客户端依赖

<!--ApolloClient-->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.7.0</version>
</dependency>

2、在​​bootstrap.yml​​配置文件中添加启动配置

首先停用​​nacos​​配置中心

spring:
cloud:
nacos:
config:
# 关闭 nacos 配置中心
enabled: false

然后添加​​apollo​​的启动配置,

3、配置​​appId​​​,可以在​​META-INF/app.properties​​中配置

#使用的 Apollo 的项目(应用)编号 AppId
app.id=hailtaxi-driver-config

也可在​​applicaton.properties/bootstrap.yml​​中配置

# 启用apollo配置中心
#app:
# id: hailtaxi-driver-config
apollo:
meta: http://192.168.200.129:8080 # Apollo Meta Server 地址(它的注册中心地址,eureka地址)
cacheDir: /opt/data
bootstrap:
enabled: true #是否开启 Apollo 配置预加载功能。默认为 false。
eagerLoad:
enable: true #是否开启 Apollo 支持日志级别的加载时机。默认为 false。
# 指定 namespace
namespaces: application #使用的 Apollo 的命名空间,默认为 application,多个用逗号隔开

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_15

4、使用​​@EnableApolloConfig​​​ 开启​​apollo​​​配置,通过​​-Denv=dev​​指定环境,不指定默认连接dev

5、启动项目,访问:​​http://localhost:18081/driver/appinfo​

6、验证动态刷新:​​apollo​​​也是支持​​Environment​​​ 和 ​​@Value​​ 刷新

在​​apollo​​​中修改​​app.name​​​ 和 ​​app.version​​查看动态刷新的结果

3 Apollo其他应用

3.1 公共配置

​apollo​​​中的所有配置都有从属的​​namespace​​​,而​​namespace​​​有两种类型:​​public​​​和​​private​​,区别如下:

public:
公共的Namespace的配置能被任何项目读取
通过创建公共Namespace可以实现公共组件的配置,或多个应用共享同一份配置的需求
如果其它应用需要覆盖公共部分的配置,可以在其它应用那里关联公共Namespace,然后在关联的Namespace里面配置需要覆盖的配置即可
如果其它应用不需要覆盖公共部分的配置,那么就不需要在其它应用那里关联公共Namespace


private:
私有Namespace的配置只能被所属的应用获取到
通过创建一个私有的Namespace可以实现分组管理配置
私有Namespace的格式可以是xml、yml、yaml、json、txt. 您可以通过apollo-client中ConfigFile接口来获取非properties格式Namespace的内容
1.3.0及以上版本的apollo-client针对yaml/yml提供了更好的支持,可以通过ConfigService.getConfig("someNamespace.yml")直接获取Config对象,也可以通过@EnableApolloConfig("someNamespace.yml")或apollo.bootstrap.namespaces=someNamespace.yml注入yml配置到Spring/SpringBoot中去

配置创建

1、创建公共配置​​shared-datasource​

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_16

公共​​namespace​​​下的配置只能是​​properties​​类型的

2、假设现在数据源的配置作为公共配置,我们将数据源的配置添加到公共配置中

首先从默认的​​application​​中删除数据源的配置

【推荐】我认为这是最完整的Apollo教程从入门到精通_后端_17

然后在​​shared-datasource​​下添加

spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/hailtaxi-driver?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password = root

【推荐】我认为这是最完整的Apollo教程从入门到精通_数据库_18

注意:删除和添加都要在对应的​​namespace​​中提交!!!

3、在应用端(​​apollo​​​客户端)的​​bootstrap.yml​​​中添加​​namespace​

# 启用apollo配置中心
app:
id: hailtaxi-driver-config #使用的 Apollo 的项目(应用)编号 AppId
apollo:
meta: http://192.168.200.129:8080 # Apollo Meta Server 地址(它的注册中心地址,eureka地址)
bootstrap:
enabled: true #是否开启 Apollo 配置预加载功能。默认为 false。
eagerLoad:
enable: true #是否开启 Apollo 支持日志级别的加载时机。默认为 false。
# 指定namespace
namespaces: application,shared-datasource #使用的 Apollo 的命名空间,默认为 application,多个用逗号隔开

4、启动测试:​​http://localhost:18081/driver/info/1​

配置关联

我们接下来创建一个项目​​hailtaxi-order​​,在它里面关联公共配置,

【推荐】我认为这是最完整的Apollo教程从入门到精通_后端_19

然后创建​​namespace​​的时候关联公共配置

【推荐】我认为这是最完整的Apollo教程从入门到精通_java_20

完成后如下所示:

【推荐】我认为这是最完整的Apollo教程从入门到精通_数据库_21

当然如果对于有些公共配置,在本项目中我们还可以采取覆盖操作

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_22

3.2 私有配置

私有​​namespace​​​下的配置是可以在创建​​namespace​​时指定类型的.

1、在​​hailtaxi-driver-config​​​项目中创建一个私有​​namespace​

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_23

创建完项目下的展示如下

【推荐】我认为这是最完整的Apollo教程从入门到精通_后端_24

2、在​​mydriver​​中添加如下配置,

driver:
name: 唐僧老师
age: 18

我们添加部分信息如下图:

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_25

3、在​​bootstrap.yml​​​中添加​​namespace​​​,这里需要注意一下私有的​​namespace​​​名称如果是非​​properties​​的时,名字要带后缀

【推荐】我认为这是最完整的Apollo教程从入门到精通_数据库_26

4、找到​​DriverController​​,添加如下代码

@Value("${driver.name}")
private String driverName;
@Value("${driver.age}")
private int driverAge;

@GetMapping("/driverinfo")
public String getDriverInfo() {
return driverName + ";"+driverAge;
}

5、启动,访问: ​​http://localhost:18081/driver/driverinfo​

3.3 配置刷新

@Value 和 Environment

前面已经讲过,​​apollo​​​支持​​@Value​​​和​​Environment​​​动态刷新,而对于​​@ConfigurationProperties​​,能加载到配置,但是无法自动刷新

1、创建​​com.itheima.driver.properties.DriverProperties​​​,读取前面配置的​​driver.name​​​和​​driver.age​​信息

package com.itheima.driver.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "driver")
public class DriverProperties {

private String name;

private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int {
this.age = age;
}
@Override
public String toString() {
return "DriverProperties{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

2、改造刚刚的​​com.itheima.driver.controller.DriverController#getDriverInfo​​方法

@Autowired
private DriverProperties driverProperties;

@GetMapping("/driverinfo")
public String getDriverInfo() {
return driverName + ";"+driverAge + ","+driverProperties;
}

3、启动访问:​​http://localhost:18081/driver/driverinfo​

在apollo中修改配置,查看是否能刷新!!!

Apollo监听器

Apollo 已经能够满足我们绝大多数场景下的自动刷新配置的功能,但是项目中如果使用了​​@ConfigurationProperties​​此时只能借助Apollo的监听器功能实现数据刷新,可以先在监听器中读取变更的内容,然后调用指定的set方法执行重新赋值操作。

我们在​​hailtaxi-driver​​​中创建监听器​​com.itheima.driver.listener.ApolloConfigListener​​,代码如下:

@Component
@Slf4j
public class ApolloConfigListener implements ApplicationContextAware {

private ApplicationContext applicationContext;

@Autowired
RefreshScope refreshScope;

@ApolloConfigChangeListener(
value = {"mydriver","application","test"} // 指定要监听的namespace
// ,interestedKeyPrefixes = {"driver","app","person"} // 以driver开头的配置发生变更后会进行通知
)
public void configChange(ConfigChangeEvent event) {
// 配置发生变更后获取最新配置数据
Set<String> changedKeys = event.changedKeys();
for (String changedKey : changedKeys) {
log.info("changed key = {}",changedKey);
log.info("oldValue={},newValue={}",event.getChange(changedKey).getOldValue(),event.getChange(changedKey).getNewValue());
}
this.applicationContext.publishEvent(new EnvironmentChangeEvent(event.changedKeys()));
refreshScope.refreshAll();
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}

测试发现properties类型的配置能被监听到!!!

新建​​test​​名称空间(properties)类型,添加配置:

driver.name = 黑马程序员唐僧老师!!! driver.age = 18

在apollo中修改配置,查看效果!!!

3.4 配置加密

考虑到安全性,我们可能最好将配置文件中的敏感信息进行加密。例如说,MySQL 的用户名密码、第三方平台的 Token 令牌等等。不过,Apollo 暂时未内置配置加密的功能。官方文档说明如下:

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_27

项目地址:​​github.com/ctripcorp/a…​

1、在​​hailtaxi-driver​​中添加jasypt坐标依赖

<!--jasypt-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>

2、配置​​jasypt​​​加密算法及对应的密钥(放到​​bootstrap.yml​​中即可)

jasypt:
encryptor:
#算法
algorithm: PBEWithMD5AndDES
#向量操作对象
iv-generator-classname: org.jasypt.iv.NoIvGenerator
#秘钥
password: itheima

配置数据可以放到apollo中,!!!

3、创建测试程序,将数据库密码加密:​​com.itheima.driver.DriverApplicationTest​

@SpringBootTest
@RunWith(SpringRunner.class)
public class DriverApplicationTest {


@Autowired
private StringEncryptor encryptor;

@Test
public void encode() {
String password = "root";
System.out.println(encryptor.encrypt(password));
}
}

测试运行输出的密文:​​3OzWpNao6JPFAHYHeWIrlw==​

4、将密文配置到apollo中

我们将密文配置到Apollo中,以​​ENC(密文)​​修饰,我们对数据连接中密码进行加密,如下图:

【推荐】我认为这是最完整的Apollo教程从入门到精通_后端_28

5、启动项目进行测试:​​http://localhost:18081/driver/info/1​

3.5 灰度发布

通过创建灰度版本,您可以对某些配置做灰度测试 灰度流程为:

1.创建灰度版本
2.配置灰度配置项
3.配置灰度规则.如果是私有的namespace可以按照客户端的IP进行灰度,如果是公共的namespace则可以同时按AppId和客户端的IP进行灰度
4.灰度发布

灰度版本最终有两种结果:全量发布和放弃灰度

1、全量发布:灰度的配置合到主版本并发布,所有的客户端都会使用合并后的配置

2、放弃灰度:删除灰度版本,所有的客户端都会使用回主版本的配置 注意事项:如果灰度版本已经有灰度发布过,那么修改灰度规则后,无需再次灰度发布就立即生效

1、将​​hailtaxi-driver​​​打包,上传到​​192.168.200.129​​服务器上,

2、在apollo中将`shared-datasource下将数据库的连接地址改一下,如下

【推荐】我认为这是最完整的Apollo教程从入门到精通_java_29

注意,数据库要开启远程访问权限!!!

3、在​​129​​​机器上启动​​hailtaxi-driver​

java -jar hailtaxi-driver-1.0-SNAPSHOT.jar

4、针对​​application​​命名空间下的配置进行灰度

【推荐】我认为这是最完整的Apollo教程从入门到精通_数据库_30

按照 ​​IP​​​ 进行灰度,灰度配置只在​​129​​机器上生效

如果​​namespace​​​是​​public​​​的,可以按照​​appid​​​和​​IP​​进行灰度

5、灰度下修改配置,要点击灰度发布才生效!

【推荐】我认为这是最完整的Apollo教程从入门到精通_spring_31

6、测试:

​http://localhost:18081/driver/appinfo​​ 还是原版本

​http://192.168.200.129:18081/driver/appinfo​​ 是灰度版本

6、全量灰度发布在现实工作中是指灰度版本没有问题了,需要把所有服务的版本全部切换成完成测试的灰度版本,我们点击全量发布即可,全量发布的时候,我们可以把灰度版本删除。

【推荐】我认为这是最完整的Apollo教程从入门到精通_java_32

7、再次测试:

​http://localhost:18081/driver/appinfo​​ 均是灰度后的版本了!!!

4 Apollo多环境配置

现实中Apollo是要作多环境部署的,比如:​​dev​​​,​​test​​​,​​pro​​等等

Apollo多环境配置的要点是,每多配置一个环境就多启动两套服务(apollo-adminsevice+apollo-configservice),apollo-portal服务永远只启动一套,所以我们的步骤是下载好这三套服务,按照自己设定的每个环境把文件分布好、设置好端口、数据库等,然后启动

1、下载三个服务

wget https://github.com/ctripcorp/apollo/releases/download/v1.7.0/apollo-adminservice-1.7.0-github.zip
wget https://github.com/ctripcorp/apollo/releases/download/v1.7.0/apollo-configservice-1.7.0-github.zip
wget https://github.com/ctripcorp/apollo/releases/download/v1.7.0/apollo-portal-1.7.0-github.zip

2、创建对应的目录并赋权限

mkdir -p adminservice/dev
mkdir -p adminservice/pro
mkdir -p configservice/dev
mkdir -p configservice/pro
mkdir portal
chmod -R 755 adminservice/ configservice/ portal/

3、解压到对应的目录下

unzip apollo-adminservice-1.7.0-github.zip -d adminservice/dev
unzip apollo-adminservice-1.7.0-github.zip -d adminservice/pro/
unzip apollo-configservice-1.7.0-github.zip -d configservice/dev
unzip apollo-configservice-1.7.0-github.zip -d configservice/pro/
unzip apollo-portal-1.7.0-github.zip -d portal

4、准备数据库,现在有两套环境,​​dev​​​和​​pro​​需要单独准备数据库

在​​192.168.200.129​​​上创建两套库,,主要是针对​​apolloconfigdb​​​,​​apolloportaldb​​只需要一份

【推荐】我认为这是最完整的Apollo教程从入门到精通_后端_33

5、在数据库中修改相关参数信息

【推荐】我认为这是最完整的Apollo教程从入门到精通_数据库_34

在​​apolloportaldb​​中增加环境列表

【推荐】我认为这是最完整的Apollo教程从入门到精通_java_35

6、确保​​apollo-configservice​​​服务和​​apollo-adminservice​​服务启动时连接各自的数据库

编辑

​/adminservice/dev/config/application-github.properties​

spring.datasource.url = jdbc:mysql://127.0.0.1:3306/ApolloConfigDB_dev?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root

​/adminservice/pro/config/application-github.properties​

spring.datasource.url = jdbc:mysql://127.0.0.1:3306/ApolloConfigDB_pro?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root

编辑

​/configservice/dev/config/application-github.properties​

# DataSource
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/ApolloConfigDB_dev?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root

​/configservice/pro/config/application-github.properties​

# DataSource
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/ApolloConfigDB_pro?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root

7、修改端口占用冲突,现在在一台主机上部署了两套​​adminservice​​​和​​configservice​​​,我们修改​​pro​​环境下这个两个服务占用的端口

​/adminservice/pro/scripts/startup.sh​

## Adjust log dir if necessary
LOG_DIR=/opt/logs/100003174
## Adjust server port if necessary
SERVER_PORT=${SERVER_PORT:=8091}

注意端口冲突,​​seata​​默认占用的端口也是8091

​/configservice/pro/scripts/startup.sh​

## Adjust log dir if necessary
LOG_DIR=/opt/logs/100003173
## Adjust server port if necessary
SERVER_PORT=${SERVER_PORT:=8081}

8、配置​​apollo-portal​​支持多套环境配置以及连接的数据库

​/portal/config/application-github.properties​

# DataSource
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/ApolloPortalDB_all?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root

​/portal/config/apollo-env.properties​

local.meta=http://localhost:8080
dev.meta=http://localhost:8080
fat.meta=http://fill-in-fat-meta-server:8080
uat.meta=http://fill-in-uat-meta-server:8080
lpt.meta=${lpt_meta}
pro.meta=http://localhost:8081

9、依次启动​​apollo-configservice​​​,​​apollo-adminservice​​​,​​apollo-portal​

./configservice/dev/scripts/startup.sh
./configservice/pro/scripts/startup.sh

./adminservice/dev/scripts/startup.sh
./adminservice/pro/scripts/startup.sh

./portal/scripts/startup.sh

10、验证,

访问:​​http://192.168.200.129:8070​

【推荐】我认为这是最完整的Apollo教程从入门到精通_数据库_36

11、应用接入时通过接入不同的​​meta server​​即可接入不同环境

apollo:
meta: http://192.168.200.129:8080 #连接apollo meta server

思考:

apollo的集群配置 评论区写下你的评论