springCloud中分布式配置中心config运用

一、springCloud能做什么?

没有springCloud前,传统的服务配置文件都是配置在项目里面的,例如resource目录下面的application.yml或者application.properties文件,这种配置文件的局限性是修改起来比较麻烦,要重新打包发布并且重启服务,这些缺点就是springCloud的优点,1、配置文件和项目分离,配置在git上或者svn上;2、配置文件修改后不需要重启服务,请求刷新接口后直接生效;springCloud主要是为分布式系统中的基础设置和微服务应用提供集中化的外部配置支持;


二、springCloud配置中心入门势力;

1、配置configServer:

   1.1:引入maven依赖:

       

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.7.RELEASE</version>
        <relativePath/>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Brixton.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


</project>

 1.2:创建引用主类:

@SpringBootApplication
@EnableConfigServer//开启springCloud的服务端功能
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
}

1.3:配置application.properties配置文件:

spring.application.name=config-server
server.port=7001
#远程仓库地址,具体到项目
spring.cloud.config.server.git.uri=http://git.baozun.com/tanliwei/test.git
#项目下的具体路径
spring.cloud.config.server.git.searchPaths=config

1.4:配置完成:

 访问http://localhost:7001/application-dev.yml,返回配置文件的内容

配置文件与URL之间的关系:

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

/{application}-{profile}.yml

/{application}-{profile}.properties

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

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

label:对应git上不同的分支,默认是master

application:配置文件名称

profile:环境,dev还是prod

同时我们可以在conf-server管理台看见如下的记录:


可以看见其实配置中心先是从git上git clone一份文件到conf-server文件系统,然后再读取内容返回给客户端微服务,这样做的好处是当git仓库故障无法启动时从本地文件系统返回配置信息给客户端,这个我们可以尝试停止网络重新请求配置文件;

2、配置configClient

  2.1:引入maben依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.7.RELEASE</version>
    <relativePath/>
</parent>

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

</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Brixton.SR5</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2.2:创建应用主类:

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

2.3:创建配置文件bootstrap.properties

spring.application.name=didispace//对应配置文件规则中{application}部分

server.port=7002

spring.cloud.config.uri=http://localhost:7001/ //配置中心config-server的地址
spring.cloud.config.profile=dev//对应配置文件规则中{profile}部分

spring.cloud.config.label=master//对应配置文件规则中{label}部分

2.4:创建一个controller文件:

@RestController
public class TestController {

    @Value("${client.param}")//这个值对应你要读的配置文件中的属性
    private String form;

    @RequestMapping(value = "/form")
    public String form() {
        return this.form;
    }
}

2.5:访问接口http://localhost:7002/form,得到git配置文件中client.param的值

3、configClient从configServer获取配置文件的过程:

   1、根据bootstrap.properties配置文件的配置,传递应用名{application}、环境名{profile}、分支名{label}像configServer发起请求;

   2、configServer收到来自客户端的请求,首先git clone从git仓库按照传递过来的参数下载配置文件到本地文件系统;

   3、configServer创建ApplicationContext实例,并从本地git仓库加载配置文件,并将配置内容返回给客户端

   4、客户端获取到外部配置文件后加载到客户端的ApplicationContext实例,该配置文件的内容优先于客户端jar包内的配置内容,所以jar包内的重复内容不会被加载;

注:configServer第一次是git clone,第二次是git pull,如果git pull失败,会直接取本地文件系统的配置文件返回给客户端

因为一般配置文件都是很重要的,都是要登陆才能查看的,所以这里需要为configServer加上登陆验证功能:

第一步:引入maven依赖:

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

第二步:服务端配置用户名和密码:

  

security.user.name=user
security.user.password=14180ff8-30d8-4ccc-9d8b-caaa4eba50f0(密码可以自己随机设置)

第三步:客户端配置用户名和密码:

spring.cloud.config.username=user
spring.cloud.config.password=14180ff8-30d8-4ccc-9d8b-caaa4eba50f0


配置文件加解密:

第一步:配置对称加密密钥:encrypt.key=didispace

第二步:访问http://localhost:7001/encrypt/status接口,返回success

第三步:访问加密接口:


第四步:访问解密接口:


注意这里因为配置了security,所以header里面需要配置参数:



还有非对称加密,可以自行实验;

四、将配置中心服务化,我们可以将配置中心注册到eureka服务注册中心,实现配置中心服务化:

服务端修改:

第一步:ConfigServer引入eureka注册中心的依赖(原来依赖的基础上新增)

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

第二步:application.properties配置文件新增配置中心的配置:

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

第三步:在应用启动主类上新增@EnableDiscoveryClient注解将configServer注册到服务注册中心

这样以来,配置中心就变成注册到注册中心上面的一个微服务了;


客户端修改:

第一步:ConfigClient引入eureka注册中心的依赖(原来依赖的基础上新增)

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

第二步:修改bootstarp.properties配置文件:

//配置eureka注册中心的地址,用于发现配置中心的服务
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
//开启通过服务发现configServer的能力
spring.cloud.config.discovery.enabled=true
//配置配置中信configServer的服务名
spring.cloud.config.discovery.service-id=config-server

第三步:在应用启动主类上新增@EnableDiscoveryClient,用来发现configServer服务,来记载应用配置,搞定

五、客户端动态刷新服务:

当有人修改了git仓库的配置文件后,现在的配置服务的客户端是不能实时感知的,结合actuator能实现动态刷新的功能,引入actutor的maven依赖,修改配置文件后,请求/refreah接口,实现客户端应用配置的重新获取和刷新功能;

第一步:引入maven依赖:

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

第二步:重新启动configClient,修改git仓库的配置文件,请求配置文件获取的接口,返回参数没有改变;

第三步:请求actutor的/refresh接口:http://localhost:7002/refresh,动态刷新服务配置信息,返回修改的参数名;

第四步:再次请求配置文件获取的接口,参数改变!

猜你喜欢

转载自blog.csdn.net/chengkui1990/article/details/80894076