添加权限
apollo管理员账户进入http://{apollo_protal_url}/open/manage.html 创建第三方应用,生成一个openapi的token,如下图所示:
- 第三方应用id:唯一标示,没啥用,字母数字即可
- 部门:应用归属部门,用于筛选
- 第三方应用名称:应用名称,一个简单的描述
- 项目负责人:openapi操作的用户,该用户必须具有该项目的操作全选,没有的话需要在apollo项目中授权添加,否则调用时会出现403错误。
- token:自定生成,openapi客户端参数
- 被管理appid:已在apollo中存在的需要操作的apollo的应用id。
- 被管理的Namespace:openapi可操作的namesapce,授权类型为namespace时,最少填一个。
- 授权类型:namespace:指定namesapce,app:所有namespace
- 环境:指定允许操作的配置环境
创建apollo客户端
import com.ctrip.framework.apollo.openapi.client.ApolloOpenApiClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
/**
* @description: apollo openapi连接
* @author: lizz
* @date: 2020/7/15 11:27
*/
@Configuration
@Profile({"dev","test"}) //运行环境
public class ApolloConfig {
/**
* apollo portal url
* apollo 访问地址
**/
@Value("${appkey.apollo.url}")
private String portalUrl;
/**
* token apollo中添加的openapi token
**/
@Value("${appkey.apollo.token}")
private String token;
@Bean
public ApolloOpenApiClient apolloOpenApiClient() {
ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder()
.withPortalUrl(portalUrl)
.withToken(token)
.build();
return client;
}
}
操作接口
/**
* @description: 操作apollo配置
* @author: lizz
* @date: 2020/7/15 11:30
*/
@RestController
@RequestMapping(value = "apollo")
@Profile({"dev","test"}) //内部环境使用
public class ApolloController {
private static final Logger logger = LoggerFactory.getLogger(ApolloController.class);
//apollo中项目id
private final static String appId = "framework-gateway";
//apollo操作用户
private final static String opUser = "lizz";
//apollo中集群名称,apollo默认集群为default
private final static String cluster = "aliyun";
//apollo中集群内namespace名称
private final static String namespace = "namespace-zone1";
//apollo操作客户端
private ApolloOpenApiClient apolloClient;
public ApolloController(ApolloOpenApiClient client) {
this.apolloClient = client;
}
/**
* 获取环境列表,如
* [{"clusters":["huawei","default"],"env":"PRO"},{"clusters":["default"],"env":"DEV"}]
* @param server apollo中服务id
* @return
*/
@GetMapping("/envclusters/{server}")
public Object getEnvclusters(@PathVariable String server) {
return JSON.toJSONString(apolloClient.getEnvClusterInfo(server));
}
/**
* 向apollo中新增配置项,为未发布状态。
* post uri:apollo/dev/add
* @param env 指定apollo的数据环境
* @return
*/
@PostMapping("/{env}/add}")
public Object addParam(@PathVariable String env) {
OpenItemDTO openItemDTO = new OpenItemDTO();
openItemDTO.setKey("timeout");
openItemDTO.setValue("100");
openItemDTO.setComment("超时时间");
openItemDTO.setDataChangeCreatedBy(opUser);
OpenItemDTO item = apolloClient.createItem(appId, env, cluster, namespace, openItemDTO);
return JSON.toJSONString(item);
}
/**
* 修改apollo中配置项,为未发布状态。
* post uri:apollo/dev/update
* @param env 指定apollo的数据环境
* @return
*/
@PostMapping("/{env}/update")
public Object updateParam() {
OpenItemDTO openItemDTO = new OpenItemDTO();
openItemDTO.setKey("timeout");
openItemDTO.setValue("200");
openItemDTO.setComment("超时时间");
openItemDTO.setDataChangeCreatedBy(opUser);
apolloClient.createOrUpdateItem(appId, env, cluster, namespace, openItemDTO);
return JSON.toJSONString(openItemDTO);
}
/**
* 获取apollo中namespace的所有配置项
* @param env 指定apollo的数据环境
* @return
*/
@GetMapping("/{env}/namespace")
public Object getAllNameSpace() {
return JSON.toJSONString(apolloClient.getNamespace(appId, env, cluster, "application"));
}
/**
* 获取某一项配置
* @param env 指定apollo的数据环境
* @param key 配置项key
* @return
*/
@GetMapping("/{env}/getParam")
public Object getParam(String env,String key) {
OpenItemDTO getItem = apolloClient.getItem(appId, env, cluster, namespace, key);
return JSON.toJSONString(getItem);
}
/**
* 刷新发布配置
*
* @param env 指定apollo的数据环境
* @return
*/
public Object releaseParam(String env) {
NamespaceGrayDelReleaseDTO namespaceGrayDelReleaseDTO = new NamespaceGrayDelReleaseDTO();
//配置版本名称
namespaceGrayDelReleaseDTO.setReleaseTitle(System.currentTimeMillis() + "-release");
//刷新说明
namespaceGrayDelReleaseDTO.setReleaseComment("auto release");
namespaceGrayDelReleaseDTO.setReleasedBy(opUser);
OpenReleaseDTO openReleaseDTO = apolloClient.publishNamespace(appId, env, cluster, namespace, namespaceGrayDelReleaseDTO);
return JSON.toJSONString(openReleaseDTO);
}
}
- 上面的参考代码中,静态参数可以根据需要使用入参的方式传递到方法中。
- apolloClient中还有很多方法可以自己探索:https://github.com/ctripcorp/apollo/wiki