网上有人说dubbo-admin工程部署起来了,但是发现禁用一个提供者服务后,消费者仍然可以调用提供者提供的服务,我试了一下,也确实碰到了同样的情况。我个人认为是dubbo-admin对此按钮的后端实现代码写得逻辑有问题造成的,后面我调整了一下就可以了,具体调整如下:
1,找到com.alibaba.dubbo.governance.service.impl.ProviderServiceImpl这个类,然后对启用/禁用的代码进行修改,修改如下:
禁用代码
public void disableProvider(Long id) {
if (id == null) {
throw new IllegalStateException("no provider id");
}
Provider oldProvider = findProvider(id);
if (oldProvider == null) {
throw new IllegalStateException("Provider was changed!");
}
if (oldProvider.isDynamic()) {
List<Override> oList = overrideService.findByServiceAndAddress(oldProvider.getService(), oldProvider.getAddress());
for (Override o : oList) {
Map<String, String> params = StringUtils.parseQueryString(o.getParams());
if (params.containsKey(Constants.DISABLED_KEY)) {
if (params.get(Constants.DISABLED_KEY).equals("false")) {
overrideService.deleteOverride(o.getId());
}
}
}
//保证disable的override唯一
if (oldProvider.isEnabled()) {
Override override = new Override();
override.setAddress(oldProvider.getAddress());
override.setService(oldProvider.getService());
override.setEnabled(false);
override.setParams(Constants.DISABLED_KEY + "=true");
overrideService.saveOverride(override);
//自己修改的版本
oldProvider.setEnabled(false);
updateProvider(oldProvider);
return;
}
} else {
oldProvider.setEnabled(false);
updateProvider(oldProvider);
}
}
启用代码
public void enableProvider(Long id) {
if (id == null) {
throw new IllegalStateException("no provider id");
}
Provider oldProvider = findProvider(id);
if (oldProvider == null) {
throw new IllegalStateException("Provider was changed!");
}
if (oldProvider.isDynamic()) {
List<Override> oList = overrideService.findByServiceAndAddress(oldProvider.getService(), oldProvider.getAddress());
for (Override o : oList) {
Map<String, String> params = StringUtils.parseQueryString(o.getParams());
if (params.containsKey(Constants.DISABLED_KEY)) {
if (params.get(Constants.DISABLED_KEY).equals("true")) {
overrideService.deleteOverride(o.getId());
}
}
}
//保证disable的override唯一
if (!oldProvider.isEnabled()) {
Override override = new Override();
override.setAddress(oldProvider.getAddress());
override.setService(oldProvider.getService());
override.setEnabled(true);
override.setParams(Constants.DISABLED_KEY + "=false");
overrideService.saveOverride(override);
oldProvider.setEnabled(true);
updateProvider(oldProvider);
return;
}
} else {
oldProvider.setEnabled(true);
updateProvider(oldProvider);
}
}