首页 > 技术文章 > SrpingCloud config 分布式配置中心

wanghy898 2019-07-11 00:12 原文

分布式配置中心的作用:

当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,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就可以实现自动刷新配置,配置省略。 

推荐阅读