分散式配置中心客戶端

weixin_33670713發表於2019-01-28

學習完整課程請移步 網際網路 Java 全棧工程師

本節視訊

概述

建立一個工程名為 hello-spring-cloud-config-client 的專案,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>

    <parent>
        <groupId>com.funtl</groupId>
        <artifactId>hello-spring-cloud-dependencies</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../hello-spring-cloud-dependencies/pom.xml</relativePath>
    </parent>

    <artifactId>hello-spring-cloud-config-client</artifactId>
    <packaging>jar</packaging>

    <name>hello-spring-cloud-config-client</name>
    <url>http://www.funtl.com</url>
    <inceptionYear>2018-Now</inceptionYear>

    <dependencies>
        <!-- Spring Boot Begin -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</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>
        <!-- Spring Boot End -->

        <!-- Spring Cloud Begin -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!-- Spring Cloud End -->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.funtl.hello.spring.cloud.config.client.ConfigClientApplication</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

主要增加了 spring-cloud-starter-config 依賴

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

Application

入口類沒有需要特殊處理的地方,程式碼如下:

package com.funtl.hello.spring.cloud.config.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

application.yml

增加 Config Client 相關配置,並設定埠號為:8889

spring:
  application:
    name: hello-spring-cloud-config-client
  cloud:
    config:
      uri: http://localhost:8888
      name: config-client
      label: master
      profile: dev

server:
  port: 8889

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

相關配置說明,如下:

  • spring.cloud.config.uri:配置服務中心的網址
  • spring.cloud.config.name:配置檔名稱的字首
  • spring.cloud.config.label:配置倉庫的分支
  • spring.cloud.config.profile:配置檔案的環境標識
    • dev:表示開發環境
    • test:表示測試環境
    • prod:表示生產環境

注意事項:

  • 配置伺服器的預設埠為 8888,如果修改了預設埠,則客戶端專案就不能在 application.ymlapplication.properties 中配置 spring.cloud.config.uri,必須在 bootstrap.yml 或是 bootstrap.properties 中配置,原因是 bootstrap 開頭的配置檔案會被優先載入和配置,切記。

建立測試用 Controller

我們建立一個 Controller 來測試一下通過遠端倉庫的配置檔案注入 foo 屬性

package com.funtl.hello.spring.cloud.config.client.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestConfigController {

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

    @RequestMapping(value = "/hi", method = RequestMethod.GET)
    public String hi() {
        return foo;
    }
}

一般情況下,能夠正常啟動服務就說明注入是成功的。

測試訪問

瀏覽器端訪問:http://localhost:8889/hi 顯示如下:

foo version 1

附:開啟 Spring Boot Profile

我們在做專案開發的時候,生產環境和測試環境的一些配置可能會不一樣,有時候一些功能也可能會不一樣,所以我們可能會在上線的時候手工修改這些配置資訊。但是 Spring 中為我們提供了 Profile 這個功能。我們只需要在啟動的時候新增一個虛擬機器引數,啟用自己環境所要用的 Profile 就可以了。

操作起來很簡單,只需要為不同的環境編寫專門的配置檔案,如:application-dev.ymlapplication-prod.yml
啟動專案時只需要增加一個命令引數 --spring.profiles.active=環境配置 即可,啟動命令如下:

java -jar hello-spring-cloud-web-admin-feign-1.0.0-SNAPSHOT.jar --spring.profiles.active=prod

相關文章