公司有个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流程:
目录
2.给多数据源添加标识,并且保证按照标识可以取出对应的dataSource
一、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>