spring cloud config+自动更新配置+多数据源druid+读写分离(类上自定义注解,通过AOP获取标识区分主从数据库)

本博客详细介绍了如何使用Spring Cloud Config搭建配置中心,结合AOP和自定义注解实现多数据源的读写分离。首先,创建config-server和config-client项目,配置git上的配置信息。接着,配置多数据源,包括DataSourceConfig,添加标识并设置默认数据源。然后,通过类上自定义注解进行读写分离,定义AOP切面,逻辑清晰。最后,提供了项目的源码链接,便于读者学习和交流。
摘要由CSDN通过智能技术生成

公司有个spring config的预想开发。(已经实现Spring Cloud Eureka),正好这段时间闲来无事,就先自己搭一个单独的config的demo(本例中没有整合Eureka,后面慢慢更新,因为它不是本次重点)。

项目是springboot的,maven管理,git上的数据库配置文件信息。

共有两个spring boot项目:

1. config-server(提供获取git上配置信息,并转成接口返回数据,供client端调用)

2. config-client (获取server端提供的配置信息--多数据源配置,利用 druid 手动set,通过自定义注解的标识在service层调用方法时自动区分读写库操作)

源码:https://github.com/LUNG18/demo

PS:网上之前搜了不少资料,也是同样的方式,但是基本都是自定义的注解用在方法上,通过aop,根据方法名的前缀来区分主从库的使用。但是我们公司目前的项目是:定义两个service接口--MasterService和SlaveService,其上有@DS注解,标识为master和slave来选择不同的数据库,就是本文标题说的 类上添加注解,区分数据库。为了不影响这种架构,才有了本次的demo。

但是我觉得aop切面表达式来匹配,进行读写分离应该是通常的做法

demo流程:

目录

一、spring cloud config项目搭建

1.config-server项目

2.config-client项目

二、多数据源配置

1.DataSourceConfig配置类

2.给多数据源添加标识,并且保证按照标识可以取出对应的dataSource

a.DatabaseContextHolder

b.根据标识把对应的数据源存放和获取,并且设置默认数据源

三、注解方式进行读写分离---类上添加自定义注解

1.自定义注解

2.AOP切面

3.读写分离逻辑

四、说明:


一、spring cloud config项目搭建

1.config-server项目

结构:

最基本的springboot项目,重点是pom.xml,application.yml和启动类 (我是使用的idea开发工具,其实就是新建一个spring boot项目,在新建过程中勾选server即可),如下图:

具体的pom.xml文件如下:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>config-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

需要说明的一点是:只是spring config的话,是静态的。所以集成了 spring-cloud-starter-bus-amqp,以便于当git上的配置文件变化时,不用重启服务就可以自动更新配置。说是自动更新,其实client端使用的话,还是要发一个post请求的:http://localhost:8888/actuator/bus-refresh (我的service端口时8888,最好是这个,似乎是spring config中有相关的配置要求吧)后面的路径是现在使用的这个版本的固定写法

application.yml文件如下:

server:
  port: 8888
spring:
  application:
    namme: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/LUNG18/spring-cloud
          searchPaths: helloworldConfig
management:
  endpoints:
    web:
      exposure:
        include: '*'

简单说下配置文件的说明:定义端口为8888,服务名为:config-server,请求的git路径和该路径仓库名,management节点下的配置是git上配置文件改变时可以动态获取的配置

我git上的内容如下:

最后是启动类,就是添加一个注解:  @EnableConfigServer ,如下图:

至此,server端已经构建完成,启动后通过url已经可以访问到git上的配置信息 : http://localhost:8888/visea-dev/master

PS: 更改git上的信息,不需要发送上面的post请求,就可以动态获取。那个请求是client端用的,发送后client端才能获取到变化后的信息

2.config-client项目

结构如下:

同样是新建一个springboot,勾选client选项。如下:

具体pom.xml如下:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-client</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LUNG108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值