fast()多数据源调整

car-ser
王熙朝 2024-06-07 09:02:15 +08:00
parent d16f1e5c69
commit 43d3d167dc
21 changed files with 242 additions and 21 deletions

View File

@ -5,7 +5,7 @@ package com.muyu.common.core.exception;
* *
* @author muyu * @author muyu
*/ */
public final class ServiceException extends RuntimeException { public class ServiceException extends RuntimeException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.muyu</groupId>
<artifactId>muyu</artifactId>
<version>3.6.3</version>
<relativePath>../../../pom.xml</relativePath>
</parent>
<artifactId>muyu-goods-enterprise-remote</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>muyu-goods-enterprise-common</artifactId>
<version>3.6.3</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,4 @@
package muyu.goods.enterprise.remote;
public interface RemoteEnterpriseManageService {
}

View File

@ -76,11 +76,7 @@ public class EnterpriseServiceImpl implements IEnterpriseService
if (i>0){ if (i>0){
Enterprise enterprise1 = enterpriseMapper.queryDateEnterprise(); Enterprise enterprise1 = enterpriseMapper.queryDateEnterprise();
enterpriseConfig.index(enterprise1); enterpriseConfig.index(enterprise1);
//新建的企业绑定mysql服务
HttpClient.http(enterprise1);
Sources sources = Sources.index(enterprise1.getId(),"enterprise" + enterprise1.getId(), String.valueOf((int) (enterprise.getId() + 3306)));
System.out.println(sources);
enterpriseMapper.indexSources(sources);
} }
return i; return i;
} }
@ -110,7 +106,22 @@ public class EnterpriseServiceImpl implements IEnterpriseService
Enterprise enterprise = new Enterprise(); Enterprise enterprise = new Enterprise();
enterprise.setId(id); enterprise.setId(id);
enterprise.setAuthenticationDate(DateUtils.getNowDate()); enterprise.setAuthenticationDate(DateUtils.getNowDate());
return enterpriseMapper.authentication(enterprise); int i = enterpriseMapper.authentication(enterprise);
if (i>0) {
Enterprise enterprise1 = selectEnterpriseById(id);
//新建的企业绑定mysql服务
try {
HttpClient.http(enterprise1);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Sources sources = Sources.index(enterprise1.getId(),"enterprise" + enterprise1.getId(), String.valueOf((int) (enterprise.getId() + 3306)));
System.out.println(sources);
enterpriseMapper.indexSources(sources);
}
return i;
} }
/** /**

View File

@ -15,6 +15,7 @@
<modules> <modules>
<module>muyu-goods-enterprise-common</module> <module>muyu-goods-enterprise-common</module>
<module>muyu-goods-enterprise-server</module> <module>muyu-goods-enterprise-server</module>
<module>muyu-goods-enterprise-remote</module>
<module>muyu-goods-enterprise-client</module> <module>muyu-goods-enterprise-client</module>
</modules> </modules>

View File

@ -1,7 +1,9 @@
package com.muyu.cloud.controller; package com.muyu.cloud.controller;
import com.muyu.cloud.datasource.DynamicDataSourceHolder;
import com.muyu.cloud.datasource.config.contents.DataSourceInfo; import com.muyu.cloud.datasource.config.contents.DataSourceInfo;
import com.muyu.cloud.datasource.util.DataSourceService; import com.muyu.cloud.datasource.util.DataSourceService;
import com.muyu.cloud.domain.Status;
import com.muyu.cloud.service.CloudService; import com.muyu.cloud.service.CloudService;
import com.muyu.common.core.domain.Result; import com.muyu.common.core.domain.Result;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
@ -11,6 +13,8 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Log4j2 @Log4j2
@RestController @RestController
@RequestMapping("cloud") @RequestMapping("cloud")
@ -36,4 +40,9 @@ public class CloudController {
dataSourceService.addDataSource(DataSourceInfo.dataIpBuild(ip)); dataSourceService.addDataSource(DataSourceInfo.dataIpBuild(ip));
return null; return null;
} }
@PostMapping("list")
public Result<List<Status>> list() {
return Result.success(cloudService.list());
}
} }

View File

@ -40,4 +40,8 @@ public class DynamicDataSourceHolder {
log.info("移除数据源:{}",DYNAMIC_DATASOURCE_KEY.get()); log.info("移除数据源:{}",DYNAMIC_DATASOURCE_KEY.get());
DYNAMIC_DATASOURCE_KEY.remove(); DYNAMIC_DATASOURCE_KEY.remove();
} }
public boolean hashKey(String header) {
return false;
}
} }

View File

@ -1,7 +1,6 @@
package com.muyu.cloud.datasource.config; package com.muyu.cloud.datasource.config;
import com.muyu.cloud.datasource.DynamicDataSourceHolder; import com.muyu.cloud.datasource.DynamicDataSourceHolder;
import com.muyu.common.security.utils.SecurityUtils;
import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Before;
@ -27,9 +26,8 @@ public class DataSourceAsp {
*/ */
@Before("pointcut()") @Before("pointcut()")
public void beforeMethod() { public void beforeMethod() {
System.out.println(SecurityUtils.getUserId()); // Long storeId = SecurityUtils.getLoginUser().getUserid();
Long storeId = SecurityUtils.getLoginUser().getUserid(); // DynamicDataSourceHolder.setDynamicDataSourceKey("test_"+storeId);
DynamicDataSourceHolder.setDynamicDataSourceKey("test_"+storeId);
} }

View File

@ -1,12 +1,9 @@
package com.muyu.cloud.datasource.config; package com.muyu.cloud.datasource.config;
import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.muyu.cloud.datasource.config.contents.DataSourceInfo; import com.muyu.cloud.datasource.config.contents.DataSourceInfo;
import com.muyu.cloud.datasource.config.contents.Sources;
import com.muyu.common.security.utils.SecurityUtils; import com.muyu.common.security.utils.SecurityUtils;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
@ -33,8 +30,8 @@ public class DruidConfig {
* @return * @return
*/ */
private List<DataSourceInfo> getDataSourceInfoList(){ private List<DataSourceInfo> getDataSourceInfoList(){
// System.out.println("获取当前登录信息"); System.out.println("获取当前登录信息");
// System.out.println(SecurityUtils.getLoginUser()); System.out.println(SecurityUtils.getLoginUser());
List<String> databaseNameList = new ArrayList<>(){{ List<String> databaseNameList = new ArrayList<>(){{
add("3310"); add("3310");
add("3311"); add("3311");
@ -82,7 +79,7 @@ public class DruidConfig {
System.out.println(dataSourceMap); System.out.println(dataSourceMap);
//设置动态数据源 //设置动态数据源
DynamicDataSource dynamicDataSource = new DynamicDataSource(); DynamicDataSource dynamicDataSource = new DynamicDataSource();
// dynamicDataSource.setDefaultTargetDataSource(masterDataSource()); // dynamicDataSource.setDefaultTargetDataSource(dynamicDataSource);
dynamicDataSource.setTargetDataSources(dataSourceMap); dynamicDataSource.setTargetDataSources(dataSourceMap);
//将数据源信息备份在defineTargetDataSources中 //将数据源信息备份在defineTargetDataSources中
dynamicDataSource.setDefineTargetDataSources(dataSourceMap); dynamicDataSource.setDefineTargetDataSources(dataSourceMap);

View File

@ -24,7 +24,16 @@ public class DynamicDataSource extends AbstractRoutingDataSource {
private Map<Object, Object> defineTargetDataSources; private Map<Object, Object> defineTargetDataSources;
/** /**
* *
* @param key
* @return true false
*/
public boolean hashKey(String key) {
return defineTargetDataSources.containsKey(key);
}
/**
*
* @param key * @param key
* @param value * @param value
*/ */

View File

@ -0,0 +1,5 @@
package com.muyu.cloud.datasource.config.contents;
public class SaasConstant {
public final static String SAAS_KEY = "saas";
}

View File

@ -0,0 +1,17 @@
package com.muyu.cloud.datasource.exception;
import com.muyu.common.core.exception.ServiceException;
public class SaasException extends ServiceException{
public SaasException(String message, Integer code) {
super(message, code);
}
public SaasException(String message) {
super(message);
}
public SaasException() {
super();
}
}

View File

@ -0,0 +1,53 @@
package com.muyu.cloud.datasource.interceptor;
import com.muyu.cloud.datasource.DynamicDataSourceHolder;
import com.muyu.cloud.datasource.config.DynamicDataSource;
import com.muyu.cloud.datasource.exception.SaasException;
import com.muyu.cloud.datasource.config.contents.SaasConstant;
import com.muyu.common.core.utils.ServletUtils;
import com.muyu.common.core.utils.SpringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
*/
public class DataScopeInterceptor implements AsyncHandlerInterceptor{// 继承头部拦截
/**
*
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//进行跨域检测
if (!(handler instanceof HandlerMethod)){
return true;
}
// 获取请求头
String header = ServletUtils.getHeader(request, SaasConstant.SAAS_KEY);
if (header == null) {
throw new SaasException("saas非法访问");//提交异常
}else {
DynamicDataSource dynamicDataSource = SpringUtils.getBean(DynamicDataSource.class);
if (!dynamicDataSource.hashKey(header)){//判定是否出站
throw new SaasException("saas非法访问");
}
}
DynamicDataSourceHolder.setDynamicDataSourceKey(header);
return true;//默认返回true
}
/**
*
*/
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//用于清空
DynamicDataSourceHolder.removeDynamicDataSourceKey();
}
}

View File

@ -0,0 +1,31 @@
package com.muyu.cloud.datasource.interceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
*
*
* @author muyu
*/
public class WebMvcConfig implements WebMvcConfigurer {
/**
*
*/
public static final String[] excludeUrls = {"/login", "/logout", "/refresh"};
@Override
public void addInterceptors (InterceptorRegistry registry) {
registry.addInterceptor(getHeaderInterceptor())
.addPathPatterns("/**")
.excludePathPatterns(excludeUrls)
.order(-10);
}
/**
*
*/
public DataScopeInterceptor getHeaderInterceptor () {
return new DataScopeInterceptor();
}
}

View File

@ -0,0 +1,24 @@
package com.muyu.cloud.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName(value = "status")
public class Status {
/**
*
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
*
*/
private String name;
/**
*
*/
private Integer age;
}

View File

@ -1,8 +1,18 @@
package com.muyu.cloud.mapper; package com.muyu.cloud.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.muyu.cloud.domain.Status;
import com.muyu.common.core.constant.ScheduleConstants;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper @Mapper
public interface CloudMapper { public interface CloudMapper extends BaseMapper<Status> {
Object selSource(); Object selSource();
// List<Status> list();
<T> List<Status> list(QueryWrapper<T> tQueryWrapper);
} }

View File

@ -1,5 +1,11 @@
package com.muyu.cloud.service; package com.muyu.cloud.service;
import com.muyu.cloud.domain.Status;
import java.util.List;
public interface CloudService { public interface CloudService {
Object selSource(); Object selSource();
List<Status> list();
} }

View File

@ -1,10 +1,14 @@
package com.muyu.cloud.service.impl; package com.muyu.cloud.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.muyu.cloud.domain.Status;
import com.muyu.cloud.mapper.CloudMapper; import com.muyu.cloud.mapper.CloudMapper;
import com.muyu.cloud.service.CloudService; import com.muyu.cloud.service.CloudService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Service
public class CloudServiceImpl implements CloudService { public class CloudServiceImpl implements CloudService {
@Autowired @Autowired
@ -13,4 +17,9 @@ public class CloudServiceImpl implements CloudService {
public Object selSource() { public Object selSource() {
return cloudMapper.selSource(); return cloudMapper.selSource();
} }
@Override
public List<Status> list() {
return cloudMapper.list(new QueryWrapper<>());
}
} }

View File

@ -1 +1 @@
com.muyu.cloud.Client.ManyConfig com.muyu.cloud.datasource.interceptor.WebMvcConfig

View File

@ -6,6 +6,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selSource" resultType="java.lang.Object"> <select id="selSource" resultType="java.lang.Object">
select * from ry_goods select * from status
</select>
<select id="list" resultType="com.muyu.cloud.domain.Status">
select *
from status
</select> </select>
</mapper> </mapper>

View File

@ -218,6 +218,7 @@
<module>muyu-modules/muyu-goods-enterprise</module> <module>muyu-modules/muyu-goods-enterprise</module>
<module>muyu-modules/muyu-business</module> <module>muyu-modules/muyu-business</module>
<module>muyu-modules/muyu-moudels-many-datasource</module> <module>muyu-modules/muyu-moudels-many-datasource</module>
<module>muyu-modules/muyu-goods-enterprise/muyu-goods-enterprise-remote</module>
</modules> </modules>
<packaging>pom</packaging> <packaging>pom</packaging>