simple go web application & 二维码生成 & 打包部署
go语言简易web应用 & 二维码生成及解码 & 打包部署
转载请注明出处:
前言(闲扯)
(20190503)我知道今天会有其他活动,因此我提前买了杯咖啡, (20190504)我知道深夜会完不成博客, 因此我加班到了这个点。 首先需要做的事情,demo 准备并调试 还需要做的事情,构建github项目 以及要做的事情,readme文档编写 最后要做的事情,生成一篇博客
简单web应用
话说一个简单的web应用需要多少行依赖,多少行代码,运行需要多大的package,需要多大的运行环境?
- 对于java:
- 我需要构建下面这些包(5mb+)
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标准标签库
- 需要编写以下代码(14行+)
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"; } }
- 打包(jar or war 5mb+)
- 部署和环境(jdk 100mb+ , tomcat 5mb+ total:105mb+)
- 对于go
- 需要代码(15行+)
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") }
- 打包(<6mb,upx加壳<2mb)
- 部署和环境(<6mb or <2mb)
结论:一个java web应用部署不小于100mb,而一个go web应用最少只需要2mb,你真的没听错他真的很小而且迅速,唯一不能比的是
java的生态 太庞大了,这是java之所以存在的优势,不过这终将成为历史。
(以上 go 代码在这里:simpleserver.go)
二维码生成及解码
二维码简称(qr code),中文全名叫快速响应码,他的基础基础包含:向量运算、字符编码、图形识别等,需要具体了解的可涉猎此
,这里不再从算法底层开始写起(毕竟大多数人都不会哈),
主要用到了开源都两个依赖(编码和解码)
-
二维码生成
这里用到了
- demo主要逻辑(已调试通过)
// 写二维码 func writeqrcode() { // 写二维码 err := qrcode.writefile("https://funnyzpc.cnblogs.com", qrcode.medium, 256, "d:/tmp/cnblogs.png") if err != nil { fmt.println(err) } }
-
二维码解码
这里用到了
- demo主要逻辑
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) }
二维码解析+web服务
一个产品的终态必将是一些列技术的组合,比如搭建一个在线的二维码解析应用。
-
参考代码
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
上一篇: [JLOI2014]松鼠的新家 (树剖)
下一篇: JS 03事件