SpringCloud全家桶 (第五期:Config配置中心)

一: 什么是SpringCloud

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.

翻译如下

Spring Cloud为开发人员提供了快速构建分布式系统中的一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式会话、集群状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和云计算等托管平台。

SpringCloud主要框架

二:Config配置中心

随着项目的越来越大,我们发现微服务中的配置信息及其繁杂,每一个微服务都有三个配置文件(devtestpro),管控起来比较麻烦,分布于各个微服务中,不便维护。SpringCloud就为此引出了SpringCloud Config,用来统一管理配置信息

SpringCloud Config提供了gitsvn本地等方式。本文就主要git方式的配置本地方式的配置,至于svn配置方式用的不多,后面再补充。。。

三:三种配置方式

  • git : config 默认Git加载

    通过spring.cloud.config.server.git.uri指定配置信息存储的git地址,比如:https://github.com/xxx/config

  • local本地配置

    spring.profiles.active=native
    spring.cloud.config.server.native.search-locations=classpath:/config

    spring.profiles.active=native
    spring.cloud.config.server.native.search-locations=file:E:\Java\config

  • svn

    spring.cloud.config.server.svn.uri=http://localhost:8080/store/trunk
    spring.cloud.config.server.svn.username=xxx
    spring.cloud.config.server.svn.password=xxx
    spring.profiles.active=subversion #svn
    default-label: trunk #默认SVN分支

四:准备工作

  • 远程配置文件 :我就放在git中了
  • eureka :注册中心
  • config-server :配置中心服务端
  • config-client :配置中心客户端

五:搭建Config

1.1 在码云或者github上创建个Repository,我就以github为例了,创建一个config-demo仓库,创建springcloud-config-dev.yml配置,配置内容如下:

config: I am a config

2.1 创建eureka项目,(eureka的创建就不多讲了,不会的同学翻下第一期)引入一下依赖

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

2.2 在启动类上加上注解@EnableEurekaServer

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

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

}

3.1 创建config-server项目,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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.take</groupId>
    <artifactId>config-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.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-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </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>

</project>

注意要有spring-cloud-config-server的依赖,至于为什么把spring-cloud-starter-netflix-eureka-client引入,因为后面要搭建config-server集群,注册到eureka注册中心上,实现高可用。否则一旦config-server这个微服务宕机了,会影响其它所有的微服务。

3.2 在启动类上添加注解@EnableConfigServer,用来启用config-server

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

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient 
public class ConfigServerApplication {

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

}

3.3 创建bootstrap.yml,加入以下配置。

server:
  port: 8762
spring:
  application:
    name: config-server    #微服务名称

  cloud:
    config:
      server:
        git:
          uri: https://github.com/ml0206/config-demo.git  #git远程仓库的地址
          search-paths: config-demo  #git远程仓库的名称,扫描该仓库下的文件

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/   #指定注册中心

3.4 启动eureka,再启动config-server,访问:http://localhost:8762/springcloud-config/dev

在这里插入图片描述
调用成功,说明config-server配置成功
当然你也可以直接访问该配置:http://localhost:8762/springcloud-config-dev.yml
仓库中的配置文件会被转换成web接口,访问可以参照以下的规则

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

springcloud-config-dev.yml为例,它的applicationspringcloud-configprofiledevlabel分支的意思,如果只有一个主分支,可以不写,默认会访问master分支,client会根据填写的参数来选择读取对应的配置。

4.1 创建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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.take</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>Hoxton.SR1</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-starter-config</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-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </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>

</project>

注意引入spring-cloud-starter-config依赖

4.2 启动类不需要修改,创建bootstrap.yml,加入以下配置,两种配置均可。

4.2.1 uri指定配置中心地址

server:
  port: 8010

spring:
  application:
    name: config-client

  cloud:
    config:
      uri: http://localhost:8762/   #指定配置中心地址,如果配置中心注册在eureka上了,可以直接通过discovery.service-id获取配置中心
      profile: dev  #远程配置文件的环境 例如:springcloud-config-dev.yml,即dev
      name: springcloud-config  #远程配置文件的前缀  例如:springcloud-config-dev.yml,前缀就是springcloud-config
      fail-fast: true # 快速失败,优先保证config-server服务正常

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

4.2.2 discovery

server:
  port: 8010

spring:
  application:
    name: config-client

  cloud:
    config:
#      uri: http://localhost:8762/   #指定配置中心地址,如果配置中心注册在eureka上了,可以直接通过discovery.service-id获取配置中心
      discovery:
        enabled: true  # 开启服务发现
        service-id: config-server  #配置中心的微服务名称
      profile: dev  #远程配置文件的环境 例如:springcloud-config-dev.yml,即dev
      name: springcloud-config  #远程配置文件的前缀  例如:springcloud-config-dev.yml,前缀就是springcloud-config
      fail-fast: true # 快速失败,优先保证config-server服务正常

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

如果config-server服务注册在eureka中,可以用discovery方式

4.3 创建controller包,包下创建configController

package com.take.configclient.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class ConfigController {

    @Value("${config}")
    private String config;

    @RequestMapping("config")
    public String config(){
        return this.config;
    }

}

4.4 启动config-client,访问:http://localhost:8010/config
在这里插入图片描述
5.1 如果这时候把gitspringcloud-config-dev.yml中的配置I am a config修改成I am a config 222,获取的还是I am a config就不能获取最新配置了,因为config-client只在启动时获取一次。springcloud已经给我们提供了解决方案,每个客户端通过POST方法触发各自的/refresh

修改config-client项目已到达可以refresh的功能。

5.2 在config-client中添加新的依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

增加了spring-boot-starter-actuator包,spring-boot-starter-actuator是一套监控的功能,可以监控程序在运行时状态,其中就包括/refresh的功能。

5.3 开启更新机制

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RefreshScope  // 使用该注解的类,会在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。
public class ConfigController {

    @Value("${config}")
    private String config;

    @RequestMapping("config")
    public String config(){
        return this.config;
    }

}

5.4 修改bootstrap.yml,加入以下配置

server:
  port: 8010

spring:
  application:
    name: config-client

  cloud:
    config:
#      uri: http://localhost:8762/   #指定配置中心地址,如果配置中心注册在eureka上了,可以直接通过discovery.service-id获取配置中心
      discovery:
        enabled: true  # 开启服务发现
        service-id: config-server  #配置中心的微服务名称
      fail-fast: true
      profile: dev  #远程配置文件的环境 例如:springcloud-config-dev.yml,即dev
      name: springcloud-config  #远程配置文件的前缀  例如:springcloud-config-dev.yml,前缀就是springcloud-config

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/



management:
  security:
  enabled: false
  endpoints:
    web:
      exposure:
        include: "*"

management.security.enabled: springboot 1.5.X 以上默认开通了安全认证,所以需要添加这个配置
management.endpoints.web.exposure.include: springboot 2.x 默认只开启了info、health的访问,*代表开启所有访问

5.5 再次修改springcloud-config-dev.yml为I am a config 333,通过cmd命令行执行:curl -X POST http://localhost:8010/actuator/refresh,可以看到命令行上有显示:["config.client.version","config"]
在这里插入图片描述意味着config这个配置已经刷新,这时,我们再去刷新一下页面,可以看到,页面上得到的信息已经变为了:I am a config 333,这时我们refresh成功。

6.1 本地配置方式

修改config-server中的bootstrap.yml

server:
  port: 8762

spring:
  profiles:
    active: native #本地配置(默认是git,可以设置:subversion(SVN),native(本地))
  application:
    name: config-server
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/share
        bootstrap: true

eureka:
  client:
    service-url:
      defaultzone: http://localhost:8761/eureka

profiles.active=native 本地读取配置
search-locations: classpath:/share 扫描share文件夹,会从这个文件夹中读取配置

6.2 在resources中创建share文件夹,并创建config-client-dev.yml,内容如下:
在这里插入图片描述

word: Hello World

6.3 修改config-clientbootstrap.yml如下:

server:
  port: 8010

spring:
  application:
    name: config-client

  cloud:
    config:
#      uri: http://localhost:8762/   #指定配置中心地址,如果配置中心注册在eureka上了,可以直接通过discovery.service-id获取配置中心
      discovery:
        enabled: true  # 开启服务发现
        service-id: config-server  #配置中心的微服务名称
      fail-fast: true
      profile: dev  #远程配置文件的环境 例如:springcloud-config-dev.yml,即dev
      name: config-client  #远程配置文件的前缀  例如:springcloud-config-dev.yml,前缀就是springcloud-config

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/



management:
  security:
  enabled: false
  endpoints:
    web:
      exposure:
        include: "*"

只需要修改profilename,此处远程配置文件为config-client-dev.ymlname就是confit-clientprofile就是dev

6.4 分别启动config-serverconfig-client。访问:http://localhost:8010/config在这里插入图片描述
说明config-client已经获取到config-server中的config-client-dev.yml配置信息了

7.1 svn配置方式,需要在config-server加入svn依赖,这种方式用的不多,有兴趣的朋友,可以配置,只需要改config-server中的yml配置,配置信息已经在上方列出来了

 <dependency>
    <groupId>org.tmatesoft.svnkit</groupId>
    <artifactId>svnkit</artifactId>
</dependency>

六:集群

配置完成后,基本上没有多大问题了。但是对于大型的微服务项目来说,有几十个甚至几百个微服务,那么每个微服务都会依赖配置中心config-server,一旦config-server宕机,将会影响所有的微服务,甚是可怕。那我们就要搭建配置中心集群、多节点。搭建起来也比较简单,直接把config-server项目,复制一份,改个端口,微服务名称不要改(spring.application.name)。重新依次启动eurekaconfig-serverconfig-server(复制版)config-client,当config-server微服务挂掉,我们还有config-server(复制版),从而实现高可用

七:项目实例

springcloud-config-demo项目地址

参考链接:
https://www.cnblogs.com/zuowj/p/10432445.html#s-1.3
https://www.cnblogs.com/babycomeon/p/11134717.html
https://www.cnblogs.com/babycomeon/p/11135926.html

开心一刻

今天我那个90后的表弟问我:“大哥,我遇到一个很大的难题,你比我年长十几岁,以你过来人的经验帮我解答解答呗。”
我大手一挥:“没问题!”
表弟想了想:“我被我妈逼婚了,可我不想这么早结婚,你是如何做到这么大了还是一个人的呢?”
我呡了一口茶,然后猛地啐他一脸,愤怒地说:“你给我滚!”
在这里插入图片描述

如果觉得不错,帮忙点个赞,您的点赞将是我的动力!

上一篇:Zuul网关之ZuulFilter过滤器
下一篇:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值