package com.weibo.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ecwid.consul.v1.ConsulClient;
import com.ecwid.consul.v1.Response;
import com.ecwid.consul.v1.kv.model.GetValue;
import com.weibo.api.motan.registry.consul.ConsulConstants;
import com.weibo.api.motan.registry.support.command.RpcCommand;
import com.weibo.api.motan.registry.support.command.RpcCommandUtil;
import com.weibo.api.motan.util.LoggerUtil;
import com.weibo.utils.ConsulClientWrapper;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
@Service
@Lazy
public class ConsulCommandService extends AbstractCommandService {
@Autowired
private ConsulClientWrapper clientWrapper;
private ConsulClient consulClient;
@PostConstruct
void init() {
consulClient = clientWrapper.getConsulClient();
}
/**
* 获取所有指令
*
* @return
*/
@Override
public List<JSONObject> getAllCommands() {
List<JSONObject> commands = new ArrayList<JSONObject>();
Response<List<GetValue>> response = consulClient.getKVValues(ConsulConstants.CONSUL_MOTAN_COMMAND);
List<GetValue> values = response.getValue();
if (values != null) {
for (GetValue value : values) {
JSONObject node = new JSONObject();
if (value.getValue() == null) {
continue;
}
String group = value.getKey().substring(ConsulConstants.CONSUL_MOTAN_COMMAND.length());
String command = new String(Base64.decodeBase64(value.getValue()));
node.put("group", group);
node.put("command", RpcCommandUtil.stringToCommand(command));
commands.add(node);
}
}
return commands;
}
/**
* 获取指定group的指令列表
*
* @param groupName
* @return
*/
@Override
public String getCommands(String groupName) {
Response<GetValue> response = consulClient.getKVValue(ConsulConstants.CONSUL_MOTAN_COMMAND + groupName);
GetValue value = response.getValue();
String command = "";
if (value != null && value.getValue() != null) {
command = new String(Base64.decodeBase64(value.getValue()));
}
return command;
}
/**
* 更新指定group的指令列表
*
* @param command
* @param group
* @return
*/
@Override
public boolean setCommand(String group, RpcCommand command) {
LoggerUtil.info(String.format("set command: group=%s, command=%s: ", group, JSON.toJSONString(command)));
List<RpcCommand.ClientCommand> newCommandList = new ArrayList<RpcCommand.ClientCommand>();
for (RpcCommand.ClientCommand clientCommand : command.getClientCommandList()) {
List<String> newMergeGroups = new ArrayList<String>();
for (String mergeGroup : clientCommand.getMergeGroups()) {
mergeGroup = removeGroupNamePrefix(mergeGroup);
newMergeGroups.add(mergeGroup);
}
clientCommand.setMergeGroups(newMergeGroups);
newCommandList.add(clientCommand);
}
command.setClientCommandList(newCommandList);
Response<Boolean> response = consulClient.setKVValue(
ConsulConstants.CONSUL_MOTAN_COMMAND + removeDatacenterPrefix(group),
RpcCommandUtil.commandToString(command));
return response.getValue();
}
/**
* 去除group的datacenter前缀
*
* @param group
* @return
*/
private String removeDatacenterPrefix(String group) {
int index = group.indexOf(":");
if (index > 0) {
return group.substring(group.indexOf(":") + 1);
} else {
return group;
}
}
/**
* 去除group的motan标识前缀
*
* @param group
* @return
*/
private String removeGroupNamePrefix(String group) {
if (group.contains(ConsulConstants.CONSUL_SERVICE_MOTAN_PRE)) {
return removeDatacenterPrefix(group).substring(ConsulConstants.CONSUL_SERVICE_MOTAN_PRE.length());
} else {
return group;
}
}
}