浏览代码

misc change

Jason Song 4 年之前
父节点
当前提交
d82086b2be

+ 0 - 0
apollo-adminservice/src/main/resources/application-nacosDiscovery.properties → apollo-adminservice/src/main/resources/application-nacos-discovery.properties


+ 1 - 1
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/ConfigReleaseWebhookNotifier.java

@@ -50,7 +50,7 @@ public class ConfigReleaseWebhookNotifier {
       try {
         restTemplate.postForObject(url, entity, String.class, env);
       } catch (Exception e) {
-        logger.error("Notify webHook server failed. webHook server url:{}", env, url, e);
+        logger.error("Notify webHook server failed, env: {}, webHook server url:{}", env, url, e);
       }
     }
   }

+ 3 - 2
docs/zh/README.md

@@ -77,7 +77,7 @@ Java客户端不依赖任何框架,能够运行于所有Java运行时环境,
   - [Apollo配置中心设计](zh/design/apollo-design.md)
   - [Apollo配置中心介绍](zh/design/apollo-introduction.md)
   - [Apollo核心概念之“Namespace”](zh/design/apollo-core-concept-namespace.md)
-  * [Apollo源码解析](http://www.iocoder.cn/categories/Apollo/)(据说Apollo非常适合作为初学者第一个通读源码学习的分布式中间件产品)
+  - [Apollo源码解析](http://www.iocoder.cn/categories/Apollo/)(据说Apollo非常适合作为初学者第一个通读源码学习的分布式中间件产品)
 
 # Development
   - [Apollo开发指南](zh/development/apollo-development-guide.md)
@@ -85,7 +85,8 @@ Java客户端不依赖任何框架,能够运行于所有Java运行时环境,
     - [Eclipse Code Style](https://github.com/ctripcorp/apollo/blob/master/apollo-buildtools/style/eclipse-java-google-style.xml)
     - [Intellij Code Style](https://github.com/ctripcorp/apollo/blob/master/apollo-buildtools/style/intellij-java-google-style.xml)
   - [Portal实现用户登录功能](zh/development/portal-how-to-implement-user-login-function.md)
-  - [邮件模板样例](zh/development/email-template-samples.md)
+  - [Portal接入邮件服务](zh/development/portal-how-to-enable-email-service.md)
+  - [Portal启用webhook通知](zh/development/portal-how-to-enable-webhook-notification.md)
 
 # Deployment
   - [Quick Start](zh/deployment/quick-start.md)

+ 2 - 1
docs/zh/_sidebar.md

@@ -17,7 +17,8 @@
     - [Eclipse Code Style](https://github.com/ctripcorp/apollo/blob/master/apollo-buildtools/style/eclipse-java-google-style.xml)
     - [Intellij Code Style](https://github.com/ctripcorp/apollo/blob/master/apollo-buildtools/style/intellij-java-google-style.xml)
   - [Portal实现用户登录功能](zh/development/portal-how-to-implement-user-login-function.md)
-  - [邮件模板样例](zh/development/email-template-samples.md)
+  - [Portal接入邮件服务](zh/development/portal-how-to-enable-email-service.md)
+  - [Portal启用webhook通知](zh/development/portal-how-to-enable-webhook-notification.md)
 
 - 使用文档
   - [Apollo使用指南](zh/usage/apollo-user-guide.md)

+ 196 - 197
docs/zh/deployment/distributed-deployment-guide.md

@@ -234,198 +234,8 @@ select `Id`, `Key`, `Value`, `Comment` from `ApolloConfigDB`.`ServerConfig` limi
 > 如果是为正在运行的环境迁移数据,建议迁移完重启一下config service,因为config service中有appnamespace的缓存数据
 
 ### 2.1.3 调整服务端配置
-Apollo自身的一些配置是放在数据库里面的,所以需要针对实际情况做一些调整。
 
-> 以下配置除了支持在数据库中配置以外,也支持通过-D参数、application.properties等配置,且-D参数、application.properties等优先级高于数据库中的配置
-
-#### 2.1.3.1 调整ApolloPortalDB配置
-配置项统一存储在ApolloPortalDB.ServerConfig表中,也可以通过`管理员工具 - 系统参数`页面进行配置,无特殊说明则修改完一分钟实时生效。
-
-##### 1. apollo.portal.envs - 可支持的环境列表
-
-默认值是dev,如果portal需要管理多个环境的话,以逗号分隔即可(大小写不敏感),如:
-```
-DEV,FAT,UAT,PRO
-```
-
-修改完需要重启生效。
-
->注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,具体请参考:[2.1.2 创建ApolloConfigDB](#_212-创建apolloconfigdb),[2.1.3.2 调整ApolloConfigDB配置](#_2132-调整apolloconfigdb配置),[2.2.1.1.2 配置数据库连接信息](#_22112-配置数据库连接信息),另外如果是为已经运行了一段时间的Apollo配置中心增加环境,别忘了参考[2.1.2.4 从别的环境导入ApolloConfigDB的项目数据](#_2124-从别的环境导入apolloconfigdb的项目数据)对新的环境做初始化。
-
->注2:只在数据库添加环境是不起作用的,还需要为apollo-portal添加新增环境对应的meta server地址,具体参考:[2.2.1.1.2.4 配置apollo-portal的meta service信息](#_221124-配置apollo-portal的meta-service信息)。apollo-client在新的环境下使用时也需要做好相应的配置,具体参考:[1.2.2 Apollo Meta Server](zh/usage/java-sdk-user-guide#_122-apollo-meta-server)。
-
->注3:如果希望添加自定义的环境名称,具体步骤可以参考[Portal如何增加环境](zh/faq/common-issues-in-deployment-and-development-phase?id=_4-portal如何增加环境?)。
-
->注4:1.1.0版本增加了系统信息页面(`管理员工具` -> `系统信息`),可以通过该页面检查配置是否正确
-
-##### 2. apollo.portal.meta.servers - 各环境Meta Service列表
-
-> 适用于1.6.0及以上版本
-
-Apollo Portal需要在不同的环境访问不同的meta service(apollo-configservice)地址,所以我们需要在配置中提供这些信息。默认情况下,meta service和config service是部署在同一个JVM进程,所以meta service的地址就是config service的地址。
-
-样例如下:
-```json
-{
-    "DEV":"http://1.1.1.1:8080",
-    "FAT":"http://apollo.fat.xxx.com",
-    "UAT":"http://apollo.uat.xxx.com",
-    "PRO":"http://apollo.xxx.com"
-}
-```
-
-修改完需要重启生效。
-
-> 该配置优先级高于其它方式设置的Meta Service地址,更多信息可以参考[2.2.1.1.2.4 配置apollo-portal的meta service信息](#_221124-配置apollo-portal的meta-service信息)。
-
-##### 3. organizations - 部门列表
-
-Portal中新建的App都需要选择部门,所以需要在这里配置可选的部门信息,样例如下:
-```json
-[{"orgId":"TEST1","orgName":"样例部门1"},{"orgId":"TEST2","orgName":"样例部门2"}]
-```
-
-##### 4. superAdmin - Portal超级管理员
-
-超级管理员拥有所有权限,需要谨慎设置。
-
-如果没有接入自己公司的SSO系统的话,可以先暂时使用默认值apollo(默认用户)。等接入后,修改为实际使用的账号,多个账号以英文逗号分隔(,)。
-
-##### 5. consumer.token.salt - consumer token salt
-
-如果会使用开放平台API的话,可以设置一个token salt。如果不使用,可以忽略。
-
-##### 6. wiki.address
-
-portal上“帮助”链接的地址,默认是Apollo github的wiki首页,可自行设置。
-
-##### 7. admin.createPrivateNamespace.switch
-
-是否允许项目管理员创建private namespace。设置为`true`允许创建,设置为`false`则项目管理员在页面上看不到创建private namespace的选项。[了解更多Namespace](zh/design/apollo-core-concept-namespace)
-
-##### 8. emergencyPublish.supported.envs
-
-配置允许紧急发布的环境列表,多个env以英文逗号分隔。
-
-当config service开启一次发布只能有一个人修改开关(`namespace.lock.switch`)后,一次配置发布只能是一个人修改,另一个发布。为了避免遇到紧急情况时(如非工作时间、节假日)无法发布配置,可以配置此项以允许某些环境可以操作紧急发布,即同一个人可以修改并发布配置。
-
-##### 9. configView.memberOnly.envs
-
-只对项目成员显示配置信息的环境列表,多个env以英文逗号分隔。
-
-对设定了只对项目成员显示配置信息的环境,只有该项目的管理员或拥有该namespace的编辑或发布权限的用户才能看到该私有namespace的配置信息和发布历史。公共namespace始终对所有用户可见。
-
-> 从1.1.0版本开始支持,详见[PR 1531](https://github.com/ctripcorp/apollo/pull/1531)
-
-##### 10. role.create-application.enabled - 是否开启创建项目权限控制
-
-> 适用于1.5.0及以上版本
-
-默认为false,所有用户都可以创建项目
-
-如果设置为true,那么只有超级管理员和拥有创建项目权限的帐号可以创建项目,超级管理员可以通过`管理员工具 - 系统权限管理`给用户分配创建项目权限
-
-##### 11. role.manage-app-master.enabled - 是否开启项目管理员分配权限控制
-
-> 适用于1.5.0及以上版本
-
-默认为false,所有项目的管理员可以为项目添加/删除管理员
-
-如果设置为true,那么只有超级管理员和拥有项目管理员分配权限的帐号可以为特定项目添加/删除管理员,超级管理员可以通过`管理员工具 - 系统权限管理`给用户分配特定项目的管理员分配权限
-
-##### 12. admin-service.access.tokens - 设置apollo-portal访问各环境apollo-adminservice所需的access token
-
-> 适用于1.7.1及以上版本
-
-如果对应环境的apollo-adminservice开启了[访问控制](#_6-admin-serviceaccesscontrolenabled-配置apollo-adminservice是否开启访问控制),那么需要在此配置apollo-portal访问该环境apollo-adminservice所需的access token,否则会访问失败
-
-格式为json,如下所示:
-
-```json
-{
-    "dev" : "098f6bcd4621d373cade4e832627b4f6",
-    "pro" : "ad0234829205b9033196ba818f7a872b"
-}
-```
-
-#### 2.1.3.2 调整ApolloConfigDB配置
-配置项统一存储在ApolloConfigDB.ServerConfig表中,需要注意每个环境的ApolloConfigDB.ServerConfig都需要单独配置,修改完一分钟实时生效。
-
-##### 1. eureka.service.url - Eureka服务Url
-
-> 不适用于基于Kubernetes原生服务发现场景
-
-不管是apollo-configservice还是apollo-adminservice都需要向eureka服务注册,所以需要配置eureka服务地址。
-按照目前的实现,apollo-configservice本身就是一个eureka服务,所以只需要填入apollo-configservice的地址即可,如有多个,用逗号分隔(注意不要忘了/eureka/后缀)。
-
-需要注意的是每个环境只填入自己环境的eureka服务地址,比如FAT的apollo-configservice是1.1.1.1:8080和2.2.2.2:8080,UAT的apollo-configservice是3.3.3.3:8080和4.4.4.4:8080,PRO的apollo-configservice是5.5.5.5:8080和6.6.6.6:8080,那么:
-
-1. 在FAT环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
-```
-http://1.1.1.1:8080/eureka/,http://2.2.2.2:8080/eureka/
-```
-
-2. 在UAT环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
-```
-http://3.3.3.3:8080/eureka/,http://4.4.4.4:8080/eureka/
-```
-
-3. 在PRO环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
-```
-http://5.5.5.5:8080/eureka/,http://6.6.6.6:8080/eureka/
-```
-
->注1:这里需要填写本环境中全部的eureka服务地址,因为eureka需要互相复制注册信息
-
->注2:如果希望将Config Service和Admin Service注册到公司统一的Eureka上,可以参考[部署&开发遇到的常见问题 - 将Config Service和Admin Service注册到单独的Eureka Server上](zh/faq/common-issues-in-deployment-and-development-phase#_8-将config-service和admin-service注册到单独的eureka-server上)章节
-
->注3:在多机房部署时,往往希望config service和admin service只向同机房的eureka注册,要实现这个效果,需要利用`ServerConfig`表中的cluster字段,config service和admin service会读取所在机器的`/opt/settings/server.properties`(Mac/Linux)或`C:\opt\settings\server.properties`(Windows)中的idc属性,如果该idc有对应的eureka.service.url配置,那么就只会向该机房的eureka注册。比如config service和admin service会部署到`SHAOY`和`SHAJQ`两个IDC,那么为了实现这两个机房中的服务只向该机房注册,那么可以在`ServerConfig`表中新增两条记录,分别填入`SHAOY`和`SHAJQ`两个机房的eureka地址即可,`default` cluster的记录可以保留,如果有config service和admin service不是部署在`SHAOY`和`SHAJQ`这两个机房的,就会使用这条默认配置。
-
-| Key                |Cluster    | Value                         | Comment             |
-|--------------------|-----------|-------------------------------|---------------------|
-| eureka.service.url | default   | http://1.1.1.1:8080/eureka/   | 默认的Eureka服务Url  |
-| eureka.service.url | SHAOY     | http://2.2.2.2:8080/eureka/   | SHAOY的Eureka服务Url |
-| eureka.service.url | SHAJQ     | http://3.3.3.3:8080/eureka/   | SHAJQ的Eureka服务Url |
-
-##### 2. namespace.lock.switch - 一次发布只能有一个人修改开关,用于发布审核
-
-这是一个功能开关,如果配置为true的话,那么一次配置发布只能是一个人修改,另一个发布。
-
-> 生产环境建议开启此选项
-
-##### 3. config-service.cache.enabled - 是否开启配置缓存
-
-这是一个功能开关,如果配置为true的话,config service会缓存加载过的配置信息,从而加快后续配置获取性能。
-
-默认为false,开启前请先评估总配置大小并调整config service内存配置。
-
-> 开启缓存后必须确保应用中配置的app.id大小写正确,否则将获取不到正确的配置
-
-##### 4. item.key.length.limit - 配置项 key 最大长度限制
-
-默认配置是128。
-
-##### 5. item.value.length.limit - 配置项 value 最大长度限制
-
-默认配置是20000。
-
-##### 6. admin-service.access.control.enabled - 配置apollo-adminservice是否开启访问控制
-
-> 适用于1.7.1及以上版本
-
-默认为false,如果配置为true,那么apollo-portal就需要[正确配置](#_12-admin-serviceaccesstokens-设置apollo-portal访问各环境apollo-adminservice所需的access-token)访问该环境的access token,否则访问会被拒绝
-
-##### 7. admin-service.access.tokens - 配置允许访问apollo-adminservice的access token列表
-
-> 适用于1.7.1及以上版本
-
-如果该配置项为空,那么访问控制不会生效。如果允许多个token,token 之间以英文逗号分隔
-
-样例:
-```properties
-admin-service.access.tokens=098f6bcd4621d373cade4e832627b4f6
-admin-service.access.tokens=098f6bcd4621d373cade4e832627b4f6,ad0234829205b9033196ba818f7a872b
-```
+Apollo自身的一些配置是放在数据库里面的,所以需要针对实际情况做一些调整,具体参数说明请参考[三、服务端配置说明](#三、服务端配置说明)
 
 ## 2.2 虚拟机/物理机部署
 ### 2.2.1 获取安装包
@@ -496,7 +306,7 @@ spring.datasource.password = somepwd
 
 Apollo Portal需要在不同的环境访问不同的meta service(apollo-configservice)地址,所以我们需要在配置中提供这些信息。默认情况下,meta service和config service是部署在同一个JVM进程,所以meta service的地址就是config service的地址。
 
-> 对于1.6.0及以上版本,可以通过ApolloPortalDB.ServerConfig中的配置项来配置Meta Service地址,详见[apollo.portal.meta.servers - 各环境Meta Service列表](#_2-apolloportalmetaservers-各环境meta-service列表)
+> 对于1.6.0及以上版本,可以通过ApolloPortalDB.ServerConfig中的配置项来配置Meta Service地址,详见[apollo.portal.meta.servers - 各环境Meta Service列表](#_312-apolloportalmetaservers-各环境meta-service列表)
 
 使用程序员专用编辑器(如vim,notepad++,sublime等)打开`apollo-portal-x.x.x-github.zip`中`config`目录下的`apollo-env.properties`文件。
 
@@ -610,7 +420,7 @@ META_SERVERS_OPTS="-Ddev_meta=$dev_meta -Dfat_meta=$fat_meta -Duat_meta=$uat_met
 mvn clean package -Pgithub,nacos-discovery -DskipTests -pl apollo-configservice,apollo-adminservice -am -Dapollo_profile=github,nacos-discovery -Dspring_datasource_url=$apollo_config_db_url -Dspring_datasource_username=$apollo_config_db_username -Dspring_datasource_password=$apollo_config_db_password
 ```
 
-2. 在config目录下修改application-github.properties,配置nacos服务器地址
+2. 分别修改apollo-configservice和apollo-adminservice安装包中config目录下的application-github.properties,配置nacos服务器地址
 ```properties
 nacos.discovery.server-addr=127.0.0.1:8848
 ```
@@ -740,8 +550,8 @@ docker run -p 8070:8070 \
 * SPRING_DATASOURCE_URL: 对应环境ApolloPortalDB的地址
 * SPRING_DATASOURCE_USERNAME: 对应环境ApolloPortalDB的用户名
 * SPRING_DATASOURCE_PASSWORD: 对应环境ApolloPortalDB的密码
-* APOLLO_PORTAL_ENVS(可选): 对应ApolloPortalDB中的[apollo.portal.envs](#_1-apolloportalenvs-可支持的环境列表)配置项,如果没有在数据库中配置的话,可以通过此环境参数配置
-* DEV_META/PRO_META(可选): 配置对应环境的Meta Service地址,以${ENV}_META命名,需要注意的是如果配置了ApolloPortalDB中的[apollo.portal.meta.servers](#_2-apolloportalmetaservers-各环境meta-service列表)配置,则以apollo.portal.meta.servers中的配置为准
+* APOLLO_PORTAL_ENVS(可选): 对应ApolloPortalDB中的[apollo.portal.envs](#_311-apolloportalenvs-可支持的环境列表)配置项,如果没有在数据库中配置的话,可以通过此环境参数配置
+* DEV_META/PRO_META(可选): 配置对应环境的Meta Service地址,以${ENV}_META命名,需要注意的是如果配置了ApolloPortalDB中的[apollo.portal.meta.servers](#_312-apolloportalmetaservers-各环境meta-service列表)配置,则以apollo.portal.meta.servers中的配置为准
 
 ### 2.3.2 1.7.0之前的版本
 
@@ -1192,6 +1002,195 @@ config:
 
 感谢[qct](https://github.com/qct)提供的Helm Chart部署支持,使用说明可以参考[qct/apollo-helm](https://github.com/qct/apollo-helm)。
 
-# 三、Portal 实现用户登录功能
+# 三、服务端配置说明
 
-请参考[Portal 实现用户登录功能](zh/development/portal-how-to-implement-user-login-function)
+> 以下配置除了支持在数据库中配置以外,也支持通过-D参数、application.properties等配置,且-D参数、application.properties等优先级高于数据库中的配置
+
+## 3.1 调整ApolloPortalDB配置
+配置项统一存储在ApolloPortalDB.ServerConfig表中,也可以通过`管理员工具 - 系统参数`页面进行配置,无特殊说明则修改完一分钟实时生效。
+
+### 3.1.1 apollo.portal.envs - 可支持的环境列表
+
+默认值是dev,如果portal需要管理多个环境的话,以逗号分隔即可(大小写不敏感),如:
+```
+DEV,FAT,UAT,PRO
+```
+
+修改完需要重启生效。
+
+>注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,具体请参考:[2.1.2 创建ApolloConfigDB](#_212-创建apolloconfigdb),[3.2 调整ApolloConfigDB配置](zh/deployment/distributed-deployment-guide?id=_32-调整apolloconfigdb配置),[2.2.1.1.2 配置数据库连接信息](#_22112-配置数据库连接信息),另外如果是为已经运行了一段时间的Apollo配置中心增加环境,别忘了参考[2.1.2.4 从别的环境导入ApolloConfigDB的项目数据](#_2124-从别的环境导入apolloconfigdb的项目数据)对新的环境做初始化。
+
+>注2:只在数据库添加环境是不起作用的,还需要为apollo-portal添加新增环境对应的meta server地址,具体参考:[2.2.1.1.2.4 配置apollo-portal的meta service信息](#_221124-配置apollo-portal的meta-service信息)。apollo-client在新的环境下使用时也需要做好相应的配置,具体参考:[1.2.2 Apollo Meta Server](zh/usage/java-sdk-user-guide#_122-apollo-meta-server)。
+
+>注3:如果希望添加自定义的环境名称,具体步骤可以参考[Portal如何增加环境](zh/faq/common-issues-in-deployment-and-development-phase?id=_4-portal如何增加环境?)。
+
+>注4:1.1.0版本增加了系统信息页面(`管理员工具` -> `系统信息`),可以通过该页面检查配置是否正确
+
+### 3.1.2 apollo.portal.meta.servers - 各环境Meta Service列表
+
+> 适用于1.6.0及以上版本
+
+Apollo Portal需要在不同的环境访问不同的meta service(apollo-configservice)地址,所以我们需要在配置中提供这些信息。默认情况下,meta service和config service是部署在同一个JVM进程,所以meta service的地址就是config service的地址。
+
+样例如下:
+```json
+{
+    "DEV":"http://1.1.1.1:8080",
+    "FAT":"http://apollo.fat.xxx.com",
+    "UAT":"http://apollo.uat.xxx.com",
+    "PRO":"http://apollo.xxx.com"
+}
+```
+
+修改完需要重启生效。
+
+> 该配置优先级高于其它方式设置的Meta Service地址,更多信息可以参考[2.2.1.1.2.4 配置apollo-portal的meta service信息](#_221124-配置apollo-portal的meta-service信息)。
+
+### 3.1.3 organizations - 部门列表
+
+Portal中新建的App都需要选择部门,所以需要在这里配置可选的部门信息,样例如下:
+```json
+[{"orgId":"TEST1","orgName":"样例部门1"},{"orgId":"TEST2","orgName":"样例部门2"}]
+```
+
+### 3.1.4 superAdmin - Portal超级管理员
+
+超级管理员拥有所有权限,需要谨慎设置。
+
+如果没有接入自己公司的SSO系统的话,可以先暂时使用默认值apollo(默认用户)。等接入后,修改为实际使用的账号,多个账号以英文逗号分隔(,)。
+
+### 3.1.5 consumer.token.salt - consumer token salt
+
+如果会使用开放平台API的话,可以设置一个token salt。如果不使用,可以忽略。
+
+### 3.1.6 wiki.address
+
+portal上“帮助”链接的地址,默认是Apollo github的wiki首页,可自行设置。
+
+### 3.1.7 admin.createPrivateNamespace.switch
+
+是否允许项目管理员创建private namespace。设置为`true`允许创建,设置为`false`则项目管理员在页面上看不到创建private namespace的选项。[了解更多Namespace](zh/design/apollo-core-concept-namespace)
+
+### 3.1.8 emergencyPublish.supported.envs
+
+配置允许紧急发布的环境列表,多个env以英文逗号分隔。
+
+当config service开启一次发布只能有一个人修改开关(`namespace.lock.switch`)后,一次配置发布只能是一个人修改,另一个发布。为了避免遇到紧急情况时(如非工作时间、节假日)无法发布配置,可以配置此项以允许某些环境可以操作紧急发布,即同一个人可以修改并发布配置。
+
+### 3.1.9 configView.memberOnly.envs
+
+只对项目成员显示配置信息的环境列表,多个env以英文逗号分隔。
+
+对设定了只对项目成员显示配置信息的环境,只有该项目的管理员或拥有该namespace的编辑或发布权限的用户才能看到该私有namespace的配置信息和发布历史。公共namespace始终对所有用户可见。
+
+> 从1.1.0版本开始支持,详见[PR 1531](https://github.com/ctripcorp/apollo/pull/1531)
+
+### 3.1.10 role.create-application.enabled - 是否开启创建项目权限控制
+
+> 适用于1.5.0及以上版本
+
+默认为false,所有用户都可以创建项目
+
+如果设置为true,那么只有超级管理员和拥有创建项目权限的帐号可以创建项目,超级管理员可以通过`管理员工具 - 系统权限管理`给用户分配创建项目权限
+
+### 3.1.11 role.manage-app-master.enabled - 是否开启项目管理员分配权限控制
+
+> 适用于1.5.0及以上版本
+
+默认为false,所有项目的管理员可以为项目添加/删除管理员
+
+如果设置为true,那么只有超级管理员和拥有项目管理员分配权限的帐号可以为特定项目添加/删除管理员,超级管理员可以通过`管理员工具 - 系统权限管理`给用户分配特定项目的管理员分配权限
+
+### 3.1.12 admin-service.access.tokens - 设置apollo-portal访问各环境apollo-adminservice所需的access token
+
+> 适用于1.7.1及以上版本
+
+如果对应环境的apollo-adminservice开启了[访问控制](#_326-admin-serviceaccesscontrolenabled-配置apollo-adminservice是否开启访问控制),那么需要在此配置apollo-portal访问该环境apollo-adminservice所需的access token,否则会访问失败
+
+格式为json,如下所示:
+
+```json
+{
+    "dev" : "098f6bcd4621d373cade4e832627b4f6",
+    "pro" : "ad0234829205b9033196ba818f7a872b"
+}
+```
+
+## 3.2 调整ApolloConfigDB配置
+配置项统一存储在ApolloConfigDB.ServerConfig表中,需要注意每个环境的ApolloConfigDB.ServerConfig都需要单独配置,修改完一分钟实时生效。
+
+### 3.2.1 eureka.service.url - Eureka服务Url
+
+> 不适用于基于Kubernetes原生服务发现场景
+
+不管是apollo-configservice还是apollo-adminservice都需要向eureka服务注册,所以需要配置eureka服务地址。
+按照目前的实现,apollo-configservice本身就是一个eureka服务,所以只需要填入apollo-configservice的地址即可,如有多个,用逗号分隔(注意不要忘了/eureka/后缀)。
+
+需要注意的是每个环境只填入自己环境的eureka服务地址,比如FAT的apollo-configservice是1.1.1.1:8080和2.2.2.2:8080,UAT的apollo-configservice是3.3.3.3:8080和4.4.4.4:8080,PRO的apollo-configservice是5.5.5.5:8080和6.6.6.6:8080,那么:
+
+1. 在FAT环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
+```
+http://1.1.1.1:8080/eureka/,http://2.2.2.2:8080/eureka/
+```
+
+2. 在UAT环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
+```
+http://3.3.3.3:8080/eureka/,http://4.4.4.4:8080/eureka/
+```
+
+3. 在PRO环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:
+```
+http://5.5.5.5:8080/eureka/,http://6.6.6.6:8080/eureka/
+```
+
+>注1:这里需要填写本环境中全部的eureka服务地址,因为eureka需要互相复制注册信息
+
+>注2:如果希望将Config Service和Admin Service注册到公司统一的Eureka上,可以参考[部署&开发遇到的常见问题 - 将Config Service和Admin Service注册到单独的Eureka Server上](zh/faq/common-issues-in-deployment-and-development-phase#_8-将config-service和admin-service注册到单独的eureka-server上)章节
+
+>注3:在多机房部署时,往往希望config service和admin service只向同机房的eureka注册,要实现这个效果,需要利用`ServerConfig`表中的cluster字段,config service和admin service会读取所在机器的`/opt/settings/server.properties`(Mac/Linux)或`C:\opt\settings\server.properties`(Windows)中的idc属性,如果该idc有对应的eureka.service.url配置,那么就只会向该机房的eureka注册。比如config service和admin service会部署到`SHAOY`和`SHAJQ`两个IDC,那么为了实现这两个机房中的服务只向该机房注册,那么可以在`ServerConfig`表中新增两条记录,分别填入`SHAOY`和`SHAJQ`两个机房的eureka地址即可,`default` cluster的记录可以保留,如果有config service和admin service不是部署在`SHAOY`和`SHAJQ`这两个机房的,就会使用这条默认配置。
+
+| Key                |Cluster    | Value                         | Comment             |
+|--------------------|-----------|-------------------------------|---------------------|
+| eureka.service.url | default   | http://1.1.1.1:8080/eureka/   | 默认的Eureka服务Url  |
+| eureka.service.url | SHAOY     | http://2.2.2.2:8080/eureka/   | SHAOY的Eureka服务Url |
+| eureka.service.url | SHAJQ     | http://3.3.3.3:8080/eureka/   | SHAJQ的Eureka服务Url |
+
+### 3.2.2 namespace.lock.switch - 一次发布只能有一个人修改开关,用于发布审核
+
+这是一个功能开关,如果配置为true的话,那么一次配置发布只能是一个人修改,另一个发布。
+
+> 生产环境建议开启此选项
+
+### 3.2.3 config-service.cache.enabled - 是否开启配置缓存
+
+这是一个功能开关,如果配置为true的话,config service会缓存加载过的配置信息,从而加快后续配置获取性能。
+
+默认为false,开启前请先评估总配置大小并调整config service内存配置。
+
+> 开启缓存后必须确保应用中配置的app.id大小写正确,否则将获取不到正确的配置
+
+### 3.2.4 item.key.length.limit - 配置项 key 最大长度限制
+
+默认配置是128。
+
+### 3.2.5 item.value.length.limit - 配置项 value 最大长度限制
+
+默认配置是20000。
+
+### 3.2.6 admin-service.access.control.enabled - 配置apollo-adminservice是否开启访问控制
+
+> 适用于1.7.1及以上版本
+
+默认为false,如果配置为true,那么apollo-portal就需要[正确配置](#_3112-admin-serviceaccesstokens-设置apollo-portal访问各环境apollo-adminservice所需的access-token)访问该环境的access token,否则访问会被拒绝
+
+### 3.2.7 admin-service.access.tokens - 配置允许访问apollo-adminservice的access token列表
+
+> 适用于1.7.1及以上版本
+
+如果该配置项为空,那么访问控制不会生效。如果允许多个token,token 之间以英文逗号分隔
+
+样例:
+```properties
+admin-service.access.tokens=098f6bcd4621d373cade4e832627b4f6
+admin-service.access.tokens=098f6bcd4621d373cade4e832627b4f6,ad0234829205b9033196ba818f7a872b
+```

+ 1 - 1
docs/zh/design/apollo-design.md

@@ -274,7 +274,7 @@ Spring从3.1版本开始增加了`ConfigurableEnvironment`和`PropertySource`:
 <tr>
 <td>数据库宕机</td>
 <td>客户端无影响,Portal无法更新配置</td>
-<td>Config Service开启<a href="/#/zh/deployment/distributed-deployment-guide?id=_3-config-servicecacheenabled-是否开启配置缓存">配置缓存</a>后,对配置的读取不受数据库宕机影响</td>
+<td>Config Service开启<a href="/#/zh/deployment/distributed-deployment-guide?id=_323-config-servicecacheenabled-是否开启配置缓存">配置缓存</a>后,对配置的读取不受数据库宕机影响</td>
 <td></td>
 </tr>
 </tbody>

+ 3 - 26
docs/zh/development/apollo-development-guide.md

@@ -236,29 +236,6 @@ Apollo客户端针对不同的环境会从不同的服务器获取配置,所
 
 请参考[Portal 实现用户登录功能](zh/development/portal-how-to-implement-user-login-function)
 
-## 3.2 Portal接入邮件服务
-
-在配置发布时候,我们希望发布信息邮件通知到相关的负责人。现支持发送邮件的动作有:普通发布、灰度发布、全量发布、回滚,通知对象包括:具有namespace编辑和发布权限的人员以及App负责人。
-和SSO类似,每个公司也有自己的邮件服务实现,所以我们相应的定义了[EmailService](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/EmailService.java)接口,现有两个实现类:
-1. CtripEmailService:携程实现的EmailService
-2. DefaultEmailService:空实现
-
-### 3.2.1 接入步骤
-1. 提供自己公司的[EmailService](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/EmailService.java)实现,并在[EmailConfiguration](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/configuration/EmailConfiguration.java)中注册。
-2. 构建邮件内容需要在PortalDB,serverconfig表内配置一些参数,如下:
-  * **apollo.portal.address** Apollo Portal的地址。方便用户从邮件点击跳转到Apollo Portal查看详细的发布信息。
-  * **email.supported.envs** 支持发送邮件的环境列表,英文逗号隔开。我们不希望发布邮件变成用户的垃圾邮件,只有某些环境下的发布动作才会发送邮件。
-  * **email.sender** 邮件的发送人。
-  * **email.template.framework** 邮件内容模板框架。将邮件内容模板化、可配置化,方便管理和变更邮件内容。
-  * **email.template.release.module.diff** 发布邮件的diff模块。
-  * **email.template.rollback.module.diff** 回滚邮件的diff模块。
-  * **email.template.release.module.rules** 灰度发布的灰度规则模块。
-   我们提供了以上[邮件模板样例](zh/development/email-template-samples),方便大家使用。
-
->注:运行时使用不同的实现是通过[Profiles](http://docs.spring.io/autorepo/docs/spring-boot/current/reference/html/boot-features-profiles.html)实现的,比如你自己的Email实现是在`custom` profile中的话,在打包脚本中可以指定-Dapollo_profile=github,custom。其中`github`是Apollo必须的一个profile,用于数据库的配置,`custom`是你自己实现的profile。同时需要注意在[EmailConfiguration](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/configuration/EmailConfiguration.java)中修改默认实现的条件`@Profile({"!custom"})`。
-
-### 3.2.2 相关代码
-1. [ConfigPublishListener](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/ConfigPublishListener.java)监听发布事件,调用emailbuilder构建邮件内容,然后调用EmailService发送邮件
-2. [emailbuilder](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/components/emailbuilder)包是构建邮件内容的实现
-3. [EmailService](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/EmailService.java) 邮件发送服务
-4. [EmailConfiguration](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/configuration/EmailConfiguration.java) 邮件服务注册类
+## 3.2 Portal 接入邮件服务
+
+请参考[Portal 接入邮件服务](zh/development/portal-how-to-enable-email-service)

+ 0 - 60
docs/zh/development/email-template-samples.md

@@ -1,60 +0,0 @@
-在配置发布时候,可以发布信息邮件通知到相关的负责人,具体接入方式请参考[Apollo开发指南-3.2 Portal接入邮件服务](zh/development/apollo-development-guide#_32-portal接入邮件服务)。
-
-以下为发布邮件和回滚邮件的模板内容样式,邮件模板为html格式,发送html格式的邮件时,可能需要做一些额外的处理,取决于每个公司的邮件服务实现。为了减少字符数,模板经过了压缩处理,可自行格式化提高可读性。
-
-## email.template.framework
-
-```html
-<html><head><style type="text/css">.table{width:100%;max-width:100%;margin-bottom:20px;border-collapse:collapse;background-color:transparent}td{padding:8px;line-height:1.42857143;vertical-align:top;border:1px solid #ddd;border-top:1px solid #ddd}.table-bordered{border:1px solid #ddd}</style></head><body><h3>发布基本信息</h3><table class="table table-bordered"><tr><td width="10%"><b>AppId</b></td><td width="15%">#{appId}</td><td width="10%"><b>环境</b></td><td width="15%">#{env}</td><td width="10%"><b>集群</b></td><td width="15%">#{clusterName}</td><td width="10%"><b>Namespace</b></td><td width="15%">#{namespaceName}</td></tr><tr><td><b>发布者</b></td><td>#{operator}</td><td><b>发布时间</b></td><td>#{releaseTime}</td><td><b>发布标题</b></td><td>#{releaseTitle}</td><td><b>备注</b></td><td>#{releaseComment}</td></tr></table>#{diffModule}#{rulesModule}<br><a href="#{apollo.portal.address}/config/history.html?#/appid=#{appId}&env=#{env}&clusterName=#{clusterName}&namespaceName=#{namespaceName}&releaseHistoryId=#{releaseHistoryId}">点击查看详细的发布信息</a><br><br>如有Apollo使用问题请先查阅<a href="http://conf.ctripcorp.com/display/FRAM/Apollo">文档</a>,或直接回复本邮件咨询。</body></html>
-```
-
-> 注:使用此模板需要在 portal 的系统参数中配置 apollo.portal.address,指向 apollo portal 的地址
-
-## email.template.release.module.diff
-
-```html
-<h3>变更的配置</h3>
-<table class="table table-bordered">
-    <tr>
-        <td width="10%"><b>Type</b></td>
-        <td width="20%"><b>Key</b></td>
-        <td width="35%"><b>Old Value</b></td>
-        <td width="35%"><b>New Value</b></td>
-    </tr>
-    #{diffContent}
-</table>
-```
-
-## email.template.rollback.module.diff
-```html
-<div>
-    <br><br>
-    <h3>变更的配置</h3>
-    <table class="table table-bordered">
-        <tr>
-            <td width="10%"><b>Type</b></td>
-            <td width="20%"><b>Key</b></td>
-            <td width="35%"><b>回滚前</b></td>
-            <td width="35%"><b>回滚后</b></td>
-        </tr>
-        #{diffContent}
-    </table>
-    <br>
-</div>
-```
-
-## email.template.release.module.rules
-```html
-<div>
-    <br>
-    <h3>灰度规则</h3>
-    #{rulesContent}
-    <br>
-</div>
-```
-
-## 发布邮件样例
-![发布邮件模板](https://raw.githubusercontent.com/ctripcorp/apollo/master/doc/images/email-template-release.png)
-
-## 回滚邮件样例
-![回滚邮件模板](https://raw.githubusercontent.com/ctripcorp/apollo/master/doc/images/email-template-rollback.png)

+ 108 - 0
docs/zh/development/portal-how-to-enable-email-service.md

@@ -0,0 +1,108 @@
+在配置发布时候,我们希望发布信息邮件通知到相关的负责人。现支持发送邮件的动作有:普通发布、灰度发布、全量发布、回滚,通知对象包括:具有namespace编辑和发布权限的人员以及App负责人。
+
+由于各公司的邮件服务往往有不同的实现,所以Apollo定义了一些SPI用来解耦,Apollo接入邮件服务的关键就是实现这些SPI。
+
+## 一、实现方式一:使用Apollo提供的smtp邮件服务
+
+### 1.1 接入步骤
+在ApolloPortalDB.ServerConfig表配置以下参数,也可以通过管理员工具 - 系统参数页面进行配置,修改完一分钟实时生效。如下:
+* **email.enabled** 设置为true即可启用默认的smtp邮件服务 
+* **email.config.host** smtp的服务地址,如`smtp.163.com`
+* **email.config.user** smtp帐号用户名
+* **email.config.password** smtp帐号密码
+* **email.supported.envs** 支持发送邮件的环境列表,英文逗号隔开。我们不希望发布邮件变成用户的垃圾邮件,只有某些环境下的发布动作才会发送邮件。
+* **email.sender** 邮件的发送人,可以不配置,默认为`email.config.user`。
+* **apollo.portal.address** Apollo Portal的地址。方便用户从邮件点击跳转到Apollo Portal查看详细的发布信息。
+* **email.template.framework** 邮件内容模板框架。将邮件内容模板化、可配置化,方便管理和变更邮件内容。
+* **email.template.release.module.diff** 发布邮件的diff模块。
+* **email.template.rollback.module.diff** 回滚邮件的diff模块。
+* **email.template.release.module.rules** 灰度发布的灰度规则模块。
+
+我们提供了[邮件模板样例](#三、邮件模板样例),方便大家使用。
+
+## 二、实现方式二:接入公司的统一邮件服务
+
+和SSO类似,每个公司也有自己的邮件服务实现,所以我们相应的定义了[EmailService](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/EmailService.java)接口,现有两个实现类:
+1. CtripEmailService:携程实现的EmailService
+2. DefaultEmailService:smtp实现
+
+### 2.1 接入步骤
+1. 提供自己公司的[EmailService](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/EmailService.java)实现,并在[EmailConfiguration](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/configuration/EmailConfiguration.java)中注册。
+2. 在ApolloPortalDB.ServerConfig表配置以下参数,也可以通过管理员工具 - 系统参数页面进行配置,修改完一分钟实时生效。如下:
+* **email.supported.envs** 支持发送邮件的环境列表,英文逗号隔开。我们不希望发布邮件变成用户的垃圾邮件,只有某些环境下的发布动作才会发送邮件。
+* **email.sender** 邮件的发送人。
+* **apollo.portal.address** Apollo Portal的地址。方便用户从邮件点击跳转到Apollo Portal查看详细的发布信息。
+* **email.template.framework** 邮件内容模板框架。将邮件内容模板化、可配置化,方便管理和变更邮件内容。
+* **email.template.release.module.diff** 发布邮件的diff模块。
+* **email.template.rollback.module.diff** 回滚邮件的diff模块。
+* **email.template.release.module.rules** 灰度发布的灰度规则模块。
+  
+我们提供了[邮件模板样例](#三、邮件模板样例),方便大家使用。
+
+>注:运行时使用不同的实现是通过[Profiles](http://docs.spring.io/autorepo/docs/spring-boot/current/reference/html/boot-features-profiles.html)实现的,比如你自己的Email实现是在`custom` profile中的话,在打包脚本中可以指定-Dapollo_profile=github,custom。其中`github`是Apollo必须的一个profile,用于数据库的配置,`custom`是你自己实现的profile。同时需要注意在[EmailConfiguration](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/configuration/EmailConfiguration.java)中修改默认实现的条件`@Profile({"!custom"})`。
+
+### 2.2 相关代码
+1. [ConfigPublishListener](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/ConfigPublishListener.java)监听发布事件,调用emailbuilder构建邮件内容,然后调用EmailService发送邮件
+2. [emailbuilder](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/components/emailbuilder)包是构建邮件内容的实现
+3. [EmailService](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/EmailService.java) 邮件发送服务
+4. [EmailConfiguration](https://github.com/ctripcorp/apollo/blob/master/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/configuration/EmailConfiguration.java) 邮件服务注册类
+
+## 三、邮件模板样例
+以下为发布邮件和回滚邮件的模板内容样式,邮件模板为html格式,发送html格式的邮件时,可能需要做一些额外的处理,取决于每个公司的邮件服务实现。为了减少字符数,模板经过了压缩处理,可自行格式化提高可读性。
+
+### 3.1 email.template.framework
+
+```html
+<html><head><style type="text/css">.table{width:100%;max-width:100%;margin-bottom:20px;border-collapse:collapse;background-color:transparent}td{padding:8px;line-height:1.42857143;vertical-align:top;border:1px solid #ddd;border-top:1px solid #ddd}.table-bordered{border:1px solid #ddd}</style></head><body><h3>发布基本信息</h3><table class="table table-bordered"><tr><td width="10%"><b>AppId</b></td><td width="15%">#{appId}</td><td width="10%"><b>环境</b></td><td width="15%">#{env}</td><td width="10%"><b>集群</b></td><td width="15%">#{clusterName}</td><td width="10%"><b>Namespace</b></td><td width="15%">#{namespaceName}</td></tr><tr><td><b>发布者</b></td><td>#{operator}</td><td><b>发布时间</b></td><td>#{releaseTime}</td><td><b>发布标题</b></td><td>#{releaseTitle}</td><td><b>备注</b></td><td>#{releaseComment}</td></tr></table>#{diffModule}#{rulesModule}<br><a href="#{apollo.portal.address}/config/history.html?#/appid=#{appId}&env=#{env}&clusterName=#{clusterName}&namespaceName=#{namespaceName}&releaseHistoryId=#{releaseHistoryId}">点击查看详细的发布信息</a><br><br>如有Apollo使用问题请先查阅<a href="http://conf.ctripcorp.com/display/FRAM/Apollo">文档</a>,或直接回复本邮件咨询。</body></html>
+```
+
+> 注:使用此模板需要在 portal 的系统参数中配置 apollo.portal.address,指向 apollo portal 的地址
+
+### 3.2 email.template.release.module.diff
+
+```html
+<h3>变更的配置</h3>
+<table class="table table-bordered">
+    <tr>
+        <td width="10%"><b>Type</b></td>
+        <td width="20%"><b>Key</b></td>
+        <td width="35%"><b>Old Value</b></td>
+        <td width="35%"><b>New Value</b></td>
+    </tr>
+    #{diffContent}
+</table>
+```
+
+### 3.3 email.template.rollback.module.diff
+```html
+<div>
+    <br><br>
+    <h3>变更的配置</h3>
+    <table class="table table-bordered">
+        <tr>
+            <td width="10%"><b>Type</b></td>
+            <td width="20%"><b>Key</b></td>
+            <td width="35%"><b>回滚前</b></td>
+            <td width="35%"><b>回滚后</b></td>
+        </tr>
+        #{diffContent}
+    </table>
+    <br>
+</div>
+```
+
+### 3.4 email.template.release.module.rules
+```html
+<div>
+    <br>
+    <h3>灰度规则</h3>
+    #{rulesContent}
+    <br>
+</div>
+```
+
+### 3.5 发布邮件样例
+![发布邮件模板](https://raw.githubusercontent.com/ctripcorp/apollo/master/doc/images/email-template-release.png)
+
+### 3.6 回滚邮件样例
+![回滚邮件模板](https://raw.githubusercontent.com/ctripcorp/apollo/master/doc/images/email-template-rollback.png)

+ 59 - 0
docs/zh/development/portal-how-to-enable-webhook-notification.md

@@ -0,0 +1,59 @@
+从 1.8.0 版本开始,apollo 增加了 webhook 支持,从而可以在配置发布时触发 webhook 并告知配置发布的信息。
+
+## 启用方式
+
+> 配置项统一存储在ApolloPortalDB.ServerConfig表中,也可以通过`管理员工具 - 系统参数`页面进行配置,修改完一分钟实时生效。
+
+1. webhook.supported.envs
+
+开启 webhook 的环境列表,多个环境以英文逗号分隔,如
+
+```
+DEV,FAT,UAT,PRO
+```
+
+2. config.release.webhook.service.url
+
+webhook 通知的 url 地址,需要接收 HTTP POST 请求。如有多个地址,以英文逗号分隔,如
+
+```
+http://www.xxx.com/webhook1,http://www.xxx.com/webhook2
+```
+
+## Webhook 接入方式
+
+1. URL 参数
+
+参数名 | 参数说明
+--- | ---
+env | 该次配置发布所在的环境
+
+2. Request body sample
+
+```json
+{
+    "appId": "",  // appId
+    "clusterName": "",  // 集群
+    "namespaceName": "", // namespace
+    "operator": "",  // 发布人
+    "releaseId": 2,  // releaseId
+    "releaseTitle": "",  // releaseTitle 
+    "releaseComment": "",  // releaseComment
+    "releaseTime": "",  // 发布时间  eg:2020-01-01T00:00:00.000+0800
+    "configuration": [ { // 发布后的全部配置,如果为灰度发布,则为灰度发布后的全部配置
+        "firstEntity": "",  // 配置的key
+        "secondEntity": ""  // 配置的value
+    } ],
+    "isReleaseAbandoned": false,
+    "previousReleaseId": 1,  // 上一次正式发布的releaseId
+    "operation":  // 0-正常发布 1-配置回滚 2-灰度发布 4-全量发布
+    "operationContext": {  // 操作设置的属性配置
+        "isEmergencyPublish": true/false,  // 是否紧急发布
+        "rules": [ {  // 灰度规则
+            "clientAppId": "",   // appId
+            "clientIpList": [ "10.0.0.2", "10.0.0.3" ]  // IP列表
+        } ],
+        "branchReleaseKeys": [ "", "" ]  // 灰度发布的key
+    }
+}
+```

+ 0 - 3
docs/zh/development/portal-how-to-implement-user-login-function.md

@@ -319,7 +319,6 @@ spring:
           # 必须是 https, jwt 的 issuer-uri
           # 例如 你的 issuer-uri 是 https://host:port/auth/realms/apollo/.well-known/openid-configuration, 那么此处只需要配置 https://host:port/auth/realms/apollo 即可, spring boot 处理的时候会自动加上 /.well-known/openid-configuration 的后缀
           issuer-uri: https://host:port/auth/realms/apollo
-
 ```
 
 ### 2. 配置 `startup.sh`
@@ -334,10 +333,8 @@ LOG_DIR=/opt/logs/100003173
 SERVER_PORT=8070
 
 export JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=github,oidc"
-
 ```
 
-
 ## 实现方式四: 接入公司的统一登录认证系统
 
 这种实现方式的前提是公司已经有统一的登录认证系统,最常见的比如SSO、LDAP等。接入时,实现以下SPI。其中UserService和UserInfoHolder是必须要实现的。

+ 6 - 6
docs/zh/faq/common-issues-in-deployment-and-development-phase.md

@@ -67,10 +67,10 @@ eureka:
 
 1.6.0版本增加了自定义环境的功能,可以在不修改代码的情况增加环境
 
-1. protaldb增加环境,参考[分布式部署指南 2.1.3.1一节](zh/deployment/distributed-deployment-guide?id=_2131-调整apolloportaldb配置)
+1. protaldb增加环境,参考[3.1 调整ApolloPortalDB配置](zh/deployment/distributed-deployment-guide?id=_31-调整apolloportaldb配置)
 2. 为apollo-portal添加新增环境对应的meta server地址,具体参考:[2.2.1.1.2.4 配置apollo-portal的meta service信息](zh/deployment/distributed-deployment-guide?id=_221124-配置apollo-portal的meta-service信息)。apollo-client在新的环境下使用时也需要做好相应的配置,具体参考:[1.2.2 Apollo Meta Server](zh/usage/java-sdk-user-guide?id=_122-apollo-meta-server)。
 
->注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,具体请参考:[2.1.2 创建ApolloConfigDB](zh/deployment/distributed-deployment-guide?id=_212-创建apolloconfigdb),[2.1.3.2 调整ApolloConfigDB配置](zh/deployment/distributed-deployment-guide?id=_2132-调整apolloconfigdb配置),[2.2.1.1.2 配置数据库连接信息](zh/deployment/distributed-deployment-guide?id=_22112-配置数据库连接信息)
+>注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,具体请参考:[2.1.2 创建ApolloConfigDB](zh/deployment/distributed-deployment-guide?id=_212-创建apolloconfigdb),[3.2 调整ApolloConfigDB配置](zh/deployment/distributed-deployment-guide?id=_32-调整apolloconfigdb配置),[2.2.1.1.2 配置数据库连接信息](zh/deployment/distributed-deployment-guide?id=_22112-配置数据库连接信息)
 
 > 注2:如果是为已经运行了一段时间的Apollo配置中心增加环境,别忘了参考[2.1.2.4 从别的环境导入ApolloConfigDB的项目数据](zh/deployment/distributed-deployment-guide?id=_2124-从别的环境导入apolloconfigdb的项目数据)对新的环境做初始化
 
@@ -78,10 +78,10 @@ eureka:
 ##### 4.2.1 添加Apollo预先定义好的环境
 
 如果需要添加的环境是Apollo预先定义的环境(DEV, FAT, UAT, PRO),需要两步操作:
-1. protaldb增加环境,参考[分布式部署指南 2.1.3.1一节](zh/deployment/distributed-deployment-guide?id=_2131-调整apolloportaldb配置)
+1. protaldb增加环境,参考[3.1 调整ApolloPortalDB配置](zh/deployment/distributed-deployment-guide?id=_31-调整apolloportaldb配置)
 2. 为apollo-portal添加新增环境对应的meta server地址,具体参考:[2.2.1.1.2.4 配置apollo-portal的meta service信息](zh/deployment/distributed-deployment-guide?id=_221124-配置apollo-portal的meta-service信息)。apollo-client在新的环境下使用时也需要做好相应的配置,具体参考:[1.2.2 Apollo Meta Server](zh/usage/java-sdk-user-guide?id=_122-apollo-meta-server)。
 
->注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,具体请参考:[2.1.2 创建ApolloConfigDB](zh/deployment/distributed-deployment-guide?id=_212-创建apolloconfigdb),[2.1.3.2 调整ApolloConfigDB配置](zh/deployment/distributed-deployment-guide?id=_2132-调整apolloconfigdb配置),[2.2.1.1.2 配置数据库连接信息](zh/deployment/distributed-deployment-guide?id=_22112-配置数据库连接信息)
+>注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,具体请参考:[2.1.2 创建ApolloConfigDB](zh/deployment/distributed-deployment-guide?id=_212-创建apolloconfigdb),[3.2 调整ApolloConfigDB配置](zh/deployment/distributed-deployment-guide?id=_32-调整apolloconfigdb配置),[2.2.1.1.2 配置数据库连接信息](zh/deployment/distributed-deployment-guide?id=_22112-配置数据库连接信息)
 
 > 注2:如果是为已经运行了一段时间的Apollo配置中心增加环境,别忘了参考[2.1.2.4 从别的环境导入ApolloConfigDB的项目数据](zh/deployment/distributed-deployment-guide?id=_2124-从别的环境导入apolloconfigdb的项目数据)对新的环境做初始化
 
@@ -134,10 +134,10 @@ public class LegacyMetaServerProvider {
     ...
 }
 ```
-6. protaldb增加`BETA`环境,参考[分布式部署指南 2.1.3.1一节](zh/deployment/distributed-deployment-guide?id=_2131-调整apolloportaldb配置)
+6. protaldb增加`BETA`环境,参考[3.1 调整ApolloPortalDB配置](zh/deployment/distributed-deployment-guide?id=_31-调整apolloportaldb配置)
 7. 为apollo-portal添加新增环境对应的meta server地址,具体参考:[2.2.1.1.2.4 配置apollo-portal的meta service信息](zh/deployment/distributed-deployment-guide?id=_221124-配置apollo-portal的meta-service信息)。apollo-client在新的环境下使用时也需要做好相应的配置,具体参考:[1.2.2 Apollo Meta Server](zh/usage/java-sdk-user-guide?id=_122-apollo-meta-server)。
 
->注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,具体请参考:[2.1.2 创建ApolloConfigDB](zh/deployment/distributed-deployment-guide?id=_212-创建apolloconfigdb),[2.1.3.2 调整ApolloConfigDB配置](zh/deployment/distributed-deployment-guide?id=_2132-调整apolloconfigdb配置),[2.2.1.1.2 配置数据库连接信息](zh/deployment/distributed-deployment-guide?id=_22112-配置数据库连接信息)
+>注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,具体请参考:[2.1.2 创建ApolloConfigDB](zh/deployment/distributed-deployment-guide?id=_212-创建apolloconfigdb),[3.2 调整ApolloConfigDB配置](zh/deployment/distributed-deployment-guide?id=_32-调整apolloconfigdb配置),[2.2.1.1.2 配置数据库连接信息](zh/deployment/distributed-deployment-guide?id=_22112-配置数据库连接信息)
 
 > 注2:如果是为已经运行了一段时间的Apollo配置中心增加环境,别忘了参考[2.1.2.4 从别的环境导入ApolloConfigDB的项目数据](zh/deployment/distributed-deployment-guide?id=_2124-从别的环境导入apolloconfigdb的项目数据)对新的环境做初始化
 

+ 1 - 1
docs/zh/misc/apollo-benchmark.md

@@ -34,7 +34,7 @@ QPS: 160
 
 999线响应时间: 2.5ms
 
->注:config service开启了配置缓存,更多信息可以参考[分布式部署指南中的缓存配置](zh/deployment/distributed-deployment-guide#_3-config-servicecacheenabled-是否开启配置缓存)
+>注:config service开启了配置缓存,更多信息可以参考[分布式部署指南中的缓存配置](zh/deployment/distributed-deployment-guide#_323-config-servicecacheenabled-是否开启配置缓存)
 
 #### 2.2 Config Server GC情况
 

+ 3 - 3
docs/zh/usage/apollo-user-guide.md

@@ -449,10 +449,10 @@ Apollo从1.6.0版本开始增加访问密钥机制,从而只有经过身份验
 
 Apollo 支持细粒度的权限控制,请务必根据实际情况做好权限控制:
 1. [项目管理员权限](#_121-项目管理员权限)
-    * Apollo 默认允许所有登录用户创建项目,如果只允许部分用户创建项目,可以开启[创建项目权限控制](zh/deployment/distributed-deployment-guide?id=_10-rolecreate-applicationenabled-是否开启创建项目权限控制)
+    * Apollo 默认允许所有登录用户创建项目,如果只允许部分用户创建项目,可以开启[创建项目权限控制](zh/deployment/distributed-deployment-guide?id=_3110-rolecreate-applicationenabled-是否开启创建项目权限控制)
 2. [配置编辑、发布权限](#_122-配置编辑、发布权限)
     * 配置编辑、发布权限支持按环境配置,比如开发环境开发人员可以自行完成配置编辑和发布的过程,但是生产环境发布权限交由测试或运维人员
-    * 生产环境建议同时开启[发布审核](zh/deployment/distributed-deployment-guide?id=_2-namespacelockswitch-一次发布只能有一个人修改开关,用于发布审核),从而控制一次配置发布只能由一个人修改,另一个人发布,确保配置修改得到充分检查
+    * 生产环境建议同时开启[发布审核](zh/deployment/distributed-deployment-guide?id=_322-namespacelockswitch-一次发布只能有一个人修改开关,用于发布审核),从而控制一次配置发布只能由一个人修改,另一个人发布,确保配置修改得到充分检查
 3. [配置查看权限](#_61-配置查看权限)
     * 可以指定某个环境只允许项目成员查看私有Namespace的配置,从而避免敏感配置泄露,如生产环境
 
@@ -462,4 +462,4 @@ Apollo 支持细粒度的权限控制,请务必根据实际情况做好权限
 
 1. `apollo-configservice`和`apollo-adminservice`是基于内网可信网络设计的,所以出于安全考虑,禁止`apollo-configservice`和`apollo-adminservice`直接暴露在公网
 2. 对敏感配置可以考虑开启[访问秘钥](#_62-%e9%85%8d%e7%bd%ae%e8%ae%bf%e9%97%ae%e5%af%86%e9%92%a5),从而只有经过身份验证的客户端才能访问敏感配置
-3. 1.7.1及以上版本可以考虑为`apollo-adminservice`开启[访问控制](zh/deployment/distributed-deployment-guide?id=_6-admin-serviceaccesscontrolenabled-配置apollo-adminservice是否开启访问控制),从而只有[受控的](zh/deployment/distributed-deployment-guide?id=_12-admin-serviceaccesstokens-%e8%ae%be%e7%bd%aeapollo-portal%e8%ae%bf%e9%97%ae%e5%90%84%e7%8e%af%e5%a2%83apollo-adminservice%e6%89%80%e9%9c%80%e7%9a%84access-token)`apollo-portal`才能访问对应接口,增强安全性
+3. 1.7.1及以上版本可以考虑为`apollo-adminservice`开启[访问控制](zh/deployment/distributed-deployment-guide?id=_326-admin-serviceaccesscontrolenabled-配置apollo-adminservice是否开启访问控制),从而只有[受控的](zh/deployment/distributed-deployment-guide?id=_3112-admin-serviceaccesstokens-设置apollo-portal访问各环境apollo-adminservice所需的access-token)`apollo-portal`才能访问对应接口,增强安全性

+ 25 - 10
docs/zh/usage/java-sdk-user-guide.md

@@ -77,8 +77,8 @@ Apollo支持应用在不同的环境有不同的配置,所以需要在运行
     * 注意key为全大写,且中间是`_`分隔
 4. 通过`server.properties`配置文件
     * 可以在`server.properties`配置文件中指定`apollo.meta=http://config-service-url`
-    * 对于Mac/Linux,文件位置为`/opt/settings/server.properties`
-    * 对于Windows,文件位置为`C:\opt\settings\server.properties`
+    * 对于Mac/Linux,默认文件位置为`/opt/settings/server.properties`
+    * 对于Windows,默认文件位置为`C:\opt\settings\server.properties`
 5. 通过`app.properties`配置文件
     * 可以在`classpath:/META-INF/app.properties`指定`apollo.meta=http://config-service-url`
 6. 通过Java system property `${env}_meta`
@@ -137,8 +137,8 @@ MetaServerProvider的实现可以参考[LegacyMetaServerProvider](https://github
     * 注意key为全大写,且中间是`_`分隔
 4. 通过`server.properties`配置文件
     * 可以在`server.properties`配置文件中指定`apollo.configService=http://config-service-url:port`
-    * 对于Mac/Linux,文件位置为`/opt/settings/server.properties`
-    * 对于Windows,文件位置为`C:\opt\settings\server.properties`
+    * 对于Mac/Linux,默认文件位置为`/opt/settings/server.properties`
+    * 对于Windows,默认文件位置为`C:\opt\settings\server.properties`
 
 ### 1.2.3 本地缓存路径
 Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
@@ -178,8 +178,8 @@ batch=2000
     * 注意key为全大写,且中间是`_`分隔
 4. 通过`server.properties`配置文件
     * 可以在`server.properties`配置文件中指定`apollo.cacheDir=/opt/data/some-cache-dir`
-    * 对于Mac/Linux,文件位置为`/opt/settings/server.properties`
-    * 对于Windows,文件位置为`C:\opt\settings\server.properties`
+    * 对于Mac/Linux,默认文件位置为`/opt/settings/server.properties`
+    * 对于Windows,默认文件位置为`C:\opt\settings\server.properties`
 
 > 注:本地缓存路径也可用于容灾目录,如果应用在所有config service都挂掉的情况下需要扩容,那么也可以先把配置从已有机器上的缓存路径复制到新机器上的相同缓存路径
 
@@ -201,8 +201,8 @@ Environment可以通过以下3种方式的任意一个配置:
 
 3. 通过配置文件
     * 最后一个推荐的方式是通过配置文件来指定`env=YOUR-ENVIRONMENT`
-    * 对于Mac/Linux,文件位置为`/opt/settings/server.properties`
-    * 对于Windows,文件位置为`C:\opt\settings\server.properties`
+    * 对于Mac/Linux,默认文件位置为`/opt/settings/server.properties`
+    * 对于Windows,默认文件位置为`C:\opt\settings\server.properties`
 
 文件内容形如:
 ```properties
@@ -244,8 +244,8 @@ Apollo支持配置按照集群划分,也就是说对于一个appId和一个环
     * 注意key为全大写
 5. 通过`server.properties`配置文件
     * 可以在`server.properties`配置文件中指定`idc=xxx`
-    * 对于Mac/Linux,文件位置为`/opt/settings/server.properties`
-    * 对于Windows,文件位置为`C:\opt\settings\server.properties`
+    * 对于Mac/Linux,默认文件位置为`/opt/settings/server.properties`
+    * 对于Windows,默认文件位置为`C:\opt\settings\server.properties`
 
 **Cluster Precedence**(集群顺序)
 
@@ -302,6 +302,21 @@ Apollo从1.6.0版本开始增加访问密钥机制,从而只有经过身份验
 4. 通过`app.properties`配置文件
     * 可以在`classpath:/META-INF/app.properties`指定`apollo.accesskey.secret=1cf998c4e2ad4704b45a98a509d15719`
 
+#### 1.2.4.5 自定义server.properties路径
+
+> 适用于1.8.0及以上版本
+
+1.8.0版本开始支持以下方式自定义server.properties路径,按照优先级从高到低分别为:
+
+1. 通过Java System Property `apollo.path.server.properties`
+   * 可以通过Java的System Property `apollo.path.server.properties`来指定
+   * 在Java程序启动脚本中,可以指定`-Dapollo.path.server.properties=/some-dir/some-file.properties`
+      * 如果是运行jar文件,需要注意格式是`java -Dapollo.path.server.properties=/some-dir/some-file.properties -jar xxx.jar`
+   * 也可以通过程序指定,如`System.setProperty("apollo.path.server.properties", "/some-dir/some-file.properties");`
+2. 通过操作系统的System Environment`APOLLO_PATH_SERVER_PROPERTIES`
+   * 可以通过操作系统的System Environment `APOLLO_PATH_SERVER_PROPERTIES`来指定
+   * 注意key为全大写,且中间是`_`分隔
+
 # 二、Maven Dependency
 Apollo的客户端jar包已经上传到中央仓库,应用在实际使用时只需要按照如下方式引入即可。
 ```xml