simple go web application & 二维码生成 & 打包部署
go语言简易web应用 & 二维码生成及解码 & 打包部署
转载请注明出处: https://www.cnblogs.com/funnyzpc/p/10801476.html
前言(闲扯)
(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),中文全名叫快速响应码,他的基础基础包含:向量运算、字符编码、图形识别等,需要具体了解的可涉猎此
二维码原理,这里不再从算法底层开始写起(毕竟大多数人都不会哈),
主要用到了开源都两个依赖(编码和解码)
二维码生成
这里用到了go-qrcode
- Demo主要逻辑(已调试通过)
// 写二维码
func writeQrCode() {
// 写二维码
err := qrcode.WriteFile("https://funnyzpc.cnblogs.com", qrcode.Medium, 256, "D:/tmp/cnblogs.png")
if err != nil {
fmt.Println(err)
}
}
二维码解码
这里用到了qrcode
- 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
simple go web application & 二维码生成 & 打包部署的更多相关文章
- 聊聊 Web 项目二维码生成的最佳姿势
在设计和实现的过程之后,你永远不知道部署上去的程序会已什么样的姿势运行. 本篇借一次生成二维码逻辑的不同实现,阐述 Web 项目中二维码生成的正确姿势. 文中如有批量,欢迎各位看客老爷拍砖.试运行前5 ...
- java web 二维码生成
pom支持: <!-- 二维码支持包 start--> <dependency> <groupId>com.google.zxing</groupId> ...
- java 二维码生成(可带图片)springboot版
本文(2019年6月29日 飞快的蜗牛博客) 有时候,男人和女人是两个完全不同的世界,男人的玩笑和女人的玩笑也完全是两码事,爱的人完全不了解你,你也不要指望一个女人了解你,所以男的不是要求别人怎么样, ...
- 玩转Android之二维码生成与识别
二维码,我们也称作QRCode,QR表示quick response即快速响应,在很多App中我们都能见到二维码的身影,最常见的莫过于微信了.那么今天我们就来看看怎么样在我们自己的App中集成二维码的 ...
- 【C#】发票助手二维码生成
之前一起吃饭听说了发票助手这个东西,可以生成发票抬头的二维码,扫码就可以开票了. 官方也有个小程序的 [税务发票助手],微信中搜这个名字就可以了. 我准备在自己的小程序中也尝试一下,本来觉得只要拼接一 ...
- 带logo图片或不带logo图片的二维码生成与解析,亲测成功
最近公司需要实现二维码功能,本人经过一顿百度,终于实现了,因有3个功能:不带logo图片.带logo图片.解析二维码,篇幅较长,请耐心读之,直接复制粘贴即可. 前提:myeclipse10:jar包: ...
- QRCodeHelper 二维码生成
QRCodeHelper 二维码生成 using System; using System.Drawing; using ThoughtWorks.QRCode.Codec; using System ...
- 二维码生成插件qrious及网站扫码登录的一些理解
什么是二维码 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型. ...
- 杂项收集,包括-发邮件、二维码生成、文件下载、压缩、导出excel
本篇就最近工作解决的问题做个代码收集.包括以下几个方面:发邮件.二维码生成.文件下载.压缩.导出excel.有一种可用的解决方法就好,不求全面,不求原理. 1.发邮件: 命名空间:System.Net ...
随机推荐
- luogu P3111 [USACO14DEC]牛慢跑Cow Jog_Sliver |贪心+模拟
有N (1 <= N <= 100,000)头奶牛在一个单人的超长跑道上慢跑,每头牛的起点位置都不同.由于是单人跑道,所有他们之间不能相互超越.当一头速度快的奶牛追上另外一头奶牛的时候,他 ...
- vue反向代理(解决跨域)
1,vue中有提供反向代理的接口,就是config/index.js中的proxyTable,我的脚手架版本是2.9.6,proxyTable配置初始为空,如下图. 2,将proxyTable配置如下 ...
- Pandas学习(一)——数据的导入
欢迎加入python学习交流群 667279387 学习笔记汇总 Pandas学习(一)–数据的导入 pandas学习(二)–双色球数据分析 pandas学习(三)–NAB球员薪资分析 pandas学 ...
- 数据库Oracle通用函数
通用函数:可用于任意数据类型,并且适用于空值.• NVL (expr1, expr2) • NVL2 (expr1, expr2, expr3) • NULLIF (expr1, expr2) • C ...
- Dubbo 2.7新特性之异步化改造
这是why技术的第1篇原创文章 我与Dubbo的二三事 我是2016年毕业的,在我毕业之前,我在学校里面学到的框架都是SSH,即struts+spring+hibernate,是的你没有看错,在大学里 ...
- 201871010119-帖佼佼《面向对象程序设计(java)》第四周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh ...
- Docker中Nginx服务器相关配置
工作中经常需要在服务器上来做一下实验,亲自动手看看效果是否与理论描述的相同.用docker可以很方便的配置所需要的环境,以下内容记录了如何用docker配置一个nginx服务器 下载nginx 从默认 ...
- 使用Future
/** * Runnable接口有个问题,它的方法没有返回值.如果任务需要一个返回结果,那么只能保存到变量,还要提供额外的方法读取,非常不便. * Java标准库还提供了一个Callable接口,和R ...
- Python面向对象-类、实例的绑定属性、绑定方法和__slots__
绑定属性 从之前的文章中,我们知道python是动态语言——实例可以绑定任意属性. 那如果实例绑定的属性和类的属性名一样的话,会是什么情况呢? >>> class Student(o ...
- 基于Tomcat部署的Geoserver配置Geowebcache,并转发ArcGIS切片
1.将GeowebCache的war包解压到tomcat的webapp下,打开war包中的WEB-INF中的web.xml文件,同时创建一个你想保存geowencache的切片的空文件夹,例如我命名叫 ...