前言
在有些场景中需要使用到组合开发(系统一需要使用到系统二所提供的接口,但是系统一已经拥有自己的一套检验逻辑,并且系统二希望使用系统一中的用户进行权限检验),这时就。。。。卧槽!什么乱七八糟的,不知道该怎么讲。就说我现在的应用场景吧!
本公司把项目外包给乙放。然后一些重要的接口又不想要交给乙方完成,就有自己公司来提供接口,给乙方调用。且乙方项目中的用户进行权限校验。提供接口的程序并没有自己的用户。
当然仅仅作为参考,取之长嵌入到自己公司项目中去,取之短反馈给我,我这边及时改进。
事先准备
1.spring-boot 2.2.5.RELEASE
2.mysql数据库两台(一台记录用户操作,另一台负责连接用户表,获取相关用户信息)
实现步骤
一、新建spring boot项目,并引入依赖
在pom文件中引入所需要的依赖包
<!-- 添加Web依赖(servlet) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入lombak插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox.swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox.swagger2.version}</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6</version>
</dependency>
<!--使用 Spring Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- mysql 链接依赖包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- JWT算法 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
<!-- JSON 转换 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
二、配置多数据源
配置多个数据源(这里因为一个数据源要存储数据,另一个数据源为了获取其他应用的用户信息)。该多数据源方案仅供参考。
1.修改配置文件
spring:
application:
name: yqzl
datasource:
yqzl:
pool: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: XXXXXX
jdbc-url: jdbc:mysql://192.168.1.1:3306/XXX?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
user:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: XXXXXX
jdbc-url: jdbc:mysql://192.168.1.2:3306/XXX?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
jpa:
hibernate:
ddl-auto: update
show-sql: false
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
open-in-view: false
2.创建切换数据源注解
@Target({
ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CurDataSource {
String value() default "";
}
3.创建数据源类,读取配置文件中配置的数据源
@Component
@Data
@ConfigurationProperties(prefix ="spring.datasource")
@EnableConfigurationProperties
public class DBproperties {
private HikariDataSource yqzl;
private HikariDataSource user;
}
3.创建DynamicDataSource类扩展Spring的AbstractRoutingDataSource抽象类,重写 determineCurrentLookupKey() 方法
/**
* DynamicDataSource扩展Spring的AbstractRoutingDataSource抽象类,重写 determineCurrentLookupKey() 方法
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
/**
* ThreadLocal 用于提供线程局部变量,在多线程环境可以保证各个线程里的变量独立于其它线程里的变量。
* 也就是说 ThreadLocal 可以为每个线程创建一个【单独的变量副本】,相当于线程的 private static 类型变量。
*/