Spring Cloud(二):Spring Cloud Config

因为涉及到多个子工程,这种情况比较适合gradle担当构建工具。
配置build.gradle

buildscript {
   
    ext {
        springBootVersion = '2.0.3.RELEASE'
    }
    repositories {
          mavenLocal()
          maven {url 'http://maven.aliyun.com/nexus/content/groups/public/'}
          mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

//这个属性gradle 用来配置这个项目下所有子项目共同属性,根项目没有此属性
subprojects{
    apply plugin: "java"
    apply plugin: "eclipse"
    apply plugin: "io.spring.dependency-management"
    apply plugin: "org.springframework.boot"
    
    repositories {
     mavenLocal()
     maven {url 'http://maven.aliyun.com/nexus/content/groups/public/'}
     mavenCentral()
    }
    
    dependencyManagement {
        imports {
            mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:Finchley.RELEASE"
        }
    }
    
    dependencies {
    testImplementation 'junit:junit:4.12'
    compile('org.springframework.boot:spring-boot-starter-web')
    compile("org.springframework.boot:spring-boot-starter-actuator")
   // runtime('org.springframework.boot:spring-boot-devtools')
    testCompile('org.springframework.boot:spring-boot-starter-test')
   }
     
}
     //下面子项目配置
   //引入spring cloud config 依赖
   project(":config"){
     dependencies{
       compile('org.springframework.cloud:spring-cloud-starter-config')
       compile('org.springframework.cloud:spring-cloud-config-server')
     }
   }

setting.gradle 创建子工程

rootProject.name = 'cloud'
include  'config'

然后在在根项目创建子项目目录cloud 以及类路径目录 mkdir p src/main/{java,resources},运行gradle build,spring cloud config入门工程就算构建完成了。

创建本地文件的spring cloud 配置服务器

application.yml文件

server:
  port: 85
spring:
  profiles:
    active: native
  cloud:
    config:
      server:
        native:
          search-locations:
          - file:///H:/springconfig/

用过spring boot同学,差不多都知道配置什么意思,我就不具体去说明了。我想说明下spring cloud config 上配置信息 ,spring .profiles.active:natvie : 表示使用本地文件存储应用程序配置信息。spring.config.server.native.search-location 表示应用程序数据所在的文件路径,这个配置是一个数组,用-表示多个路径
创建spring cloud config引导类

@SpringBootApplication
@EnableConfigServer //成为spring cloud config server
public class ConfigCloudApplication {

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

在配置文件路径下创建多个yml文件

image.png

启动项目,使用浏览器访问http://localhost:85/config/default ,将会看到config.yml配置内容输出
config.yml

如果想查看application-dev.yml配置内容,可以访问http://localhost:85/application/dev

application-dev.yml

应用程序配置文件的命名约定“应用程序名-环境名称.yml” 用图3更加直观表示
图3.png

不单单是这些命名规则,实际上支持的很丰富的

[/{name}-{profiles}.yml || /{name}-{profiles}.yaml]
[/{name}/{profiles:.*[^-].*}]
[/{label}/{name}-{profiles}.yml || /{label}/{name}-{profiles}.yaml]
[/{name}/{profiles}/{label:.*}]
[/{name}-{profiles}.json]
[/{label}/{name}-{profiles}.properties]
[/{label}/{name}-{profiles}.json]
[/{name}/{profile}/**]
[/{name}/{profile}/{label}/**]
[/{name}/{profile}/{label}/**]
  • name 表示 应用名
  • profiles 表示环境名称
  • label 表示分支 一般都是连接git 使用
  • 支持各种各样的文件后缀 .yml、yaml、json、properties等等。

Spring Cloud Config与客户端集成

为了更加直观的,引入图4表示,项目的配置文件都从Spring Cloud Config中,使用http://{hostname}/文件名/环境名称 获取到配置文件,Config Server 根据url找到响应的文件,将数据源返回给config client。


图4.jpg
创建config client

文字很难直白清楚,直接上写代码最直观了。一个小demo,创建一个spring data jpa的工程,数据源从Spring Cloud Config获取,向外暴露一个接口,根据id查询数据,我们调用这个接口就知道数据有没有加载成功了。
引入依赖

project(":config-client"){
     dependencies{
       compile("org.springframework.cloud:spring-cloud-config-client")  
       compile("org.springframework.boot:spring-boot-starter-data-jpa")
       compile("mysql:mysql-connector-java:5.1.46")
     }
   }

创建实体

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    
    private String name;
    
    private String email;

创建Repository接口查询数据接口,直接继承CurdRepository

@Repository
public interface UserRepository extends CrudRepository<User, Integer> {

}

创建启动类

@SpringBootApplication
@RestController
@RefreshScope //自动刷新
public class ClientApplication {
    
    public static void main(String[] args) {
      SpringApplication.run(ClientApplication.class, args);
    }
    
    @Value("${str}")
    String str;
    
    @Autowired
    private UserRepository userRepository;
    
    @GetMapping("/user/{id}")
    public User index(@PathVariable Integer id) {
        return userRepository.findById(id).get();
    }
    
    @GetMapping("/str")
    public String str() {
        return str;
    }
    

编写配置文件,主要包括应用程序名称,应用程序profile和连接Spring Cloud Config服务的URI。我们在编写这些配置的文件时,会使用bootstrap.yml或不是application.yml,这是因为bootstrap.yml加载等级比application.yml高,并且属性不允许覆盖。
bootstrap.yml

server:
  port: 86
spring: 
  application:
    name: app
  cloud:
    config:
      profile: dev
      uri: http://localhost:85
management:
  endpoints:
    web:
      exposure:
        include: refresh

spring.application.name 告诉服务器你这个应用程序名称,Spring Cloud Config会找出对应的文件名。
spring.cloud.config.profile 指定应用程序运行环境文件
spring.coud.config.url: Spring Cloud Config物理路径
启动程序,打开浏览器访问 http://localhost:86/user/1 ,出现下图就说明成功了。

image.png

可以从日志中知道,读取了那个文件
image.png

现在有个问题了,如果我们修改了配置文件,client能否加载到最新的值呢?
我在配置文件中定义了一个str:aaa的值,有个一个/str的接口会直接返回这个值
image.png

如果我们到文件中修改配置文件,将改成str:bbbbb,在访问这个接口返回的数据是否会变吗?
多刷新几次后,发现根本不会变,这是因为Spring Boot应用程序只会在启动时读取他们的属性,因此Spring Cloud配置服务器中进行修改的属性不会被Spring Boot应用程序自动获取。如果你想修改配置后,又不想启动应用程序,可以在启动类上加上@RefreshScope注解,允许开发人员访问/refresh,这会让Spring Boot应用程序重新读取应用程序配置。使用浏览器访问http://localhost:86/actuator/refresh POST请求,这时再去访问/str就会发现文件自动变成修改后的值了。

连接git 文件存储

Spring Cloud Config不仅支持本地文件存储,也支持git远程存储。现在将配置文件存储到GitHub上,
image.png

修改配置,添加git url

server:
  port: 85
spring:
  #profiles:
   # active: native
  cloud:
    config:
      server:
        git:
          uri: https://github.com/xiaowu6666/websocket
          search-paths: src/main/resources    #相对目录,如果是根目录可以不写
          #username: 因为使用https 不使用账号,密码也可以clone成功 
          #password: 

使用浏览器访问http://localhost:85/app/dev

{
  "name": "app",
  "profiles": [
    "dev"
  ],
  "label": null,
  "version": "651047593f90acf2aeb1885e77b624ddfdd3f721",
  "state": null,
  "propertySources": [
    {
      "name": "https://github.com/xiaowu6666/websocket/src/main/resources/app-dev.yml",
      "source": {
        "spring.datasource.url": "jdbc:mysql://localhost/ting?useSSL=false&characterEncoding=utf8",
        "spring.datasource.username": "root",
        "spring.datasource.password": 123123,
        "spring.jpa.database": "mysql",
        "spring.jpa.show-sql": true,
        "spring.jpa.hibernate.ddl-auto": "update",
        "str": "aaa"
      }
    }
  ]
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343