注意:填入的用户需要具备对 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 infoapollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)
注意:不要修改 demo.sh 的其它部分
❞ 搭建服务端 确保端口未被占用Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用。
执行启动脚本 ./demo.sh startApollo 提供的脚本文件为 .sh 文件,如果你的安装环境是在 Linux 系统下直接运行以上命令即可,如果你想在 Windows 环境下运行该脚本,先安装 Git 然后在 demo.sh 所在目录下鼠标右键点击 Git Bash Here,然后再通过以上命令运行脚本即可。
当看到如下输出后,就说明启动成功了!
==== starting service ==== Service logging file is ./service/apollo-service.log Started [10768] Waiting for config service startup....... Config service started. You may visit :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 :8070 now! 异常排查如果启动遇到了异常,可以分别查看 service 和 portal 目录下的 log 文件排查问题。
❝注:在启动 apollo-configservice 的过程中会在日志中输出 eureka 注册失败的信息,如com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused。需要注意的是,这个是预期的情况,因为 apollo-configservice 需要向 Meta Server(它自己)注册服务,但是因为在启动过程中,自己还没起来,所以会报这个错。后面会进行重试的动作,所以等自己服务起来后就会注册正常了。
❞ 访问访问::8070/ Quick Start 集成了 Spring Security,输入用户名 apollo,密码 admin 后登录。
登录成功后,首页如下,Apollo 还提供了一个 SampleApp 样本案例供我们学习使用。
创建项目点击对应按钮创建项目。
这里先通过默认的样例部门演示(后面我会讲如何添加部门),AppId 对应客户端配置文件中 app.id。
创建成功如下图。
客户端接入服务端点击链接观看:Apollo 客户端接入服务端视频(获取更多请关注公众号「哈喽沃德先生」)
下面通过最常用、便捷的方式,即基于 Spring Boot 的集成方式来接入服务端。
apollo-demo 聚合工程。Spring Boot 2.2.4.RELEASE
order-service:订单服务,端口 9090
order-service02:订单服务,端口 9091
添加依赖 <!-- https://mvnrepository.com/artifact/com.ctrip.framework.apollo/apollo-client --> <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.6.0</version> </dependency> 配置文件order-service 和 order-service02 的配置信息除端口外一致。
server: port: 9090 # 端口 spring: application: name: order-service # 应用名称 # apollo 相关配置 app: id: order-service # 与 Apollo 配置中心中的 AppId 一致 apollo: meta: :8080 # Apollo 中的 Eureka 注册中心地址 #cluster: # 指定 Apollo 集群,相同集群实例使用对应集群的配置 #cacheDir: # 配置缓存目录,网络不可用时任然可提供配置服务 bootstrap: enable: true # 启用 apollo env: DEV # 指定环境 # 自定义配置 name: order-service-dev mysql: host: localhost port: 3306 username: root password: root 配置文件实体类order-service 和 order-service02 的配置文件实体类代码一致。
package com.example.config; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component @Data @NoArgsConstructor @AllArgsConstructor public class ConfigProperties { @Value("${name}") private String name; @Value("${mysql.host}") private String mysqlHost; @Value("${mysql.port}") private Integer mysqlPort; @Value("${mysql.username}") private String mysqlUsername; @Value("${mysql.password}") private String mysqlPassword; } 控制层order-service 和 order-service02 的控制层代码一致。
package com.example.controller; import com.example.config.ConfigProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Map; @RestController public class ConfigController { @Autowired private ConfigProperties configProperties; @Value("${name}") private String name; @GetMapping("/name") public String getName() { return configProperties.getName(); } @GetMapping("/mysql") public Map<Object, Object> getMySQLProperties() { // JDK9中的新特性,快速创建只读集合。 return Map.of("host", configProperties.getMysqlHost(), "port", configProperties.getMysqlPort(), "username", configProperties.getMysqlUsername(), "password", configProperties.getMysqlPassword()); } } 启动类启动类需要添加 @EnableApolloConfig 注解。
order-service 和 order-service02 的启动类代码一致。
package com.example; import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableApolloConfig @SpringBootApplication public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } } 测试 修改配置信息前访问::9090/name 和 :9091/name 结果如下:
访问::9090/mysql 和 :9091/mysql 结果如下:
新增配置信息进入项目后点击右上角的 新增配置。
添加配置项 name、mysql.username、mysql.password。
发布配置信息将刚才添加的配置信息批量发布至应用。
修改配置信息后控制台打印信息如下:
c.f.a.s.p.AutoUpdateConfigChangeListener : Auto update apollo changed value successfully, new value: order-service-dev-2.0, key: name, beanName: configController, field: com.example.controller.ConfigController.name c.f.a.s.p.AutoUpdateConfigChangeListener : Auto update apollo changed value successfully, new value: root123, key: mysql.password, beanName: configProperties, field: com.example.config.ConfigProperties.mysqlPassword c.f.a.s.p.AutoUpdateConfigChangeListener : Auto update apollo changed value successfully, new value: root123, key: mysql.username, beanName: configProperties, field: com.example.config.ConfigProperties.mysqlUsername访问::9090/name 和 :9091/name 结果如下:
访问::9090/mysql 和 :9091/mysql 结果如下:
❝以上只是 Apollo 的入门教程,后面我们会学习 Apollo 的更多高级玩法,比如多环境部署,高可用环境搭建等等。