Spring Boot 获取当前应用的版本

公司的运行环境有点神奇,有时K8S的集群在生产环境会被人复制一份,成为一个新集群在跑,而且我们还不知道他们什么时候会做这件事。于是有可能,我们上了新版本,被复制的集群在跑旧版本。
怎么办呢?小弟突发奇想:能不能把我们期望运行的版本号放在Redis里,然后本应用启动的时候看看版本对不对,版本不对就不提供服务。
这个方案未必适合。但是我也想看看能不能取得应用的版本号。

查看了一下Spring Boot打出来的包,找到一个 "META-INF/MANIFEST.MF", 竟然很神奇地有我想要的信息。

Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT

那最简单的做法就是读这个文件并把结果拿出来!
上代码:

package cn.gzten.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

@RestController
public class TestController {
    @GetMapping("/")
    public String getVersion() {
        try(InputStream ins = ClassLoader.getSystemResourceAsStream("META-INF/MANIFEST.MF")) {
            Properties prop = new Properties();
            prop.load(ins);
            String appName = prop.getProperty("Implementation-Title");
            String appVersion = prop.getProperty("Implementation-Version");
            return String.join("-", appName, appVersion);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

结果不错:

$ curl -i http://localhost:8080
HTTP/1.1 200 OK
Content-Type: text/plain;charset=UTF-8
Content-Length: 19

demo-0.0.1-SNAPSHOT

你可能感兴趣的:(Spring Boot 获取当前应用的版本)