领导听说服务容器化能减少机器,遂让我们做着手服务容器化的事情,最后做下来,发现目前并不能减少机器,因为公司主要使用java
技术栈,我比较喜欢golang
, 所以做了一个golang
与java
的容器化对比,个中偏颇,读者自行考量。
闲话不多说,先来一段简单的golang
代码如下
package main
import "github.com/gin-gonic/gin"
func setupRouter() *gin.Engine {
return gin.Default()
}
func main() {
r := setupRouter()
r.Run(":8000")
}
编译一下
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main
编写Dockerfile
FROM golang:1.12-alpine
ADD main /
CMD ["/main"]
制作镜像
docker build -t registry.cn-shanghai.aliyuncs.com/testops/hw-go:latest .
so easy
再来看java
版的(在idea上起了一个springboot工程)
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
打包
mvn clean package
同样的编写Dockerfile
FROM openjdk:8-jdk-alpine
ADD /target/demo-0.0.1-SNAPSHOT.jar app.jar
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
打镜像
docker build -t registry.cn-shanghai.aliyuncs.com/testops/hw-java:latest .
先来对比一下镜像
![](https://static.studygolang.com/190713/d76e76fb97262d3cfda158e174c22357.png)
image.png
可以看出:
golang:1.12-alpine
的镜像尺寸要比openjdk:8-jdk-alpine
大不少,这也导致最后制作出来的镜像
hw-go
要比hw-java
大上不少。
是骡子是马拉出来遛遛,先来试一下hw-go
![](https://static.studygolang.com/190713/00df52be025a8ade42bdd4987efa307d.png)
image.png
![](https://static.studygolang.com/190713/5a07adbde2483a8c4900baff28bbf9ab.png)
image.png
再来看一下hw-java
![](https://static.studygolang.com/190713/8e14dcf566cbb9ad7862746b567f820b.png)
image.png
![](https://static.studygolang.com/190713/b16b17cac97dc4f462e4b3d8ed6dd767.png)
image.png
内存占用
4.328MiB
VS 264.2MiB
,66倍的差距,这一轮(当然是在我的实验条件下), java
是完败的,我没想到这个对比来的这么强烈,有一点点夸张,但至少可以看出springboot
是比较吃内存的(啥也没干,只是起了一个http server而已),这样看来,如果用golang
来重写java
服务,相信内存占用会少很多,届时减少机器也并非不可能,不过想到在某些springboot
服务启动时看到佛祖保佑,**项目,永无BUG
的字样,就觉得此事任重而道远……
有疑问加站长微信联系(非本文作者)
![](https://static.golangjob.cn/static/img/footer.png?imageView2/2/w/280)