该issue是对功能实施的一个讨论贴...细节还待补充
一. 数据流模型
数据流图如下:
-
- 当应用进入readiness状态后,SDK会上报应用实例和服务相关的会话;
-
- SOFADashboard 读取zk的会话信息,以应用为维度对配置进行管理;
-
- SOFADashboard 调用 apollo-portal-server 接口,通过应用维度修改配置;
-
- apollo-meta-server 下发配置,RPCSDK 读取配置变更,执行上下线切换LB等操作指令;
![image](https://user-images.githubusercontent.com/7821898/59548241-e3158380-8f7e-11e9-800b-a3df0ec3e472.png)
二. 方案流程细节说明
该方案仅为草案,请各位进行讨论和补充
1. 关于应用实例上报和应用读取
方案图中以Zookeeper作为集群实例上报,目前该 Application SDK 项目地址sofa-dashboard-client.
假设存在应用实例 a(ip:10.1.1.1,rpc-port:9090, http-port:8080), 服务名A
如下为实例对应的会话节点, 其中/app/instance/A
为永久节点, 其value值可以记录应用维度的一些配置:
/apps/instance/A/10.1.1.1:8080?startTime=<startTime>&lastRecover=<lastRecover>
2. 关于接入apollo(Important)
系统账号对接
通过接口直接对接apollo-portal,不关心apollo背后对接的用户体系实现.
由于 apollo 有一套良好的账号系统逻辑,支持通过LDAP或者自定义逻辑接入企业已有的账号系统,因此Dashboard这边只需要考虑对apollo的账号系统进行对接。关于apollo的账号系统拓展参考apollo认证逻辑
该对接功能包含如下几个不足之处:
- apollo 用户账号系统中用户定义较为简单,如果后需要拓展账号相关功能(比如邮箱验证等需求),需要对apollo-portal进行二次开发
关于对 Portal Server 的调用
用户登录后,使用apollo操作过程过程可以参考使用文档,简要包含了如下几个过程:
- 创建应用
- 创建namespace(如果有必要)
- 以app为维度或namespace为维度创建/修改一些下发配置
通过上报应用信息自动创建apollo应用定义
我们期望在SOFADashboard在管理的时候简化创建应用过程,使用上报的应用信息自动创建一个缺省应用。这样在用户行为上就只保留对namespace的操作和配置修改操作,增强易用性。
使用和 apollo-portal 接口直接对接方式而不是 OpenApi 对接
apollo除了前端调用的接口以外,还支持OpenApi的方式进行接入。
但是该方案有一定局限性:
首先,只有超级管理员能创建 OpenApi token; 事实上下发配置者几乎不是超级管理员,而是应用管理者;
其次 OpenApi 的局限性很强,比如不支持创建用户,不支持创建应用等功能;
最后,有的用户在自己的环境下已经有一套独立运行的 apollo 服务了,我们希望 Dashboard 的调用逻辑和 portal 保持一致,而不是魔改一些逻辑,这样即使使用了Dashboard也不会影响到apollo独立运行的状态.
因此综上所述,我们采用直接对接 portal 接口的方式对 apollo-portal进行调用
3. 关于服务管控维度
apollo 本质上是依靠多维度的方式去管理一个config
,为了实现服务管控,需要在RPC SDK中针对下发配置进行监控并执行相关操作。
目前我想的方案是先支持应用维度的环境变量,形如:
@RestController
public class HelloController {
@SofaReference(binding = @SofaReferenceBinding(bindingType = "bolt", lb="${hello.service.lb:roundRobin}"))
private HelloService service;
@GetMapping
public String hello(@RequestParam("name") String name) {
return service.sayHello(name);
}
}
使用环境变量注入的方式和apollo用户使用习惯一致,也较容易实现。
后期的方案,则可以脱离环境变量,直接在Dashboard界面上通过服务维度进行操作;