学习springCloud(十)之config配置中心

Zookeeper其实是实现过分布式的配置中心,springcloudconfig的核心作用其实就是在于对配置进行管理

虽然springcloud使用springboot进行开发,节省了大量的配置文件,但每个服务依然有自己的application.yml配置文件,而且每个服务一般都有负载均衡,所以,这么依赖对于配置文件的统一管理就非常有必要了。

在这里插入图片描述

上图是springcloudconfig总体结构图。
左边这一块我们很熟悉,最开始有个eureka,它通过配置文件application.yml启动,在这个配置文件里面会指定端口,实例名,注册地址等

对于服务提供商来说,它也需要把相关信息写到application.yml文件中,比如数据库配置,端口,项目名称等,其中最重要的就就是要指定eureka的具体位置

这是前面反复说过的,但现在是基于cloudConfig的配置中心,最开始启动eureka的时候,eureka的具体配置就不是写死在eureka的application.yml文件中了,这个时候也会有application.yml(bootstrap.yml)配置文件,只是这里的配置指定的时候config的配置中心,在eureka启动的时候读取【配置中心】的配置,并启动

对于服务提供商也是同样的道理,以产品服务为例,它的application.yml文件也不在指定具体的配置,真实需要访问的数据库,端口等信息也是在启动的时候直接从【配置中心】读取。

所以说config配置中心在其中占据非常重要的位置,但config里面的配置从哪来呢?其实是从git服务器里面来的,开发者需要把相关的配置上传到git服务器,这里的git服务器可以自己搭建,也可以直接用github,后面项目为了方便就直接使用github了。

配置中心的搭建

需要一个git服务地址,我这边用的我自己的github地址,里面添加了几个yml配置文件。有了git服务器之后,接下来就要准备配置中心了
【microcloud-config】 新建一个配置中心的服务提供模块,pom文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>enjoy</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>microcloud-config</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>enjoy</groupId>
            <artifactId>microcloud-security</artifactId>
        </dependency>
    </dependencies>

</project>

引入springcloudserver的同时,这分布式配置中心也不是谁都能访问的,所以增加了安全验证模块。
应该还记得这时候的用户名密码为:admin/enjoy

【microcloud-config】 新增application.yml配置文件,增加git连接配置信息

server:
  port: 7101

spring:
  application:
    name: microcloud-config
  cloud:
    config:
      server:
        git:
          uri: https://github.com/enjoyeud/microconfig.git

【microcloud-config】 新增启动类

package cn.enjoy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigApp {
    public static void main(String[] args) {
        SpringApplication.run(ConfigApp.class,args);
    }
}

这些工作准备完成后,为了测试【microcloud-config】是能正确运行的,还需要上传个配置文件到github
【GITHUB】 上传一个application.yml

spring:
   profiles:
      active:
      - dev
---
spring:
  profiles: dev
  application:
      name: microconfig-test-dev
---
spring:
 profiles: default
 application:
      name: microconfig-test-default

在这里插入图片描述
准备好配置文件后启动【microcloud-config】
在这里插入图片描述

简单的客户端

现在已经成功的搭建好了配置中心,但这个时候如果只通过url的访问形式其实没什么太多的意义,最终还是需要把github相关信息加载到客户端上进行访问
新增加一个【microcloud-config-client】模块,这模块讲读取github里面的信息,也不做其他的事情,只是显示一下。

新建【microcloud-config-client】,pom文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>enjoy</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>microcloud-config-client</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
    </dependencies>
</project>

【github】上传一个新的配置文件microcloud-config-client.yml,后面就通过程序来读取这个配置

spring:
   profiles:
      active:
        - dev
---
server:
  port: 8201

spring:
  profiles: dev
  application:
      name: microconfig-test-client

eureka:
 client:
  service-url:
    defaultZone: http://admin:enjoy@localhost:7001/eureka
---
server:
  port: 8102

spring:
  profiles: beta
  application:
      name: microconfig-test-client

eureka:
 client:
  service-url:
    defaultZone: http://admin:enjoy@localhost:7001/eureka

在这里插入图片描述
【microcloud-config-client】新建bootstrap.yml文件,这文件读取配置中心的配置

spring:
 cloud:
  config:
    name: microcloud-config-client # 定义要读取的资源文件的名称
    profile: dev # 定义profile的 名称
    label: master # 定义配置文件所在的分支
    uri: http://localhost:7101 # SpringCloudConfig的服务地址
    username: admin # 连接的用户名
    password: enjoy # 连接的密码

可能有些人奇怪,为什么不直接把相关信息写道application.yml文件之中,其实这是一种规范

  • “application.yml”:对应的是用户级的资源配置项;
  • “bootstrap.yml”:对应的是系统级的资源配置,其优先级更高

【microcloud-config-client】新建application.yml文件,这文件只是简单的配置一个应用名称

spring:
 application:
  name: microcloud-config-client # 编写应用的名称

【microcloud-config-client】新建一个controller,这个controller显示从服务器下载到的配置文件

package cn.enjoy.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConfigClientController {
    @Value("${spring.application.name}")
    private String applicationName;
    @Value("${eureka.client.serviceUrl.defaultZone}")
    private String eurekaServers; 
    @RequestMapping("/config")
    public String getConfig() {
        return "ApplicationName = " + this.applicationName + "、EurekaServers = "
                + this.eurekaServers;
    }
}

【microcloud-config-client】 新建一个启动类

package cn.enjoy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConfigClientApp {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApp.class,args);
    }
}

启动配置中心,访问,确认配置通过url是能正常访问的。
http://localhost:7101/microcloud-config-client-beta.yml

启动【microcloud-config-client】发现tomcat启动了,占用的端口就是dev的8201,访问
http://localhost:8201/config
这个时候简单的客户端已经搭建完成。

Eureka与服务提供方读取配置信息

有了上面这些基础,接下来就可以完成这个图的功能了,这里依然简化一下,只考虑product产品服务与eureka

eureka与product服务的配置信息要求去配置中心获取,所以在正式部署项目之前,先准备两个配置,上传到github之中
在这里插入图片描述
microcloud-config-eureka-client.yml,这个是eureka的配置文件,这里就没有考虑eureka的高可用了

spring:
  profiles:
    active:
      - dev
---
server:
 port: 7001
eureka:
  server:
    eviction-interval-timer-in-ms: 1000   #设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)
    enable-self-preservation: false #设置为false表示关闭保护模式
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
        defaultZone: http://admin:enjoy@localhost:7001/eureka
  instance: # eureak实例定义
    hostname: localhost # 定义 Eureka 实例所在的主机名称
spring:
  profiles: dev
  security:
    user:
      name: admin
      password: enjoy
  application:
    name: microcloud-config-eureka-client
---
server:
 port: 7002
eureka:
  server:
    eviction-interval-timer-in-ms: 1000   #设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)
    enable-self-preservation: false #设置为false表示关闭保护模式
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
        defaultZone: http://admin:enjoy@localhost:7002/eureka
  instance: # eureak实例定义
    hostname: localhost # 定义 Eureka 实例所在的主机名称
spring:
  profiles: beta
  security:
    user:
      name: admin
      password: enjoy
  application:
    name: microcloud-config-eureka-client

microcloud-config-product-client.yml,这个事对于产品服务这个服务提供商提供者的配置文件

spring:
  profiles:
    active:
      - dev
---
server:
 port: 8080
mybatis:
 mapper-locations: # 所有的mapper映射文件
 - classpath:mapping/*.xml
spring:
 datasource:
   type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型
   driver-class-name: com.mysql.jdbc.Driver # 配置MySQL的驱动程序类
   url: jdbc:mysql://localhost:3306/springcloud?serverTimezone=GMT%2B8 # 数据库连接地址
   username: root # 数据库用户名
   password: root1234% # 数据库连接密码
 application:
   name: microcloud-config-product-client
 profiles: dev

logging:
  level:
    cn.enjoy.mapper: debug

eureka:
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://admin:enjoy@localhost:7001/eureka
  instance:
    instance-id: microcloud-config-product-client
    prefer-ip-address: true
    lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
    lease-expiration-duration-in-seconds: 5  # 如果现在超过了5秒的间隔(默认是90秒)

info:
  app.name: microcloud-provider-product
  company.name: enjoy
  build.artifactId: $project.artifactId$
  build.modelVersion: $project.modelVersion$

management:
  endpoints:
    web:
      exposure:
        include: '*'
---
server:
 port: 8081
mybatis:
 mapper-locations: # 所有的mapper映射文件
 - classpath:mapping/*.xml
spring:
 datasource:
   type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型
   driver-class-name: com.mysql.jdbc.Driver # 配置MySQL的驱动程序类
   url: jdbc:mysql://localhost:3306/springcloud?serverTimezone=GMT%2B8 # 数据库连接地址
   username: root # 数据库用户名
   password: root1234% # 数据库连接密码
 application:
   name: microcloud-config-product-client
 profiles: beta

logging:
  level:
    cn.enjoy.mapper: debug

eureka:
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://admin:enjoy@localhost:7002/eureka
  instance:
    instance-id: microcloud-config-product-client
    prefer-ip-address: true
    lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
    lease-expiration-duration-in-seconds: 5  # 如果现在超过了5秒的间隔(默认是90秒)

info:
  app.name: microcloud-config-product-client
  company.name: enjoy
  build.artifactId: $project.artifactId$
  build.modelVersion: $project.modelVersion$

management:
  endpoints:
    web:
      exposure:
        include: '*'

有了这两个配置文件,接下来就可以搭建eureka服务和product服务了

Eureka配置

复制前面介绍的项目【springcloud-eureka】一份,修改成为【microcloud-config-eureka-client】,

【microcloud-config-eureka-client】 修改pom文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>enjoy</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>microcloud-config-eureka-client</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>

</project>

【microcloud-config-eureka-client】创建bootstrap.yml文件,读取配置中心eureka的配置

spring:
  cloud:
     config:
       uri:  http://localhost:7101
       name: microcloud-config-eureka-client
       profile:  beta
       label:  master
       username: admin
       password: enjoy

【microcloud-config-eureka-client】 修改application.yml,删除不需要的配置

spring:
  application:
    name: microcloud-config-eureka-client

由于使用的是beta,它里面指定的eureka的端口是7002
重启后访问:localhost:7002

服务提供方的配置

复制前面的项目【springcloud-provider-product】项目为【microcloud-config-product-client】

【microcloud-config-product-client】pom文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>enjoy</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <version>1.0.0</version>


    <artifactId>microcloud-config-product-client</artifactId>
    <dependencies>
        <dependency>
            <groupId>enjoy</groupId>
            <artifactId>microcloud-api</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>

        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-security</artifactId>-->
        <!--</dependency>-->
        <dependency>
            <groupId>enjoy</groupId>
            <artifactId>microcloud-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

    </dependencies>

</project>

【microcloud-config-product-client】新增bootstrap.yml 文件,配置如下

spring:
  cloud:
    config:
      uri:  http://localhost:7101
      name: microcloud-config-product-client
      profile:  beta
      label:  master
      username: admin
      password: enjoy

【microcloud-config-product-client】 修改application.yml文件

spring:
 application:
    name: microcloud-config-product-client

启动product服务,访问eureka,现在产品服务已经添加上去了。
在这里插入图片描述

Config配置中心高可用

现在不管是erueka还是服务提供者都是基于SpringCloudConfig获取配置文件的,这个时候配置中心就至关重要了,但在真实的项目环境中,难免SpringCloudConfig会出现各种问题,这个时候就需要考虑config的高可用机制了。

其实解决方式也很简单,把SpringCloudConfig注册到Eureka就搞定了,这个时候用户访问的时候不是直接从配置中心获取配置,而是通过eureka中获取配置中心的地址,再从配置中心获取具体服务的参数就行。

复制【springCloud-eureka】一份,修改成为【microcloud-ha-config-eureka】,这个eureka不注册具体的业务服务,只是负责config配置中心的负载均衡使用

【microcloud-ha-config-eureka】pom文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>enjoy</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>microcloud-ha-config-eureka</artifactId>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>
    
</project>

【microcloud-ha-config-eureka】 修改application.yml文件

server:
 port: 7301
eureka:
  server:
    eviction-interval-timer-in-ms: 1000   #设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)
    enable-self-preservation: false #设置为false表示关闭保护模式
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
        defaultZone: http://admin:enjoy@localhost:7301/eureka
  instance: # eureak实例定义
    hostname: localhost # 定义 Eureka 实例所在的主机名称
spring:
  security:
    user:
      name: admin
      password: enjoy
  application:
    name: microcloud-ha-config-eureka

启动类如下
package cn.enjoy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class HaConfigEurekaApp {
    public static void main(String[] args) {
        SpringApplication.run(HaConfigEurekaApp.class,args);
    }
}

【microcloud-config】再复制两份,总共3个配置中心,分别为【microcloud-config2】【microcloud-config3】

【microcloud-config】【microcloud-config2】【microcloud-config3】 修改pom文件
增加eureka的支持

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

【microcloud-config】【microcloud-config2】【microcloud-config3】修改application.yml文件,增加eureka的注册地址

server:
  port: 7101

spring:
  application:
    name: microcloud-config
  cloud:
    config:
      server:
        git:
          uri: https://github.com/enjoyeud/microconfig.git

eureka:
 client:
  service-url:
    defaultZone: http://admin:enjoy@localhost:7301/eureka
 instance:
  prefer-ip-address: true # 在地址栏上使用IP地址进行显示
  instance-id: microcloud-config1

启动eureka并启动三个配置中心后
在这里插入图片描述
【microcloud-config-client】 修改pom文件,增加eureka的支持

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>enjoy</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>microcloud-config-client</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
</project>

【microcloud-config-client】 修改bootstrap.yml文件,增加eureka相关配置

spring:
 cloud:
  config:
    name: microcloud-config-client # 定义要读取的资源文件的名称
    profile: dev # 定义profile的 名称
    label: master # 定义配置文件所在的分支
    #uri: http://localhost:7101 # SpringCloudConfig的服务地址
    username: admin # 连接的用户名
password: enjoy # 连接的密码
discovery:
      enabled: true   # 通过配置中心加载配置文件
      service-id: MICROCLOUD-CONFIG   # 在eureka之中注册的服务ID
    
eureka: 
 client: 
  service-url:
    defaultZone: http://admin:enjoy@localhost:7301/eureka

访问:http://localhost:8201/config

自动刷新

在整个SpringCloudConfig设计之中,我们已经实现了配置的统一管理,但其实还有一个问题,就是自动刷新。(还没有实现,接下来再继续学习)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值