## 一 、再看部署架构图

在上一节中,我们将apollo portal的配置中心web管理界面安装成功,如上图中的红色部分。portal用来管理多个运行环境,比如:生产环境、测试环境、开发环境等。
本节我们就以DEV(开发环境)来为大家介绍apollo服务端其他组件的部署,也就是config-service和adminservice(上图中的蓝色部分)。为了更贴近实际,并且保障高可用(开发环境也可以是高可用,避免服务不可用导致的开发效率问题),我们将config-service和adminservice分别部署启动3个实例。
> 上图中蓝色部分并没有体现出DEV环境的config-service和adminservice高可用分布式部署,只体现了单实例。这点我们不同。
下图是我们以DEV(开发环境)为例的部署图。以后我们每增加一套环境,就要完成本节所讲内容的安装与配置。

## 二、准备工作
与上一节中安装Apollo Portal的要求是一样的,需要准备好java环境(1.8+),MysQL环境(5.6.5+)。并且将apollo-configservice-1.6.1-github.zip和apollo-adminservice-1.6.1-github.zip上传到如下的主机。
| 环境 | 主机 | ConfigService端口规划 | AdmingService端口规划 |
| --- | --- | --- | --- |
| DEV | 192.168.161.3 | 9431 | 9432 |
| DEV | 192.168.161.4 | 9431 | 9432 |
| DEV | 192.168.161.5 | 9431 | 9432 |
## 三、安装ConfigService和AdminService
### 3.1.创建ApolloConfigDB数据库
ConfigService 和 AdminServie都需要操作数据库`ApolloConfigDB`,官方把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。
* 管理员账号执行初始化SQL:[sql/apolloconfigdb.sql](https://github.com/nobodyiam/apollo-build-scripts/blob/master/sql/apolloconfigdb.sql),包含建库、建表及示例数据
~~~
# 用管理员账号登录mysql之后执行命令,创建数据库、建表及插入示例数据。
mysql > source 你的SQL所在的linux文件路径/apolloconfigdb.sql
~~~
虽然我们用管理员账户创建数据库,但是我们一般不用管理员用户访问业务数据库,所以我建立了一个test用户,并对其进行赋权。
~~~
CREATE USER 'test'@'%' IDENTIFIED BY '你的密码';
GRANT ALL ON ApolloConfigDB.* TO 'test'@'%' IDENTIFIED BY '你的密码'; //只有执行了这一句才可以远程登陆
FLUSH PRIVILEGES;
~~~
### 3.2.修改ConfigService和AdminService数据库连接配置文件
apollo-configservice-1.6.1-github.zip和apollo-adminservice-1.6.1-github.zip解压之后,config目录下面也都有一个config/application-github.properties文件,修改其中的mysql ip地址、端口、用户名、密码信息,指向ApolloConfigDB所在的mysql数据库。
~~~
# 创建目录,并解压到该目录
mkdir ./configservice && unzip apollo-configservice-1.6.1-github.zip -d ./configservice
mkdir ./adminservice&& unzip apollo-adminservice-1.6.1-github.zip -d ./adminservice
~~~
> apollo-configservice-1.6.1-github.zip和apollo-adminservice-1.6.1-github.zip与portal解压之后的文件结构大同小异。如果有问题,可以看上一节内容。不同之处我会单独讲解。
* 根据你的数据库地址将localhost修改为ApolloConfigDB数据库主机ip
* 根据你的ApolloConfigDB数据库修改用户名密码,我的用户名是test(上文新建的)
~~~
spring.datasource.url = jdbc:mysql://你的mysql所在主机ip:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = test
spring.datasource.password = 你的用户密码
~~~
### 3.3.修改Eureka服务注册中心连接配置
* ConfigService和AdminService是Spring Cloud微服务,所以二者需要向服务注册中心注册
* ConfigService包含eureka,所以实际上就是向ConfigService注册。我们规划的ConfigService接口是9431。
* ConfigService和AdminService都操作ApolloConfigDB,为了避免重复配置,所以官方将eureka连接配置放在了数据库里面。
在ApolloConfigDB中执行如下的SQL,配置eureka集群连接。
~~~
UPDATE apolloconfigdb.ServerConfig
SET ServerConfig.`Value`='http://192.168.161.3:9431/eureka/,http://192.168.161.4:9431/eureka/,http://192.168.161.5:9431/eureka/'
WHERE `Key`='eureka.service.url';
~~~
## 四、ConfigService和AdminService服务启动
### 4.1 先改端口
ConfigService和AdminService的默认端口是8080, 8090端口,按照我们的规划改成9431和9432。修改scripts/startup.sh脚本(三台服务器182.168.161.3,192.168.161.4,192.168.161.5都要改,所以可以将zip里面文件中端口改好之后再上传服务器):

同时要把这2个端口在防火墙上开放出来
~~~
firewall-cmd --zone=public --add-port=9431/tcp --permanent;
firewall-cmd --zone=public --add-port=9432/tcp --permanent;
firewall-cmd --reload
~~~
### 4.2.执行启动脚本
分别进入三台服务器182.168.161.3,192.168.161.4,192.168.161.5的configservice、adminservice目录下。脚本的启动顺序没有必然的先后(连接失败可以重试),但最好先启动configservice。执行startup.sh脚本(脚本的路径根据你自己的主机目录修改):
~~~
/root/apollo/configservice/scripts/startup.sh; #先在每台机器上执行这个,因为包含eureka。
/root/apollo/adminservice/scripts/startup.sh; #然后每台机器上执行这个
~~~
## 四、部署结果验证
* 验证eureka访问:[http://192.168.161.3:9431/](http://192.168.161.3:9431/),[http://192.168.161.4:9431/](http://192.168.161.4:9431/),[http://192.168.161.5:9431/](http://192.168.161.5:9431/),然后去检查所有实例是否启动成功。

按照上图中的红色标记检查部署结果。
## 五、部署问题解决
### 5.1.多网卡问题解决
之前我们讲过eureka的多网卡选择问题,eureka是一spring cloud(boot)服务,所以该解决方案适用于所有的spring cloud(boot)服务。也就适用于configService和adminservice。在二者的application-github.properties文件中加入网卡选择配置(参考eureka多网卡选择章节学习)
~~~
spring.cloud.inetutils.preferredNetworks=192.168
spring.cloud.inetutils.ignoredInterfaces[0]=enp0s3
spring.cloud.inetutils.ignoredInterfaces[1]=docker0
eureka.instance.hostname=peer1
eureka.instance.instance-id: ${spring.application.name}-${eureka.instance.hostname}:${server.port}
~~~
将hostname为peer1、peer2、peer3分别应用于三台主机,配置修改完成之后,重启configservice、adminservice
> 我们部署了configService,configService中默认包含了eureka,所以未来所有eureka遇到的问题都可以在configService应用中通过配置解决。
## 六、修改Portal环境配置
因为我们新增了DEV开发环境,并且部署了ConfigService和AdminService,所以需要将其告知Apollo Portal。方法就是修改portal应用(上一节部署)的配置文件是config/apollo-env.properties。
~~~
dev.meta=http://192.168.161.3:9431,http://192.168.161.4:9431,http://192.168.161.5:9431
~~~
将dev.meta的配置指向configService服务。Config service地址也可以填入IP,0.11.0版本之前只支持填入一个IP。从0.11.0版本开始支持填入以逗号分隔的多个地址。如上配置所示。
不过对于生产环境还是建议使用域名,通过SLB(Software Load Balancer:nginx or haproxy)做动态负载均衡,因为机器扩容、缩容等都可能导致IP列表的变化。

因为我们修改了portal配置文件,所以portal也要重启。
~~~
/root/apollo/portal/scripts/startup.sh;
~~~
## 七、调整ApolloPortal配置
服务配置项统一存储在ApolloPortalDB.ServerConfig表中,可以通过`管理员工具 - 系统参数`页面进行配置:apollo.portal.envs - 可支持的环境列表

默认值是dev(开发环境),不用改。如果我们本节内容新增的是生产环境的配置,应该写上“dev,pro”,然后保存。查看管理员工具->系统信息,如下:

- 文档简介
- 模块与代码分支说明
- dongbb-cloud项目核心架构
- 微服务架构进化论
- SpringBoot与Cloud选型兼容
- Spring Cloud组件的选型
- 单体应用拆分微服务
- 单体应用与微服务对比
- 微服务设计拆分原则
- 新建父工程及子模块框架
- 通用微服务初始化模块构建
- 持久层模块单独拆分
- 拆分rbac权限管理微服务
- Hello-microservice
- 构建eureka服务注册中心
- 向服务注册中心注册服务
- 第一个微服务调用
- 远程服务调用
- HttpClient远程服务调用
- RestTemplate远程服务调用
- RestTemplate多实例负载均衡
- Ribbon调用流程源码解析
- Ribbon负载均衡策略源码解析
- Ribbon重试机制与饥饿加载
- Ribbon自定义负载均衡策略
- Feign与OpenFeign
- Feign设计原理源码解析
- Feign请求压缩与超时等配置
- 服务注册与发现
- 白话服务注册与发现
- DiscoveryClient服务发现
- Eureka集群环境构建(linux)
- Eureka集群多网卡环境ip设置
- Eureka集群服务注册与安全认证
- Eureka自我保护与健康检查
- 主流服务注册中心对比(含nacos)
- zookeeper概念及功能简介
- zookeeper-linux集群安装
- zookeeper服务注册与发现
- consul概念及功能介绍
- consul-linux集群安装
- consul服务注册与发现
- 通用-auatator导致401问题
- 分布式配置中心-apollo
- 服务配置中心概念及使用场景
- apollo概念功能简介
- apollo架构详解
- apollo分布式部署之Portal
- apollo分布式部署之环境区分
- apollo项目权限管理实战
- apollo-java客户端基础
- apollo与SpringCloud服务集成
- apollo实例配置热更新
- apollo命名空间与集群
- apollo灰度发布(日志热更新为例)
- SpringCloudConfig配置中心
- config-git配置文件仓库
- config配置中心搭建与测试
- config客户端基础
- config配置安全认证
- config客户端配置刷新
- config配置中心高可用
- BUS消息总线
- bus消息总线简介
- docker安装rabbitMQ
- 基于rabbitMQ的消息总线
- bus实现批量配置刷新
- alibaba-nacos
- nacos介绍与单机部署
- nacos集群部署方式(linux)
- nacos服务注册与发现
- nacos服务注册中心详解
- nacos客户端配置加载
- nacos客户端配置刷新
- nacos服务配置隔离与共享
- nacos配置Beta发布
- 服务熔断降级hystrix
- 服务降级&熔断&限流
- Hystrix集成并实现服务熔断
- Jemter模拟触发服务熔断
- Hystrix服务降级fallback
- Hystrix结合Feign服务降级
- 远程服务调用异常传递的问题
- Hystrix-Feign异常拦截与处理
- Hystrix-DashBoard单服务监控
- Hystrix-dashboard集群监控
- 分布式系统流量卫兵sentinel
- sentinel简介与安装
- 客户端集成与实时监控
- 实战流控规则-QPS限流
- 实战流控规则-线程数限流
- 实战流控规则-关联限流
- 实战流控规则-链路限流
- 实战流控效果-WarmUp
- 实战流控效果-匀速排队
- BlockException处理
- 实战熔断降级-RT
- 实战熔断降级-异常数与比例
- DegradeException处理
- 注解与异常的归纳总结
- Feign降级及异常传递拦截
- 动态规则nacos集中存储
- 热点参数限流
- 系统自适应限流
- 微服务网关-GateWay
- 还有必要学习Zuul么?
- 简介与非阻塞异步IO模型
- GateWay概念与流程
- 新建一个GateWay项目
- 通用Predicate的使用
- 自定义PredicateFactory
- 编码方式构建静态路由
- Filter过滤器介绍与使用
- 自定义过滤器Filter
- 网关请求转发负载均衡
- 结合nacos实现动态路由配置
- 整合Sentinel实现资源限流
- 跨域访问配置
- 网关层面全局异常处理
- 微服务网关安全认证-JWT篇
- Gateway-JWT认证鉴权流程
- 登录认证JWT令牌颁发
- 全局过滤器实现JWT鉴权
- 微服务自身内部的权限管理
