## 一、单机部署
笔者在仔细研究了apollo的部署架构之后,发现专门进行单机安装的讲解意义不大。因为apollo本身就是使用Spring Cloud开发的,它的服务的高可用设计都是基于我们之前讲过的“服务注册与发现”。

* config-service和adminservice的部署:
* 单机安装就是服务部署到同一主机上,启动一个实例,向eureka(apollo的config-service本身)注册一次
* 分布式安装就是服务部署到不同主机上,每个服务启动多个实例,向eureka(apollo的config-service本身)注册多次
* 服务注册中心的**portal界面应用本身不需要进行集群高可用部署**,因为它就是一个web页面,供给团队内部进行配置管理使用的。即使挂掉了也没有很大关系,也不影响线上服务的正常运行。当然如果你希望部署多个也是可以的,启动多个实例就可以了。
所以单机安装和分布式安装的内容差异极小,**我们就直接讲解“分布式部署”**。另外,apollo官方专门在github上开辟了一个项目:[apollo-build-scripts](https://github.com/nobodyiam/apollo-build-scripts),该项目包含了进行apollo部署所需的脚本。通常安装apollo的单机模式有两种方法,大家可以去参考一下:
* [常规单机部署方式(官方文档)](https://github.com/ctripcorp/apollo/wiki/Quick-Start)
* [Docker的单机部署方式(官方文档)](https://github.com/ctripcorp/apollo/wiki/Apollo-Quick-Start-Docker%E9%83%A8%E7%BD%B2)
> 但笔者觉得用这种封装好的脚本学习部署,反而容易对初学者造成困扰,不易于理解。总之,见仁见智吧!
## 二、安装前的准备工作
### 基础软件版本要求
* Java版本最低要求
* Apollo服务端:1.8+
* Apollo客户端:1.7+
* MySQL版本要求:5.6.5+
Apollo的表结构对`timestamp`使用了多个default声明,所以需要5.6.5以上版本。
mysql版本检查命令如下:
~~~
SHOW VARIABLES WHERE Variable_name = 'version';
~~~
### 下载apollo安装包
[https://github.com/ctripcorp/apollo/releases](https://github.com/ctripcorp/apollo/releases)

可以笼统的认为:
* portal就是apollo配置管理的“脸面”,WEB管理界面。portal一般是要部署在生产环境主机上的。
* config-service和admin-service就是“环境管理服务”。生产环境部署一套、测试环境部署一套、研发环境部署一套……
## 二、portal安装步骤
### 2.1 创建数据库
Apollo Portal有自己的数据库`ApolloPortalDB`,官方把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。
* 管理员账号执行初始化SQL:[sql/apolloportaldb.sql](https://github.com/nobodyiam/apollo-build-scripts/blob/master/sql/apolloportaldb.sql),包含建库、建表及示例数据
~~~
# 用管理员账号登录mysql之后执行命令,创建数据库、建表及插入示例数据。
mysql > source 你的SQL所在的linux文件路径/apolloportaldb.sql
~~~
虽然我们用管理员账户创建数据库,但是我们一般不用管理员用户访问业务数据库,所以我建立了一个test用户,并对其进行赋权。
~~~
CREATE USER 'test'@'%' IDENTIFIED BY '你的密码';
GRANT ALL ON ApolloPortalDB.* TO 'test'@'%' IDENTIFIED BY '你的密码'; //只有执行了这一句才可以远程登陆
FLUSH PRIVILEGES;
~~~
### 2.2 目录结构说明
将apollo-portal.zip安装包上传到服务器并解压
~~~
#在当前目录下创建portal 目录,并将文件解压到里面
mkdir ./portal && unzip apollo-portal-1.6.1-github.zip -d ./portal
~~~
解压之后目录结构如下

### 2.3.数据库配置修改
apollo-portal-1.6.1-github.zip包解压出来有一个config/application-github.properties文件,修改其中的mysql ip地址、端口、用户名、密码信息,指向ApolloPortalDB所在的mysql数据库。
* 根据你的数据库ApolloPortalDB地址将localhost修改为数据库主机ip
* 根据你的ApolloPortalDB实际数据库修改用户名密码,我的用户名是test(上文新建的)
~~~
# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = test
spring.datasource.password = 你的mysql用户密码
~~~
### 2.4.多环境配置文件
Apollo Portal支持多环境配置,其配置文件是config/apollo-env.properties。Apollo Portal需要根据环境的不同,访问不同的meta service(apollo-configservice)地址,所以需要在配置中提供ConfigService服务地址信息。
~~~
local.meta=http://localhost:8080
dev.meta=http://fill-in-dev-meta-server: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://fill-in-pro-meta-server:8080
~~~
> 因为我们还没部署任何生产、测试、或者其他环境,所以暂时将文件内容删掉即可(上面的配置是文件内的默认配置,删掉)。
**apollo默认支持的环境单词缩写解释:**
* LOCAL:本地开发环境
* DEV:开发环境
* FWS:功能Web服务测试环境
* FAT:功能验收测试环境
* UAT:用户接受度测试环境
* LPT:负载和性能测试环境
* PRO:生产环境
* TOOLS:工具环境,生产环境中的一个特殊区域,它允许访问测试环境,例如Apollo Portal应该部署在工具环境中。
## 三、启动Apollo配置中心
### 3.1 修改端口
apollo portal的默认端口是8070,不好,一方面容易发生冲突,一方面容易被安全攻击。所以我们改一下端口,改成不常用的即可,我改成9430。
修改scripts/startup.sh脚本(注意该启动脚本里面还指定了日志文件的位置:LOG\_DIR,看日志去这里)

同时要把这个端口在防火墙上开放出来
~~~
firewall-cmd --zone=public --add-port=9430/tcp --permanent;
firewall-cmd --reload
~~~
### 3.2 执行启动脚本
进入scripts目录下,执行startup.sh脚本
~~~
./startup.sh
~~~
如果你去LOG\_DIR目录下查看日志,会发现日志中有一些connect timed out(连接超时的异常),这是因为ApolloPortalDB中有一些默认的DEV环境配置,而我们还没有搭建任何的环境,只是搭建了一个统一管理中心的界面应用portal。所以connect timed out(连接超时的异常)可以暂时忽略。
## 四、安装结果
访问:[http://apollo-portal主机ip:9430/,出现下面的界面](http://xn--apollo-portalip-c63xd222a:9430/%EF%BC%8C%E5%87%BA%E7%8E%B0%E4%B8%8B%E9%9D%A2%E7%9A%84%E7%95%8C%E9%9D%A2)

输入用户名、密码 apollo/admin,登陆成功就表示我们安装成功了。
- 文档简介
- 模块与代码分支说明
- 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鉴权
- 微服务自身内部的权限管理
