参照dubbo官网
- http://dubbo.apache.org/zh-cn/docs/source_code_guide/dubbo-spi.html
需求
dubbo实现类项目接入公共组件(serviceimpl-framework 公司内部),针对出参和入参日志中的敏感日志都是明文输出,存在很大风险
基于dubbo SPI或者java SPI开发应用
- 考虑到使用Dubbo SPI进行处理
- SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类
- 我们在serviceimpl-framework定义接口,实现类可以为多个,当前场景只会存在一个实现类
import java.util.Set;
public interface EncryptFieldFilter {
Set<String> encryptField();
}
import com.google.common.collect.Sets;
import com.zbj.account.manager.common.utils.Constant;
import com.zbj.common.spi.EncryptFieldFilter;
import java.util.Set;
public class AccountDubboFieldFilter implements EncryptFieldFilter {
private static final Set<String> encryptSet;
static {
String encryptStr = "mobile,phone,useremail,email,code";
encryptSet = Sets.newHashSet(encryptStr.split(Constant.COMMA_SPLIT));
}
@Override
public Set<String> encryptField() {
return encryptSet;
}
}
- 在resources创建 META-INF和services目录
- 在services目录下,创建接口类的全路径文件名(文件名没有后缀)
- 文件内容是实现类的全路径名
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/999f83f3e72e47c4cfe2216f77e8178f.png)
- 这样serviceimpl-framework中就可以通过入参和出参来判断,是否需要过来
- 过滤日志处理
String jsonReq = JSON.toJSONString(requestLog, sensitiveInfoFilter, SerializerFeature.PrettyFormat);
private static class SensitiveInfoFilter implements ValueFilter {
private static final String PASSWORD = "password";
private final Set<String> fieldSet;
public SensitiveInfoFilter() {
fieldSet = new CopyOnWriteArraySet();
}
public void resetClear() {
fieldSet.clear();
}
public void addFieldSet(Set<String> encryptFieldSet) {
fieldSet.addAll(encryptFieldSet);
}
public Set<String> getFieldSet() {
return fieldSet;
}
@Override
public Object process(Object object, String name, Object value) {
if (StringUtils.isEmpty(name)) {
return value;
}
if (fieldSet.contains(name)) {
if (value instanceof String && !StringUtils.isEmpty(value)) {
...
}
}
return value;
}
}
- 考虑到这里使用dubbo SPI,如果定义在公共组件(serviceimpl-framework)中,这样依赖太重了,而且可能存在与业务方版本兼容问题,这里使用原生Java SPI
- 看了dubbo源码,SPI会从这三个路径读取配置
private static final String SERVICES_DIRECTORY = "META-INF/services/";
private static final String DUBBO_DIRECTORY = "META-INF/dubbo/";
private static final String DUBBO_INTERNAL_DIRECTORY = DUBBO_DIRECTORY + "internal/";
- 注:实现类项目中的敏感日志输出,需要单独配置一套(敏感词配置在配置中心),调用类似于JSON.toJSONString(Object object)操作