转载请注明出处: http://www.javashuo.com/article/p-doffjrso-w.htmlhtml
(20190503)我知道今天会有其余活动,所以我提早买了杯咖啡, (20190504)我知道深夜会完不成博客, 所以我加班到了这个点。 首先须要作的事情,Demo 准备并调试 还须要作的事情,构建github项目 以及要作的事情,README文档编写 最后要作的事情,生成一篇博客
话说一个简单的WEB应用须要多少行依赖,多少行代码,运行须要多大的package,须要多大的运行环境?java
01) aopalliance-1.0.jar aop的工具包 ` 02) commons-logging-1.1.3.jar commons的日志管理 03) spring-aop-3.2.8.RELEASE.jar Spring的切面编程 04) spring-beans-3.2.8.RELEASE.jar SpringIoC(依赖注入)的基础实现 05) spring-context-3.2.8.RELEASE.jar Spring提供在基础IoC功能上的扩展服务 06) spring-core-3.2.8.RELEASE.jar Spring的核心包 07) spring-expression-3.2.8.RELEASE.jar Spring表达式语言 08) spring-web-3.2.8.RELEASE.jar SpringWeb下的工具包 09) spring-webmvc-3.2.8.RELEASE.jar SpringMVC工具包 10) jstl-1.1.2.jar JSP标准标签库
package com.test.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping(value="/hello") public class HelloController { @RequestMapping(value="/world",method=RequestMethod.GET) public String hello(Model model){ model.addAttribute("msg", "你好spring mvc"); return "index"; } }
package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", index) log.Println("请访问:", "http://127.0.0.1:2222") http.ListenAndServe(":2222", nil) } func index(w http.ResponseWriter, r *http.Request) { fmt.Printf("[%s|%s] -> http://%s%s \n", r.Method, r.Proto, r.Host, r.RequestURI) dateTime := time.Now().Format("2006-01-02 15:04:05") }
结论:一个java web应用部署不小于100MB,而一个go web应用最少只须要2MB,你真的没听错他真的很小并且迅速,惟一不能比的是
java的生态 太庞大了,这是java之因此存在的优点,不过这终将成为历史。linux
(以上 go 代码在这里:simpleServer.go)git
二维码简称(QR CODE),中文全名叫快速响应码,他的基础基础包含:向量运算、字符编码、图形识别等,须要具体了解的可涉猎此
二维码原理,这里再也不从算法底层开始写起(毕竟大多数人都不会哈),
主要用到了开源都两个依赖(编码和解码)github
二维码生成web
这里用到了go-qrcode算法
// 写二维码 func writeQrCode() { // 写二维码 err := qrcode.WriteFile("https://funnyzpc.cnblogs.com", qrcode.Medium, 256, "D:/tmp/cnblogs.png") if err != nil { fmt.Println(err) } }
二维码解码spring
这里用到了qrcodeexpress
func ReadQrCode(){ //获取上传的第一个文件 file, _, _ := os.Open("本地文件路径") // 读取文件 qrmatrix, err := rQrCode.Decode(file) defer file.Close() if err != nil { fmt.Println(err.Error()) return } log.Println("获取到二维码内容:", qrmatrix.Content) }
一个产品的终态必将是一些列技术的组合,好比搭建一个在线的二维码解析应用。编程
参考代码
func main() { http.HandleFunc("/", IndexAction) http.HandleFunc("/qrCode", ReadQrCode) log.Println("请打开页面: http://127.0.0.1:2345") http.ListenAndServe(":2345", nil) } // 主页 func IndexAction(writer http.ResponseWriter, request *http.Request) { t, err := template.ParseFiles("template/page/index.html") if err != nil { log.Println(err) } t.Execute(writer, nil) } type QrCode struct { QrContent string } // 读取二维码 func ReadQrCode(writer http.ResponseWriter, request *http.Request) { //判断请求方式 if request.Method == "POST" { //设置内存大小 request.ParseMultipartForm(64 << 20) //获取上传的第一个文件 file, _, _ := request.FormFile("qrFile") // 读取文件 qrmatrix, err := rQrCode.Decode(file) defer file.Close() if err != nil { fmt.Println(err.Error()) return } log.Println("获取到二维码内容:", qrmatrix.Content) t, err := template.ParseFiles("template/page/qrCode.html") if err != nil { log.Println(err) } t.Execute(writer, QrCode{QrContent: qrmatrix.Content}) } else { //解析模板文件 t, _ := template.ParseFiles("template/page/qrCode.html") //输出文件数据 t.Execute(writer, nil) } } // 读二维码 func readQrCode() { file, error := os.Open("D:/tmp/cnblogs.png") if error != nil { fmt.Println(error.Error()) return } defer file.Close() qrmatrix, err := rQrCode.Decode(file) if err != nil { fmt.Println(err.Error()) return } fmt.Println(qrmatrix.Content) }
最终效果图
主页
结果
对于部署,在前面java和go的对比中已经提到过,go 应用不存在虚拟机,他的代码是直接从文本编译成二进制包(包含运行环境) 最终也必然是轻巧无依赖的,
另外,须要说的是go 的 打包自己是不加壳的,源包会比较大,通常部署时会作两个处理。
使用 -ldflags
去掉符号 去掉调试 压缩体积
同时使用upx加壳 upx --backup --brute [PACKAGE_FILE_NAME]
以进一步压缩体积(压缩至1/3),加密软件包,这样利于传输发布同时还能保持原生包的功效哦~
这里我简要给出通常的打包命令:
linux `GOOS=linux GOARCH=amd64 go build -ldflags "-w -s" ./main.go` window `GOOS=windows GOARCH=amd64 go build -ldflags "-w -s" ./main.go` mac `GOOS=darwin GOARCH=amd64 go build -ldflags "-w -s" ./main.go`
引用加壳命令:
upx --backup --brute [main.exe(windows) or main(linux、mac)]
最后上线部署:
linux: ./[PACKAGE_FILE] & mac: ./[PACKAGE_FILE] & windows: 双击[PACKAGE_FILE.exe],或将[PACKAGE_FILE.exe]配置为服务
以上全部代码均在个人github项目中,若所言有误恳请指正~
项目地址:qrCodes