欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

程序员文章站 2022-06-21 14:22:06
...

我们在接着第十二篇之后讲讲配置中心。

配置中心的意义不需要多讲了吧,现在我们讲的是SpringCloud全家桶的配置中心。一般情况不使用,但是不能不会。

首先我们要知道,SpringCloudConfig是使用Git 进行配置文件同步的,所以我们在阿里巴巴提供的免费的gitee上进行演示。并且注意,我们只演示手动刷新,自动刷新是不推荐使用的。

我使用了自己的账号创建了一个项目SpringCloud。然后创建了一个文件夹config。

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

在config文件夹下,我提交了2个配置文件。一个是开发环境的配置文件app-member-dev.properties 另一个是生产环境的配置文件app-member-prd.yml

这两个文件名很有讲究,前面是要获取这个配置文件的服务的别名(app-member),后面是环境(-dev或-prd)。

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

然后我们在原来的项目结构下,新建一个config项目

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

pom.xml如下:(就是多了个SpringCloudConfig的服务端)

<?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.0.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.study</groupId>
    <artifactId>springcloud-config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud-eureka-server</name>
    <description>Demo project for Spring Boot</description>

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

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

    <dependencies>
        <!-- SpringCloudConfig 服务端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

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

    </dependencies>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>

    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

然后配置application.yml: (不能给看的我用*号替换了)

server:
   ### 端口号
   port: 8101

spring:
   application:
      ### 注册中心的服务名,在服务中心集群时要保持一致
      name: config-server
   cloud:
      config:
         server:
            git:
               ## git路径
               uri: https://gitee.com/******/springcloud.git
               ## 分支名称
               label: master
               ## 文件夹名称
               search-paths:
               - config
               ## git 用户登录账号
               username: ******@qq.com
               ### git 用户密码
               password: ******
### eureka 配置
eureka:
   client:
      service-url:
         ### 注册中心的地址
         defaultZone: http://127.0.0.1:8100/eureka/

然后建应该main类,注意注解要加上 @EnableConfigServer

package com.study;

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

@SpringBootApplication
// 表示开启EurekaServer服务,开启注册中心 
@EnableEurekaServer
@EnableConfigServer
public class AppConfigServer {

    // 主进程
    public static void main(String[] args) {
        SpringApplication.run(AppConfigServer.class, args);
    }


}

然后我们先启动Eureka,再启动Config

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

如上图,config-server已经注册到eureka里面了。

然后我们在浏览器里操作。直接用config-server来访问那两个配置文件。

SpringCloud学习笔记(十三)配置中心——SpringCloudConfigSpringCloud学习笔记(十三)配置中心——SpringCloudConfig

可以看到,配置文件的信息被读成yml了。我经过尝试,不论你用properties还是yml,最终都会读成yml,而且你在URL里用.properties还是.yml都可以。

我们在git上修改的话,这个是会实时刷新的,我就不演示了。

接下来,重要的是我们的其他服务需要能读取到config里面的配置文件。

我们在parents的pom.xml加上依赖:(actuator监控中心用来做手动刷新的)

<!-- SpringCloud 配置中心客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>
  <!-- actuator监控中心 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

然后在app-member的resources文件夹下新建一个bootstrap.yml

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

spring.cloud.config.profile 就是指使用哪个环境的配置文件,和前面的文件名那里对应,service-id就是config的服务别名了。

然后这里eureka的信息也要配置一下,因为bootstrap.yml会先于application.yml加载,如果这里你不配eureka的信息,那寻找配置中心时就不知道注册中心在哪里,会启动失败。

下面是application.yml :

spring:
  application:
    ### 注册中心的服务名,在服务中心集群时要保持一致
    name: app-member



###   springcluoud 默认开启ribbon了
ribbon:
  ###  响应超时时间
  ReadTimeout: 5000
  ###  连接超时时间
  ConnectTimeout: 5000

management:
  endpoints:
    web:
      exposure:
        ## 开启所有端点
        include: "*"

application.yml可以不配置eureka的信息了。增加了,amagement.endpoints.web.exposure.include的配置,意思是哪些需要实时刷新,就配全部就好。

另外要注意spring.application.name 必须和配置文件的前半截一致。

我举个例子member的spring.application.name=projectA , spring.cloud.config.profile=dev时,对应的配置文件名就应该是projectA-dev.yml 或者projectA-dev.properties。

这样配好之后,member就能读取到git上的配置文件的信息了。为了演示效果,我们用controller输出配置文件中的信息。

我们在member的controller(原来的MemberServiceImpl.java)中添加如下方法:

package com.study.api.service.impl;

import com.study.api.entity.User;
import com.study.api.service.MemberService;
import com.study.web.ResultBean;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Project 项目名:service - member - impl
 * @CreateTime 创建时间:2019/11/29 14:26
 * @Descrition 说明: 会员服务的实现类
 */
@RestController
@RefreshScope
public class MemberServiceImpl implements MemberService {



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

    @Override
    @RequestMapping("/getConfigTest")
    public String getConfigTest() {
        return projectInfo;
    }
}

并且注意,我在类上面加了@RefreshScope注解,不加这个是不能实时刷新的。

然后启动member。访问这个接口。

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

我们可以看到,输出的结果和git中app-member-dev.properties的一致。profile改成prd时(重启member)如下

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

亦和app-member-prd.yml的一致。也就是说读取是成功的。

但是如果修改呢?而且中文时会不会乱码呢。

我们自己在git上修改app-member-dev.properties的内容,在尾处加了中文

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

然后刷新getConfigTest接口

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

显然没有更新成功,因为我们是手动刷新的呢,所以需要使用actuator去刷新。

我们打开postman,因为刷新接口必须是post接口,我们在浏览器上难以实现。

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

用post请求http://{ip}:{端口}/actuator/refresh之后,response那里说明projectInfo刷新了(如果没有任何刷新是返回"[]")。那我们再刷新接口看看

SpringCloud学习笔记(十三)配置中心——SpringCloudConfig

显然是刷新了,但是中文乱码了。这个乱码如何解决呢?

网上有搜搜得出的结果基本是让你重写PropertySourceLoader接口的实现类,我就不多说了。