六、微服务之远程配置

六、微服务之远程配置

简要说明

此服务非必要,主要功能就是在远程环境上集中管理项目的配置文件,远程配置并非最好的选择,会导致一些变量加载的问题,所以此服务非必须服务,可自行选择是否搭建

服务端

1. 主要依赖

<?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.1.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
    </parent>
    <groupId>com.fatcat</groupId>
    <artifactId>fc-config</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>fc-config</name>
    <description>远程仓库配置中心</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </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>
</project>

2. 关键配置

# 自身服务端口和名称配置 
server.port=8888 spring.application.name=fc-config 
# eureka 配置 
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ 
# 配置中心不需要检索其他服务 
eureka.client.fetch-registry=false 
eureka.instance.lease-renewal-interval-in-seconds=30 
eureka.instance.lease-expiration-duration-in-seconds=60 
# 配置中心服务的相关设置 
# 仓库地址(不要加.git) 
spring.cloud.config.server.git.uri=***** 
# 分支名称 
spring.cloud.config.server.git.default-label=develop 
# 强制拉取 
spring.cloud.config.server.git.force-pull=true 
# 搜索路径,即配置文件所在路径 
spring.cloud.config.server.git.search-paths=fc-static 
# git账号和密码 
spring.cloud.config.server.git.username=***** spring.cloud.config.server.git.password=***** 
# 指定本地缓存配置文件的路径 
spring.cloud.config.server.git.basedir=/usr/local/fatcat/config
客户端

1. 主要依赖

<?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.1.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
    </parent>
    <artifactId>fc-search</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>fc-search</name>
    <dependencies>
        <!-- WEB-MVC 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 全局更换服务器为 jetty,更轻量 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <!-- EUREKA 注册中心 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- CONFIG 远程配置 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>
</project>

2. 关键配置

# 读取远程配置 
spring.cloud.config.discovery.enabled=true 
# config服务的名称 
spring.cloud.config.discovery.service-id=fc-config 
# config服务的地址 
spring.cloud.config.uri=lb://fc-config 
# 读取的仓库分支 
spring.cloud.config.label=develop 
# 读取的文件名称 
spring.cloud.config.name=fc-search 
# profile表示对应的环境(文件后缀),如fc-search、fc-search-dev、fc-search-test 
#spring.cloud.config.profile=default
使用方法

远程配置服务启动后,通过 ip:port/{service-name}-{profile}.yaml 即可访问到配置文件中的属性值,仅显示远程配置文件中的配置属性;后缀名可选:yaml、yml、xml、properties

注意事项

1.spring 对配置文件的加载顺序如下:本地 bootstrap -> 本地 application -> 远程 指定name(或服务名)文件 -> 远程 application

2.spring 会优先加载本地配置(废话!不优先加载本地文件怎么可能知道远程配置的地址呢?), 然后获取到远程配置地址后读取远程配置文件,根据指定的name读取,不指定默认为服务的名称,如果远程配置中存在 application 的文件也会默认加载;加载完全部配置文件后通过 refreshContext() 方法将远程配置文件优先级置于最高,同名属性优先级高的生效

3.最后对于同名属性生效的顺序: 远程服务名对应的文件 > 远程 application > 本地 application > 本地 bootstrap

4.以上关于配置的结论仅针对于 springcloud 工程有效;单独的 springboot 项目不存在远程配置和本地 bootstrap 文件,仅 application 生效.

补充说明

总结:配置的加载顺序和生效顺序相反,同名配置后加载的生效;

加载顺序: bootstarp -> application -> 远程配置;

同名属性生效优先级:远程配置 > 本地。