SrpingCloud config 分布式配置中心
分布式配置中心的作用:
当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现微服务中的所有系统的配置文件的统一管理,而且还可以实现当配置文件发生变化的时候,系统会自动更新获取新的配置。
将配置文件上传到git/SVN服务器然后通过 config server 与git/SVN服务器连接将配置文件信息拉到本地,其他服务直接从config server配置中心获取配置即可,这样只需要修改远端git/SVN里面的配置即可,如下图所示:
使用码云环境搭建git服务器端:https://gitee.com/
创建一个配置仓库: config-repo 通过 文件→新建文件(如果有现成的yml配置文件则选择上传即可)
这里以product.yml为例创建几个不同环境下的yml配置文件
product.yml里面的内容 :
#数据库配置 spring: application: name: products datasource: driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://127.0.0.1:3306/sell?useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: why123 druid: # 下面为连接池的补充设置,应用到上面所有数据源中 # 初始化大小,最小,最大 initial-size: 5 min-idle: 5 max-active: 20 # 配置获取连接等待超时的时间 max-wait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 time-between-eviction-runs-millis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 min-evictable-idle-time-millis: 300000 validation-query: SELECT 1 FROM DUAL test-while-idle: true test-on-borrow: false test-on-return: false # 打开PSCache,并且指定每个连接上PSCache的大小 pool-prepared-statements: true # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 max-pool-prepared-statement-per-connection-size: 20 filters: stat,wall use-global-data-source-stat: true # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 配置监控服务器 stat-view-servlet: login-username: admin login-password: 123456 reset-enable: false url-pattern: /druid/* # 添加IP白名单 #allow: # 添加IP黑名单,当白名单和黑名单重复时,黑名单优先级更高 #deny: web-stat-filter: # 添加过滤规则 url-pattern: /* # 忽略过滤格式 exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ env: product
数据源是基于druid的,其他几个配置文件内容就不一一贴出来了,可以复制以上配置多建几个配置文件
切回到开发工具(idea/eclipse)
pom.xml里面的配置:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>wanghy.com.cn</groupId>
<artifactId>config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config-server</name>
<description>project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
application.yml里面配置:
spring: application: name: config #配置远程配置中心 cloud: config: server: git: uri: https://gitee.com/xxx/config-repo username: 码云账号 password: 码云密码 basedir: Users/admin/basedir #本地仓库 从远端git仓库存入的本地地址 rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ server: port: 8011 # 允许/bus/refresh接口被外部调用 management: endpoints: web: exposure: include: "*"
在启动类中配置:
@SpringBootApplication @EnableDiscoveryClient @EnableConfigServer public class XXXConfigApplication { public static void main(String[] args) { SpringApplication.run(SellConfigApplication.class, args); } }
启动eureka服务注册中心后再启动(假设已经启动eureka server ) 可以看到它已经注册到eureka服务注册中心了
euraka服务注册中心: https://www.cnblogs.com/wanghy898/p/11167301.html
在idea里面可以看到已经将配置文件从远端git拉取到了本地
新建一个项目名字叫:sell-product,此时配置文件名称改为bootstrap.yml 而不是application.yml
bootstrap.yml 里面的内容为:
server:
port: 8083
#以下是从统一配置中心获取
spring:
application:
name: product
# 由于配置了公共配置 所以直接从公共配置中心拉取即可
cloud:
config:
discovery:
enabled: true
service-id: SELL-CONFIG #代表引用公共配置服务
profile: dev #此处生产环境也可以不用填写
# 配置rabbitmq的地址以及用户密码
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
#mybatis配置
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
config-location: classpath:mybatis/mybatis-config.xml
type-aliases-package: wanghy.com.cn.entity #对应实体类的路径
#日志相关
logging:
level:
org.springframework.cloud.netflix.openfeign: debug
wanghy.com.cn.mapper: DEBUG #打印sql信息
pom.xml里面的配置信息:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>wanghy.com.cn</groupId>
<artifactId>sell-product</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sell-product</name>
<description>product project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--<dependency>-->
<!--<groupId>org.mybatis.spring.boot</groupId>-->
<!--<artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--<version>2.0.1</version>-->
<!--</dependency>-->
<!--加了mybatis启动器会报错 也就是说与mybatis的启动器不能共存-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 分页插件 -->
<!--<dependency>-->
<!--<groupId>com.github.pagehelper</groupId>-->
<!--<artifactId>pagehelper-spring-boot-starter</artifactId>-->
<!--<version>1.2.10</version>-->
<!--</dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.14</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</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>
1.打开mysql新建一个数据库 sell 执行建表语句 随便插入几条数据
CREATE TABLE `product_info` (
`product_id` varchar(32) NOT NULL,
`product_name` varchar(64) NOT NULL COMMENT '商品名称',
`product_price` decimal(8,2) NOT NULL COMMENT '单价',
`product_stock` int(11) NOT NULL COMMENT '库存',
`product_description` varchar(64) DEFAULT NULL COMMENT '描述',
`product_icon` varchar(512) DEFAULT NULL COMMENT '小图',
`product_status` tinyint(3) DEFAULT '0' COMMENT '商品状态,0正常1下架',
`category_type` int(11) NOT NULL COMMENT '类目编号',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.新建controller、service.....进行测试,此处略
启动类配置:
@SpringBootApplication @EnableDiscoveryClient //和@EnableEurekaClient类似如果注册中心不是eureka则用它 consul或者zookeeper //@EnableEurekaClient //用于eureka注册中心 @MapperScan("wanghy.com.cn.mapper") public class SellProductApplication { public static void main(String[] args) { SpringApplication.run(SellProductApplication.class, args); } }
用postman请求: http://127.0.0.1:8083/user/userList 请求成功初步搭建完成
启动后如果修改了配置只需要通过调用bus/refresh接口即可(浏览器中输入http://192.168.1.65:8011/bus/refresh)
比如在码云仓库中将product-dev.yml配置文件中修改products改为product 后保存
spring:
application:
name: products #将products改为product
然后在浏览器中输入http://192.168.1.65:8011/bus/refresh 即可即时的将配置更改 返回idea中查看配置也即时的更新了
但是每次都需要手动的调用,那么需要通过将此接口配置到git的webhook就可以实现自动刷新配置,配置省略。