Git版本控制+配置中心(Spring Cloud Config)+STS(八)

1.1         Git版本控制

1.1.1      版本控制

版本控制(Version Control System

记录文件的所有历史变化

错误恢复到某个历史版本

多人协作开发编辑同一个文件

1.1.2      主流的版本控制产品

名称

模型

并发模式

历史模式

变更范围

网络协议

原子提交性

扫描二维码关注公众号,回复: 5134937 查看本文章

CVS

Client-Server

Merge

Changeset

File

Pserver,ssh

No

SVN

Client-Server

3-way merge, recursive merge, octopus merge  

Changeset and Snapshot

Tree

custom (svn), custom (svn) over ssh, HTTP and SSL (usingWebDAV)

Yes

Git

Distributed

Merge or lock

Snapshot

Tree

custom, custom over ssh, rsync, HTTP/HTTPS, email, bundles

Yes

* 版本库模型(Repository model:描述了多个源码版本库副本间的关系,有C/S(客户端/服务器)模式和分布式两种模式。在客户端/服务器模式下,每一用户通过客户端访问位于服务器的主版本库,每一客户机只需保存它所关注的文件副本,对当前工作副本(working copy)的更改只有在提交到服务器之后,其它用户才能看到对应文件的修改。而在分布式模式下,这些源码版本库副本间是对等的实体,用户的机器除了保存他们的工作副本外,还拥有本地版本库的历史信息。

* 并发模式(Concurrency model:描述了当同时对同一工作副本/文件进行更改或编辑时,如何管理这种冲突以避免产生无意义的数据,有排它锁和合并模式。在排它锁模式下,只有发出请求并获得当前文件排它锁的用户才能对对该文件进行更改。而在合并模式下,用户可以随意编辑或更改文件,但可能随时会被通知存在冲突(两个或多个用户同时编辑同一文件),于是版本控制工具或用户需要合并更改以解决这种冲突。因此,几乎所有的分布式版本控制软件采用合并方式解决并发冲突。

* 历史模式(History model):描述了如何在版本库中存贮文件的更改信息,有快照和改变集两种模式。在快照模式下,版本库会分别存储更改发生前后的工作副本;而在改变集模式下,版本库除了保存更改发生前的工作副本外,只保存更改发生后的改变信息。

* 变更范围(Scope of change):描述了版本编号是针对单个文件还是整个目录树。

* 网络协议(Network protocols):描述了多个版本库间进行同步时采用的网络协议。

* 原子提交性(Atomic commit):描述了在提交更改时,能否保证所有更改要么全部提交或合并,要么不会发生任何改变。

简而言之,各有优缺点,git要配合hub,可以避免分布式损坏。svn有权限控制,避免全被clone走。git适合纯代码,svn适合综合性文档管理,结合起来就完美。显然最大的不同在于git是分布式的。

1.1.3      介绍

Linus1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。Linus虽然创建了Linux的核心,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVSSVN这些免费的版本控制系统吗?因为Linus坚定地反对CVSSVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVSSVN好用,但那是付费的,和Linux的开源精神不符。不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeperBitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发SambaAndrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。

Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQueryPHPRuby等等。历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。

1.1.4      组成结构

工作区:用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。

暂存区:保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。有时候也被称作“索引”,不过一般说法还是叫暂存区域。

版本库:也叫本地版本库,之所以说git 快,大部分提交都是对本地仓库而言的,不依赖网络,最后一次会推送的到远程仓库。

远程仓库:可以看做是github,它是一个远程仓库,它提供web服务供大家方便下载、查看、提交、存储。

1.1.5      文件的状态

新建文件状态为untrackedadd命令执行后状态变为staged,已存在的文件状态为unmodified,修改文件内容,文件状态变为modifiedcommit提交,文件状态编程unmodifed

1.1.6      命令速查

1.1.7      Git的主要任务

克隆仓库                                      clone        克隆

对工作目录中文件新增、修改、删除操作

暂存文件,将文件的快照放入暂存区              add          新增

把暂存区的内容提交到本地仓库                  commit       提交

把本地仓库的内容提交到远程仓库                    push    推送

从远程仓库下载最新内容                            pull    拉取

1.2         配置环境

1.2.1      注册账号

每个人必须有自己的账号,先官网注册账号:https://github.com

用户名: nutony,密码:Tony123-

1.2.2      安装GIT

Git-2.12.0-64-bit.exe,一路next,安装完桌面右键菜单有下面两项,安装完成。选择Git Bash,进入git客户端。

Windows开始菜单:

1.2.3      配置身份信息

提交文件时,就知道这个文件是谁提交的。出了问题,就知道谁干的!

1.2.4      查看配置信息

1.2.5      创建本地仓库

Administrator@tonythink MINGW64 ~/Desktop

$ cd d:                                       #进入d

Administrator@tonythink MINGW64 /d

$ cd java

$ cd env            

$ mkdir git_repository                    #创建目录

$ cd git_repository                       #进入目录

1.3         远程命令github

1.3.1      创建远程仓库

登录:https://github.com git上新建一个仓库

仓库名为stu,拥有者为:nutony

创建成功

1.3.2      进入本地仓库

Administrator@tonythink MINGW64 ~/Desktop

$ cd d:                                       #进入d

Administrator@tonythink MINGW64 /d

$ cd java               

$ cd env            

$ cd git_repository                       #进入目录

1.3.3      克隆远程仓库

首次需要把远程仓库克隆到本地仓库(D:\javaenv\git_repository

$ git clone https://github.com/nutony/stu.git

本地仓库目录中就多了stu目录

1.3.4      手工创建新文件

进入子仓库,手动创建文件,文件内容不能为空。

1.3.5      初始化仓库

$ cd stu                                  #创建本地仓库

$ git init                                    #创建本地仓库

Administrator@tonythink MINGW64 /d/javaenv/git_repository (master)

当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。如果你没有看到.git目录,是因为默认这个目录是隐藏的,要显示修改其显示隐藏文件即可,一般无需修改。

1.3.6      推送到远程主机

$ git add .                               #添加当前目录下文件

$ git commit -m "jttest"                  #提交,设置备注

1.3.7      关联本地目录到远程仓库

可以克隆仓库也可以关联本地仓库

运行 git remote add [shortname] [url]

git remote add stu git://github.com/nutony/stu

1.3.8      推送更新到远程仓库

$ git push origin master     #推送到远程仓库master默认分支,第一次需要登录,比较慢,弹出登录框输入用户名和密码。

 

 

刷新网页变成目录的页面,可以看到文件也已经上传

点击文件可以查看其内容

1.4         每日任务

每日早上开始工作前拉取最新团队其他人提交的内容,每日下班前提交可用的内容

1.4.1      检出

$ git checkout .                  #进入某个仓库检出当前仓库所有文件

$ git checkout hello.txt          #检出远程仓库最后的版本覆盖本地文件

1.4.2      拉取

$ cd stu                                      #进入到要管理的目录中

$ git pull                                        #从服务器拉取最新内容

1.4.3      新文件

1.4.4      推送到远程主机

$ git add .                               #添加当前目录下文件

$ git commit -m "jttest"                  #提交,设置备注

$ git push origin master                  #推送到远程仓库

1.5         拓展:基础命令

1.5.1      提交文件

创建hi.txt

$ git add hi.txt                      #增加文件到暂存区

$ git add ./*                             #批量暂存当前目录下所有内容

$ git status                          #查看文件状态

$ git commit -m "test"                #提交,提交文件到本地仓库

[master (root-commit) e522732] test

 1 file changed, 1 insertion(+)

 create mode 100644 hi.txt

$ git status                          #查看文件状态

1.5.2      查看提交记录

$ git log

commit e522732d94c440fdd750368ce937ac1c40dbd2ed   #本次提交唯一标识,对于版本回退非常有用

Author: nutony <[email protected]>

Date:   Fri Jun 2 09:39:31 2017 +0800

    test

1.5.3      删除文件

$ rm *.jpg                                #删除所有jpg结尾,删除本地文件

$ ll

$ git add .

$ git commit -m 'rm'

$ git push origin master

1.5.4      比较当前文件和仓库文件

修改hi.txt文件内容,然后和仓库中已经提交的hi.txt比较

$ git diff hi.txt

diff --git a/hi.txt b/hi.txt

index 32f95c0..d7d0f3f 100644

--- a/hi.txt

+++ b/hi.txt

@@ -1 +1 @@

-hi

\ No newline at end of file

+<B1>Ƚϵ<B1>ǰ<CE>ļ<FE><BA>Ͳֿ<E2><CE>ļ<FE>  #中文乱码

\ No newline at end of file

Administrator@tonythink MINGW64 /d/javaenv/git_repository (master)

$ git diff hi.txt

diff --git a/hi.txt b/hi.txt

index 32f95c0..2b80830 100644

--- a/hi.txt

+++ b/hi.txt

@@ -1 +1 @@

-hi

\ No newline at end of file

+<U+FEFF>比较当前文件和仓库文件                   #文件格式改为UTF-8即可

\ No newline at end of file

1.5.5      addcommit的区别

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

git的文件状态,文件新建完状态为untracked

1.5.6      删除仓库

点击进入仓库,选择Settings配置,移到页面最下方,点击删除按钮,需确认。输入仓库名称,然后删除即可。

 

1.6         拓展:代码冲突

1.6.1      查看历史版本

$ git log

$ git log --stat #记录我们可以看到每一次commit,都有哪些文件发生了改变

$ git show 8ef96 #查询某次具体的修改

1.6.2      回滚

发现提交的内容错了,可以进行回滚操作。

$ vi a.txt                                #修改文件内容

$ git add a.txt

$ git commit –m 'a.txt'

$ git log                                 #查看日志

commit 8ef960a0bfa137a0fadd7494823d5d1c101c427d

Author: nutony <[email protected]>

Date:   Sat Jun 3 09:13:32 2017 +0800

    a.txt

commit 315e77e5cceb486a9bf63911cb8d3549a19b8255

Author: nutony <[email protected]>

Date:   Sat Jun 3 09:07:43 2017 +0800

    Delete 31.jpg

$ git revert 8ef960a                  #日志的commitId的前几位即可

1.6.3      远程仓库覆盖本地

$ vi a.txt                                #创建a.txt,设置内容为haha 1

$ git add .                           #暂存

$ git commit -m '1'                   #提交

$ git pull origin master              #推送,此时查看githuba.txt存在

$ vi a.txt                                #编辑本地文件a.txt,修改内容haha 2

$ git fetch --all                         #只是下载代码到本地,不进行合并操作

$ git reset --hard origin/master      #HEAD指向最新的下载版本

$ ll

$ cat a.txt                           #可以看到文件还是为1,被远程覆盖

1.6.4      解决冲突绝招

如果冲突,自己修改的文件自己知道,则把修改的文件复制到其它目录,然后强制用远程覆盖本地文件,然后把修改的文件考回来覆盖。这样的好处是多人修改后,多个文件,修改起来太复杂。这样的方式非常方便高效。

1.7         TortoiseGit

 

1.7.1      图标管理

TortoiseGit提供了一组丰富的小图标来管理Git文件的状态,让开发者一目了然文件的情况,非常方便。

1.7.2      安装

TortoiseGit-1.8.14.0_64bit.1436148947.msi

安装完成会自动获取登录的配置信息,同时在增加操作到右键菜单上。

1.7.3      拉取 pull

1.7.4      添加 add

先创建好文件,然后右键选择add命令。可以批量选择。

1.7.5      提交 commit

1.7.6      推送 push

 

1.8         拓展:设置免密

1.8.1      避免填写用户名和密码

1.8.2      创建文件存储GIT用户名和密码

%HOME%目录中,一般为C:\users\Administrator,也可以是你自己创建的系统用户名目录,反正都在C:\users\中。文件名为.git-credentials,由于在Window中不允许直接创建以"."开头的文件,所以需要借助git bash进行,打开git bash客户端,进行%HOME%目录,然后用touch创建文件 .git-credentials, vim编辑此文件。

右键打开git bash客户端

cd c:\Users\tony                                  #进入当前用户目录

touch .git-credentials                            #创建文件

vim .git-credentials                              #编辑文件

https://{username}:{password}@github.com          #填写内容

1.8.3      添加Git Config 内容

git config --global credential.helper store

1.8.4      测试

这样以后push推送时只只需第一次填写用户名密码,后期就可以直接推送

 

1.9     配置中心Config

1.9.1      为什么需要使用配置中心来统一管理配置呢?

通常在一个分布式环境中,同类型的、不同类型的服务有几个,几十个服务实例。如果出现数据源、接口等变更时,程序员通过手工修改配置就可以了。但对于分布式环境中多达上千、上万的服务实例来说,单单修改配置这项目工作就会耗费程序员很多时间和精力。所以为了更好的解决分布式环境下多台服务实例的配置统一管理问题,引入了统一配置管理的方式来解决这类难题。

1.9.2      介绍

开发分布式系统如果还是各个服务配置文件单独配置肯定是不行的,springcloud使用的解决方案是搭建配置中心将并指定一个配置文件路径如git项目对配置文件进行统一管理。

Spring Cloud中,提供了分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在实现cloud config中,主要有两个角色:作为配置中心连接配置路径的 config server,连接配置中心读取配置的config client

1.10 使用STS创建SpringBoot项目

1.10.1    STS

基于eclipseSpring增强对SpringCloud项目开发的支持,原生eclipse支持不够好。

1.10.2    下载STS

官网:https://spring.io/tools/sts/all/

1.10.3    创建SpringBoot项目

1.10.4    常用的依赖jar

 

 

1.10.5    运行启动类

Java Application的差异时,SpringBootApp启动后日志为彩色,更易观看。

1.11 配置中心服务端

1.11.1    创建Spring Starter Project工程

1.11.2    pom.xml

<?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">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tedu</groupId>

    <artifactId>config-server</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <packaging>jar</packaging>

    <name>config-server</name>

    <description>Demo project for Spring Boot</description>

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>1.5.15.RELEASE</version>

        <relativePath/> <!-- lookup parent from repository -->

    </parent>

    <properties>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <java.version>1.8</java.version>

        <spring-cloud.version>Edgware.SR4</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-eureka</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>

    <build>

        <plugins>

             <plugin>

                <groupId>org.springframework.boot</groupId>

                 <artifactId>spring-boot-maven-plugin</artifactId>

             </plugin>

        </plugins>

    </build>

</project>

1.11.3    application.properties

server.port=7010

spring.application.name=config-server

# 配置git仓库地址

spring.cloud.config.server.git.uri=https://github.com/nutony/myspringcloudconfig

# 配置仓库的分支

spring.cloud.config.label=master

# 访问git仓库的用户名

spring.cloud.config.server.git.username=nutony

# 访问git仓库的用户密码 如果Git仓库为公开仓库,可以不填写用户名和密码,如果是私有仓库需要填写

spring.cloud.config.server.git.password=Tony123-

eureka.client.service-url.defaultZone=http://user:password123@localhost:8761/eureka

1.11.4    拓展:从git上获取资源的格式

/{application}/{profile}[/{label}]

/{application}-{profile}.yml

/{label}/{application}-{profile}.yml

/{application}-{profile}.properties

/{label}/{application}-{profile}.properties

application: 表示应用名称,在client中通过spring.config.name配置

profile:     表示获取指定环境下配置,例如开发环境、测试环境、生产环境 默认值default,实际开发中可以是 devtestdemoproduction

label:           git标签,默认值master

访问链接:

http://localhost:7010/jtver/dev

http://localhost:7010/foo/default

http://localhost:7010/foo/development

1.11.5    Git上传属性文件

创建仓库myspringcloudconfig,上传属性文件config-client-dev.properties编写内容为:jtver=jt version 4.1

1.11.6    ConfigServerApplication

package com.tedu;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication

@EnableConfigServer

public class ConfigServerApplication {

    public static void main(String[] args) {

        SpringApplication.run(ConfigServerApplication.class, args);

    }

}

1.11.7    测试

http://localhost:7010/config-client/dev

1.12 配置中心客户端

1.12.1    创建Maven工程

1.12.2    pom.xml

注意:必须加spring-boot-starter-actuator依赖,否则post请求是报404错误。

<?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">

    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.jt</groupId>

    <artifactId>config-client</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <packaging>jar</packaging>

    <name>config-client</name>

    <description>Demo project for Spring Boot</description>

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>1.5.16.RELEASE</version>

        <relativePath /> <!-- lookup parent from repository -->

    </parent>

    <properties>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <java.version>1.8</java.version>

        <spring-cloud.version>Edgware.SR4</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-eureka</artifactId>

        </dependency>

        <dependency>

             <groupId>org.springframework.boot</groupId>

             <artifactId>spring-boot-starter-actuator</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>

    <build>

        <plugins>

             <plugin>

                 <groupId>org.springframework.boot</groupId>

                 <artifactId>spring-boot-maven-plugin</artifactId>

             </plugin>

        </plugins>

    </build>

</project>

1.12.3    拓展:bootstrapapplication加载顺序

Spring Boot有两种类型的配置文件,applicationbootstrap文件。Spring Boot会自动加载classpath目前下的这两个文件,文件格式为properties或者yml格式。

*.properties格式             key=value的形式

*.yml格式                        key: value的形式,支持树形或者链式结构

*.yml加载的属性是有顺序的

application配置文件是应用级别的,是当前应用的配置文件。

bootstrap配置文件是系统级别的,用来加载外部配置,如配置中心的配置信息,也可以用来定义系统不会变化的属性。

bootstatp文件的加载先于application文件。

1.12.4    bootstrap.properties

注意:说明:此处不能用application.properties,因为代码中使用@Value注解,必须在应用程序执行之前初始化。

spring.application.name=config-client

spring.cloud.config.label=master

spring.cloud.config.profile=dev

#配置中心服务端地址

spring.cloud.config.uri= http://localhost:7010/

server.port=7020

eureka.client.service-url.defaultZone=http://user:password123@localhost:8761/eureka

1.12.5    HelloController

package com.tedu.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 HelloController {

    @Value("${jtver}")

    String jtver;

    @RequestMapping(value = "/hello")

    public String hello () {

        return jtver;

    }

}

1.12.6    ConfigClientRunApp

package com.tedu;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class ConfigClientApplication {

    public static void main(String[] args) {

        SpringApplication.run(ConfigClientApplication.class, args);

    }

}

1.12.7    测试

1.13 动态刷新配置

1.13.1    解决方案

Controller类上增加@RefreshScope注解,在bootstrap.properties文件中配置management.security.enabled=false,提交post刷新请求,http://localhost:7020/refresh 就会更新属性值(底层实现要求必须是post请求)。

1.13.2    HelloController

package com.tedu.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

@RefreshScope

public class HelloController {

    @Value("${jtver}")

    String jtver;

    @RequestMapping(value = "/hello")

    public String hello () {

        return jtver;

    }

}

1.13.3    bootstrap.properties

注意:说明:此处不能用application.properties,因为代码中使用@Value注解,必须在应用程序执行之前初始化。

spring.application.name=config-client

spring.cloud.config.label=master

spring.cloud.config.profile=dev

#配置中心服务端地址

spring.cloud.config.uri= http://localhost:7010/

server.port=7020

eureka.client.service-url.defaultZone=http://user:password123@localhost:8761/eureka

#要刷新配置信息必须停掉安全访问,并且controller上增加@RefreshScope注解

management.security.enabled=false

1.13.4    模拟post请求

必须是post请求,如果直接访问会报错

package util;

import java.io.IOException;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

public class HttpClientPost {

    public static void main(String[] args) throws ClientProtocolException, IOException {

        String url = "http://localhost:7020/refresh";

        HttpPost httpPost = new HttpPost(url);

        CloseableHttpClient client = HttpClients.createDefault();

       

        client.execute(httpPost);

    }

}

1.13.5    测试

猜你喜欢

转载自www.cnblogs.com/wood-life/p/10342776.html