Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
20c99188c6
|
|
@ -0,0 +1,29 @@
|
|||
package com.bonus.core.tenant;
|
||||
|
||||
import com.bonus.core.common.utils.TenantContextHolder;
|
||||
import feign.RequestInterceptor;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
|
||||
@AutoConfiguration
|
||||
public class FeignTenantConfiguration {
|
||||
private static final Logger log = LoggerFactory.getLogger(FeignTenantConfiguration.class);
|
||||
private final TenantConfigProperties tenantConfigProperties;
|
||||
|
||||
@Bean
|
||||
public RequestInterceptor feignTenantIdFiller() {
|
||||
return (template) -> {
|
||||
if (TenantContextHolder.getTenantId() == null) {
|
||||
log.warn("Feign tenant fill: there's no tenantId in threadLocal, fallback to null!");
|
||||
} else {
|
||||
template.header(this.tenantConfigProperties.getCarrierName(), new String[]{TenantContextHolder.getTenantId().toString()});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public FeignTenantConfiguration(final TenantConfigProperties tenantConfigProperties) {
|
||||
this.tenantConfigProperties = tenantConfigProperties;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
package com.bonus.core.tenant;
|
||||
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@RefreshScope
|
||||
@ConfigurationProperties(
|
||||
prefix = "tenant"
|
||||
)
|
||||
public class TenantConfigProperties {
|
||||
private String mdc = "x-tenant";
|
||||
private String carrierName = "X-Tenant";
|
||||
|
||||
public String getMdc() {
|
||||
return this.mdc;
|
||||
}
|
||||
|
||||
public String getCarrierName() {
|
||||
return this.carrierName;
|
||||
}
|
||||
|
||||
public void setMdc(final String mdc) {
|
||||
this.mdc = mdc;
|
||||
}
|
||||
|
||||
public void setCarrierName(final String carrierName) {
|
||||
this.carrierName = carrierName;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
package com.bonus.core.tenant;
|
||||
|
||||
import cn.hutool.core.text.CharSequenceUtil;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||
import com.bonus.core.common.utils.TenantContextHolder;
|
||||
import java.io.IOException;
|
||||
|
||||
import com.bonus.core.data.dataset.rule.RoutingRule;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.slf4j.MDC;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.filter.GenericFilterBean;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
@Component
|
||||
@Order(Integer.MIN_VALUE)
|
||||
public class TenantContextHolderFilter extends GenericFilterBean {
|
||||
private static final Logger log = LoggerFactory.getLogger(TenantContextHolderFilter.class);
|
||||
private final TenantConfigProperties tenantConfigProperties;
|
||||
|
||||
@Override
|
||||
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
|
||||
RoutingRule.reset();
|
||||
|
||||
try {
|
||||
String tenantId = null;
|
||||
if (servletRequest instanceof HttpServletRequest) {
|
||||
tenantId = ((HttpServletRequest)servletRequest).getHeader(this.tenantConfigProperties.getCarrierName());
|
||||
}
|
||||
|
||||
if (StringUtils.isBlank(tenantId)) {
|
||||
tenantId = servletRequest.getParameter(this.tenantConfigProperties.getCarrierName());
|
||||
}
|
||||
|
||||
if (CharSequenceUtil.isBlank(tenantId)) {
|
||||
TenantContextHolder.setTenantId((Long)null);
|
||||
} else {
|
||||
if (!tenantId.matches("^\\d+$")) {
|
||||
return;
|
||||
}
|
||||
|
||||
TenantContextHolder.setTenantId(Long.parseLong(tenantId));
|
||||
}
|
||||
|
||||
log.trace("retrieved tenant from request args:{}", TenantContextHolder.getTenantId());
|
||||
MDC.put(this.tenantConfigProperties.getMdc(), TenantContextHolder.getTenantId() == null ? null : String.valueOf(TenantContextHolder.getTenantId()));
|
||||
filterChain.doFilter(servletRequest, servletResponse);
|
||||
} finally {
|
||||
RoutingRule.reset();
|
||||
TenantContextHolder.clear();
|
||||
MDC.remove(this.tenantConfigProperties.getMdc());
|
||||
}
|
||||
}
|
||||
|
||||
public TenantContextHolderFilter(final TenantConfigProperties tenantConfigProperties) {
|
||||
this.tenantConfigProperties = tenantConfigProperties;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package com.bonus.core.tenant;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public interface TenantLoader {
|
||||
Set<Long> listTenant();
|
||||
}
|
||||
|
|
@ -44,3 +44,8 @@ oss:
|
|||
region: ${OSS_REGION:}
|
||||
path-style-access: ${OSS_PATH_STYLE:true}
|
||||
useHttp: ${OSS_USE_HTTP:false}
|
||||
|
||||
tenant:
|
||||
carrier-name: MERCHANT-ID
|
||||
schema-prefix: ${TENANT_SCHEMA_PREFIX:}
|
||||
schema-suffix: ${TENANT_SCHEMA_SUFFIX:}
|
||||
Reference in New Issue