公司的运行环境有点神奇,有时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