共计 18145 个字符,预计需要花费 46 分钟才能阅读完成。
第 1 章 Apollo 我的项目实战
能力指标
- 把握 Apollo 装置
- 把握 Apollo 配置操作
- 可能实现 SpringBoot 集成 Apollo
- 可能实现 Apollo 实用性能【主动刷新、监听器、配置加密、1 灰度公布】
1 Apollo 利用
我的项目地址:https://github.com/ctripcorp/…
使用手册(多读多看):https://github.com/ctripcorp/…
1.1 初识 Apollo
Apollo(阿波罗)是携程框架部门研发的分布式配置核心,可能集中化治理利用不同环境、不同集群的配置,配置批改后可能实时推送到利用端,并且具备标准的权限、流程治理等个性,实用于微服务配置管理场景。
服务端基于 Spring Boot 和 Spring Cloud 开发,打包后能够间接运行,不须要额定装置 Tomcat 等利用容器。
Java 客户端不依赖任何框架,可能运行于所有 Java 运行时环境,同时对 Spring/Spring Boot 环境也有较好的反对。
1)外围性能:
对立治理不同环境、不同集群配置:1:Apollo 提供了一个对立界面集中式治理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。2: 同一份代码部署在不同的集群,能够有不同的配置,比方 zk 的地址等
3: 通过命名空间(namespace)能够很不便的反对多个不同利用共享同一份配置,同时还容许利用对共享的配置进行笼罩
4: 配置界面反对多语言(中文,English)热公布:
用户在 Apollo 批改完配置并公布后,客户端能实时(1 秒)接管到最新的配置,并告诉到应用程序。版本公布治理:
所有的配置公布都有版本概念,从而能够不便的反对配置的回滚。灰度公布:
反对配置的灰度公布,比方点了公布后,只对局部利用实例失效,等察看一段时间没问题后再推给所有利用实例。权限治理、公布审核、操作审计:
1: 利用和配置的治理都有欠缺的权限管理机制,对配置的治理还分为了编辑和公布两个环节,从而缩小人为的谬误。2: 所有的操作都有审计日志,能够不便的追踪问题。客户端配置信息监控:
能够不便的看到配置在被哪些实例应用
提供 Java 和.Net 原生客户端:
1: 提供了 Java 和.Net 的原生客户端,不便利用集成
2: 反对 Spring Placeholder,Annotation 和 Spring Boot 的 ConfigurationProperties,不便利用应用(须要 Spring 3.1.1+)3: 同时提供了 Http 接口,非 Java 和.Net 利用也能够不便的应用
提供开放平台 API:
1:Apollo 本身提供了比较完善的对立配置管理界面,反对多环境、多数据中心配置管理、权限、流程治理等个性。2: 不过 Apollo 出于通用性思考,对配置的批改不会做过多限度,只有合乎根本的格局就可能保留。3: 在咱们的调研中发现,对于有些应用方,它们的配置可能会有比较复杂的格局,如 xml, json,须要对格局做校验。4: 还有一些应用方如 DAL,不仅有特定的格局,而且对输出的值也须要进行校验前方可保留,如查看数据库、用户名和明码是否匹配。5: 对于这类利用,Apollo 反对利用方通过凋谢接口在 Apollo 进行配置的批改和公布,并且具备欠缺的受权和权限管制
部署简略:
1: 配置核心作为根底服务,可用性要求十分高,这就要求 Apollo 对外部依赖尽可能地少
2: 目前惟一的内部依赖是 MySQL,所以部署非常简单,只有装置好 Java 和 MySQL 就能够让 Apollo 跑起来
3:Apollo 还提供了打包脚本,一键就能够生成所有须要的安装包,并且反对自定义运行时参数
2)谁在用它
国内很多大厂都在用 Apollo 作为分布式配置核心,如果你们的网站也在用,在 https://github.com/ctripcorp/… 能够进行注销。
携程、华为、京东、智联招聘、中国移动、360 金融、中通快递、转转、贝壳网、土巴兔、安全银行、有赞等泛滥国内大厂在用 Apollo。
1.2 Apollo 单机部署
咱们接下来实现 Apollo 装置,装置前咱们先介绍一下单机版装的架构,如下图:
上图展现了 Apollo 单机部署架构,咱们对其中每个节点进行解释阐明:
Apollo Config Service: 提供配置的读取、推送等性能,服务对象是 Apollo 客户端。Apollo Admin Service: 提供配置的批改、公布等性能,服务对象是 Apollo Portal。Apollo Portal:Apollo 的治理界面,进行不同我的项目的配置(我的项目配置、权限配置等),服务对象是开发者和开放平台 API。
环境阐明:
MySQL:MySQL 倡议用 5.7,版本要求 5.6.5+
Apollo 服务端:JDK1.8+
Apollo 客户端:JDK1.7+
Apollo 装置形式有多种,官网提供了疾速装置模式和 Docker 装置模式,咱们把两种装置模式都实现一次,但如果是生产环境请应用分布式部署计划
(https://github.com/ctripcorp/…)
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 下载地址:https://github.com/nobodyiam/…
Quick Start 只针对本地测试应用,所以个别用户不须要本人下载源码打包,只须要下载曾经打好的包即可。不过也有局部用户心愿在批改代码后从新打包,那么能够参考如下步骤:
1: 批改 apollo-configservice, apollo-adminservice 和 apollo-portal 的 pom.xml,正文掉 spring-boot-maven-plugin 和 maven-assembly-plugin
2: 在根目录下执行 mvn clean package -pl apollo-assembly -am -DskipTests=true
3: 复制 apollo-assembly/target 下的 jar 包,rename 为 apollo-all-in-one.jar
4)创立数据库:
Apollo 服务端共须要两个数据库:ApolloPortalDB
和ApolloConfigDB
,咱们把数据库、表的创立和样例数据都别离筹备了 sql 文件,只须要导入数据库即可。
留神:如果你本地曾经创立过 Apollo 数据库,请留神备份数据。咱们筹备的 sql 文件会清空 Apollo 相干的表。
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
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:13306,用户名是 root,明码留空。2: 如要查看更多服务的日志,能够通过 docker exec -it apollo-quick-start bash 登录,而后到 /apollo-quick-start/service 和 /apollo-quick-start/portal 下查看日志信息。
装置实现后拜访 http://192.168.200.129:8070/,能够看到 Apollo 配置界面,
2 根本应用
登录 apollo,进行如下操作
2.1 创立我的项目
1、登录后界面如下:
2、创立我的项目
点击创立利用,会呈现如下表单:
创立利用参数阐明:
- 部门:抉择利用所在的部门。部门数据来自
ApolloPortalDB
库的ServerConfig
表的Key = organizations
对应的记录。 - 利用 AppId:用来标识利用身份的惟一 id,格局为 string,须要和客户端
app.properties
中配置的app.id
对应。 - 利用名称:利用名,仅用于界面展现。
- 利用负责人:默认具备我的项目管理员权限。
- 我的项目管理员:能够创立 Namespace 和集群、调配用户权限。
创立实现后如下图所示:
2.2 创立配置
咱们在默认的 namespace
下创立配置信息,默认的 namespace
反对的是 properties
模式的配置,即:k=v
构造的
1、将 hailtaxi-driver
我的项目的配置托管到 apollo
中,在 apollo
中创立配置
2、创立好的配置还未公布,肯定要公布
3、将 hailtaxi-driver
我的项目的其余配置从 nacos
中转移到apollo
也就是说 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
能够应用在线转换工具:https://www.toyaml.com/index….
将转换实现的 properties
增加到 apollo
中,能够应用批量增加
增加实现后,公布!!!
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,多个用逗号隔开
4、应用 @EnableApolloConfig
开启apollo
配置,通过 -Denv=dev
指定环境,不指定默认连贯 dev
5、启动我的项目,拜访:http://localhost:18081/driver…
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
公共 namespace
下的配置只能是 properties
类型的
2、假如当初数据源的配置作为公共配置,咱们将数据源的配置增加到公共配置中
首先从默认的 application
中删除数据源的配置
而后在 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
留神:删除和增加都要在对应的
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…
配置关联
咱们接下来创立一个我的项目hailtaxi-order
,在它外面关联公共配置,
而后创立 namespace
的时候关联公共配置
实现后如下所示:
当然如果对于有些公共配置,在本我的项目中咱们还能够采取笼罩操作
3.2 公有配置
公有 namespace
下的配置是能够在创立 namespace
时指定类型的.
1、在 hailtaxi-driver-config
我的项目中创立一个公有namespace
创立完我的项目下的展现如下
2、在 mydriver
中增加如下配置,
driver:
name: 唐僧老师
age: 18
咱们增加局部信息如下图:
3、在 bootstrap.yml
中增加 namespace
,这里须要留神一下公有的namespace
名称如果是非 properties
的时,名字要带后缀
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…
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 age) {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…
在 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 临时未内置配置加密的性能。官网文档阐明如下:
我的项目地址:https://github.com/ctripcorp/…
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(密文)
润饰,咱们对数据连贯中明码进行加密,如下图:
5、启动我的项目进行测试:http://localhost:18081/driver…
3.5 灰度公布
通过创立灰度版本,您能够对某些配置做灰度测试
灰度流程为:
1. 创立灰度版本
2. 配置灰度配置项
3. 配置灰度规定. 如果是公有的 namespace 能够依照客户端的 IP 进行灰度,如果是公共的 namespace 则能够同时按 AppId 和客户端的 IP 进行灰度
4. 灰度公布
灰度版本最终有两种后果:全量公布和放弃灰度
1、全量公布: 灰度的配置合到主版本并公布,所有的客户端都会应用合并后的配置
2、放弃灰度 : 删除灰度版本,所有的客户端都会应用回主版本的配置
注意事项: 如果灰度版本曾经有灰度公布过,那么批改灰度规定后,无需再次灰度公布就立刻失效
1、将 hailtaxi-driver
打包,上传到 192.168.200.129
服务器上,
2、在 apollo 中将 `shared-datasource下将数据库的连贯地址改一下,如下
留神,数据库要开启近程拜访权限!!!
3、在 129
机器上启动hailtaxi-driver
java -jar hailtaxi-driver-1.0-SNAPSHOT.jar
4、针对 application
命名空间下的配置进行灰度
依照 IP
进行灰度,灰度配置只在 129
机器上失效
如果 namespace
是public
的,能够依照 appid
和IP
进行灰度
5、灰度下批改配置,要点击灰度公布才失效!
6、测试:
http://localhost:18081/driver… 还是原版本
http://192.168.200.129:18081/… 是灰度版本
6、全量灰度公布在事实工作中是指灰度版本没有问题了,须要把所有服务的版本全副切换成实现测试的灰度版本,咱们点击全量公布即可, 全量公布的时候,咱们能够把灰度版本删除。
7、再次测试:
http://localhost:18081/driver… 均是灰度后的版本了!!!
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
只须要一份
5、在数据库中批改相干参数信息
在 apolloportaldb
中减少环境列表
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
11、利用接入时通过接入不同的 meta server
即可接入不同环境
apollo:
meta: http://192.168.200.129:8080 #连贯 apollo meta server
课后拓展:
apollo 的集群配置
本文由传智教育博学谷 – 狂野架构师教研团队公布,转载请注明出处!
如果本文对您有帮忙,欢送关注和点赞;如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源