go语言简易web应用 & 二维码生成及解码 & 打包部署

转载请注明出处: https://www.cnblogs.com/funnyzpc/p/10801476.html

前言(闲扯)

  1. (20190503)我知道今天会有其他活动,因此我提前买了杯咖啡,
  2. (20190504)我知道深夜会完不成博客, 因此我加班到了这个点。
  3. 首先需要做的事情,Demo 准备并调试
  4. 还需要做的事情,构建github项目
  5. 以及要做的事情,README文档编写
  6. 最后要做的事情,生成一篇博客

简单WEB应用

话说一个简单的WEB应用需要多少行依赖,多少行代码,运行需要多大的package,需要多大的运行环境?

  • 对于java:

    • 我需要构建下面这些包(5MB+)
    1. 01 aopalliance-1.0.jar                aop的工具包 `
    2.     02) commons-logging-1.1.3.jar          commons的日志管理
    3.     03) spring-aop-3.2.8.RELEASE.jar       Spring的切面编程
    4.     04) spring-beans-3.2.8.RELEASE.jar     SpringIoC(依赖注入)的基础实现
    5.     05) spring-context-3.2.8.RELEASE.jar Spring提供在基础IoC功能上的扩展服务
    6.     06) spring-core-3.2.8.RELEASE.jar      Spring的核心包
    7.     07) spring-expression-3.2.8.RELEASE.jar  Spring表达式语言
    8.     08) spring-web-3.2.8.RELEASE.jar      SpringWeb下的工具包
    9.     09) spring-webmvc-3.2.8.RELEASE.jar      SpringMVC工具包
    10.     10) jstl-1.1.2.jar                       JSP标准标签库
    • 需要编写以下代码(14行+)
    1. package com.test.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.ui.Model;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import org.springframework.web.bind.annotation.RequestMethod;
    6. @Controller
    7. @RequestMapping(value="/hello")
    8. public class HelloController {
    9. @RequestMapping(value="/world",method=RequestMethod.GET)
    10. public String hello(Model model){
    11. model.addAttribute("msg", "你好spring mvc");
    12. return "index";
    13. }
    14. }
    • 打包(jar or war 5MB+)
    • 部署和环境(jdk 100MB+ , tomcat 5MB+ total:105MB+)
  • 对于Go
    • 需要代码(15行+)
    1. package main
    2. import (
    3. "fmt"
    4. "log"
    5. "net/http"
    6. )
    7. func main() {
    8. http.HandleFunc("/", index)
    9. log.Println("请访问:", "http://127.0.0.1:2222")
    10. http.ListenAndServe(":2222", nil)
    11. }
    12. func index(w http.ResponseWriter, r *http.Request) {
    13. fmt.Printf("[%s|%s] -> http://%s%s \n", r.Method, r.Proto, r.Host, r.RequestURI)
    14. dateTime := time.Now().Format("2006-01-02 15:04:05")
    15. }
    • 打包(<6MB,upx加壳<2MB)
    • 部署和环境(<6MB or <2MB)

结论:一个java web应用部署不小于100MB,而一个go web应用最少只需要2MB,你真的没听错他真的很小而且迅速,唯一不能比的是

java的生态 太庞大了,这是java之所以存在的优势,不过这终将成为历史。

(以上 go 代码在这里:simpleServer.go)

二维码生成及解码

二维码简称(QR CODE),中文全名叫快速响应码,他的基础基础包含:向量运算、字符编码、图形识别等,需要具体了解的可涉猎此

二维码原理,这里不再从算法底层开始写起(毕竟大多数人都不会哈),

主要用到了开源都两个依赖(编码和解码)

  • Demo主要逻辑(已调试通过)
  1. // 写二维码
  2. func writeQrCode() {
  3. // 写二维码
  4. err := qrcode.WriteFile("https://funnyzpc.cnblogs.com", qrcode.Medium, 256, "D:/tmp/cnblogs.png")
  5. if err != nil {
  6. fmt.Println(err)
  7. }
  8. }
  • 二维码解码

    这里用到了qrcode

    • Demo主要逻辑
    1. func ReadQrCode(){
    2. //获取上传的第一个文件
    3. file, _, _ := os.Open("本地文件路径")
    4. // 读取文件
    5. qrmatrix, err := rQrCode.Decode(file)
    6. defer file.Close()
    7. if err != nil {
    8. fmt.Println(err.Error())
    9. return
    10. }
    11. log.Println("获取到二维码内容:", qrmatrix.Content)
    12. }

二维码解析+WEB服务

一个产品的终态必将是一些列技术的组合,比如搭建一个在线的二维码解析应用。

  • 参考代码

    1. func main() {
    2. http.HandleFunc("/", IndexAction)
    3. http.HandleFunc("/qrCode", ReadQrCode)
    4. log.Println("请打开页面: http://127.0.0.1:2345")
    5. http.ListenAndServe(":2345", nil)
    6. }
    7. // 主页
    8. func IndexAction(writer http.ResponseWriter, request *http.Request) {
    9. t, err := template.ParseFiles("template/page/index.html")
    10. if err != nil {
    11. log.Println(err)
    12. }
    13. t.Execute(writer, nil)
    14. }
    15. type QrCode struct {
    16. QrContent string
    17. }
    18. // 读取二维码
    19. func ReadQrCode(writer http.ResponseWriter, request *http.Request) {
    20. //判断请求方式
    21. if request.Method == "POST" {
    22. //设置内存大小
    23. request.ParseMultipartForm(64 << 20)
    24. //获取上传的第一个文件
    25. file, _, _ := request.FormFile("qrFile")
    26. // 读取文件
    27. qrmatrix, err := rQrCode.Decode(file)
    28. defer file.Close()
    29. if err != nil {
    30. fmt.Println(err.Error())
    31. return
    32. }
    33. log.Println("获取到二维码内容:", qrmatrix.Content)
    34. t, err := template.ParseFiles("template/page/qrCode.html")
    35. if err != nil {
    36. log.Println(err)
    37. }
    38. t.Execute(writer, QrCode{QrContent: qrmatrix.Content})
    39. } else {
    40. //解析模板文件
    41. t, _ := template.ParseFiles("template/page/qrCode.html")
    42. //输出文件数据
    43. t.Execute(writer, nil)
    44. }
    45. }
    46. // 读二维码
    47. func readQrCode() {
    48. file, error := os.Open("D:/tmp/cnblogs.png")
    49. if error != nil {
    50. fmt.Println(error.Error())
    51. return
    52. }
    53. defer file.Close()
    54. qrmatrix, err := rQrCode.Decode(file)
    55. if err != nil {
    56. fmt.Println(err.Error())
    57. return
    58. }
    59. fmt.Println(qrmatrix.Content)
    60. }
  • 最终效果图

    • 主页

    • 结果

打包部署

对于部署,在前面java和go的对比中已经提到过,go 应用不存在虚拟机,他的代码是直接从文本编译成二进制包(包含运行环境) 最终也必然是轻巧无依赖的,

另外,需要说的是go 的 打包本身是不加壳的,源包会比较大,一般部署时会做两个处理。

  • 使用 -ldflags 去掉符号 去掉调试 压缩体积

  • 同时使用upx加壳 upx --backup --brute [PACKAGE_FILE_NAME] 以进一步压缩体积(压缩至1/3),加密软件包,这样利于传输发布同时还能保持原生包的功效哦~

这里我简要给出一般的打包命令:

  1. linux `GOOS=linux GOARCH=amd64 go build -ldflags "-w -s" ./main.go`
  2. window `GOOS=windows GOARCH=amd64 go build -ldflags "-w -s" ./main.go`
  3. mac `GOOS=darwin GOARCH=amd64 go build -ldflags "-w -s" ./main.go`

引用加壳命令:

  1. upx --backup --brute [main.exe(windows) or main(linuxmac)]

最后上线部署:

  1. linux: ./[PACKAGE_FILE] &
  2. mac: ./[PACKAGE_FILE] &
  3. windows: 双击[PACKAGE_FILE.exe],或将[PACKAGE_FILE.exe]配置为服务

最后

以上所有代码均在我的github项目中,若所言有误恳请指正~

项目地址:qrCodes

simple go web application & 二维码生成 & 打包部署的更多相关文章

  1. 聊聊 Web 项目二维码生成的最佳姿势

    在设计和实现的过程之后,你永远不知道部署上去的程序会已什么样的姿势运行. 本篇借一次生成二维码逻辑的不同实现,阐述 Web 项目中二维码生成的正确姿势. 文中如有批量,欢迎各位看客老爷拍砖.试运行前5 ...

  2. java web 二维码生成

    pom支持: <!-- 二维码支持包 start--> <dependency> <groupId>com.google.zxing</groupId> ...

  3. java 二维码生成(可带图片)springboot版

    本文(2019年6月29日 飞快的蜗牛博客) 有时候,男人和女人是两个完全不同的世界,男人的玩笑和女人的玩笑也完全是两码事,爱的人完全不了解你,你也不要指望一个女人了解你,所以男的不是要求别人怎么样, ...

  4. 玩转Android之二维码生成与识别

    二维码,我们也称作QRCode,QR表示quick response即快速响应,在很多App中我们都能见到二维码的身影,最常见的莫过于微信了.那么今天我们就来看看怎么样在我们自己的App中集成二维码的 ...

  5. 【C#】发票助手二维码生成

    之前一起吃饭听说了发票助手这个东西,可以生成发票抬头的二维码,扫码就可以开票了. 官方也有个小程序的 [税务发票助手],微信中搜这个名字就可以了. 我准备在自己的小程序中也尝试一下,本来觉得只要拼接一 ...

  6. 带logo图片或不带logo图片的二维码生成与解析,亲测成功

    最近公司需要实现二维码功能,本人经过一顿百度,终于实现了,因有3个功能:不带logo图片.带logo图片.解析二维码,篇幅较长,请耐心读之,直接复制粘贴即可. 前提:myeclipse10:jar包: ...

  7. QRCodeHelper 二维码生成

    QRCodeHelper 二维码生成 using System; using System.Drawing; using ThoughtWorks.QRCode.Codec; using System ...

  8. 二维码生成插件qrious及网站扫码登录的一些理解

    什么是二维码 ​ 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型. ...

  9. 杂项收集,包括-发邮件、二维码生成、文件下载、压缩、导出excel

    本篇就最近工作解决的问题做个代码收集.包括以下几个方面:发邮件.二维码生成.文件下载.压缩.导出excel.有一种可用的解决方法就好,不求全面,不求原理. 1.发邮件: 命名空间:System.Net ...

随机推荐

  1. HDU2482-Transit search(地图还原+SPFA)

    Henry decides to develop a web site, which will provide the service of transit search. But he can on ...

  2. PyCharm配置Gitee

    PyCharm配置Gitee 第一步:下载安装Git https://git-scm.com/download/win 第二步:打开PyCharm,配置Git File->Setting-> ...

  3. 【JS】312- 复习 JavaScript 严格模式(Strict Mode)

    点击上方"前端自习课"关注,学习起来~ 注:本文为 < JavaScript 完全手册(2018版) >第30节,你可以查看该手册的完整目录. 严格模式是一项 ES5 ...

  4. 【Zuul】使用学习

    [Zuul]使用学习 添加依赖 <dependency> <groupId>org.springframework.cloud</groupId> <arti ...

  5. 【consul】使用学习

    [consul]使用学习 转载:https://www.cnblogs.com/yangchongxing/p/10653791.html 1.下载 consul https://www.consul ...

  6. Elasticsearch系列---搜索分页和deep paging问题

    概要 本篇从介绍搜索分页为起点,简单阐述分页式数据搜索与原有集中式数据搜索思维方式的差异,就分页问题对deep paging问题的现象进行分析,最后介绍分页式系统top N的案例. 搜索分页语法 El ...

  7. 如何在Android手机上进行自动化测试(下)

    版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 前言 通过阅读本篇教程,你将会了解到: 如何使用Poco对Android原生应用进行测试 Poco支持直接对任何Android原生应 ...

  8. JS基础知识——原型与原型链

    1.如何准确判断一个变量的数组类型 2.写一个原型链继承的例子 3.描述new一个对象的过程 4.zepto(或其他框架中如何使用原型链) 知识点: (1)构造函数 function Foo(name ...

  9. 大白话简单工厂模式 (Simple Factory Pattern)

    大白话简单工厂模式 (Simple Factory Pattern) 从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车 ...

  10. 《Java练习题》进阶练习题(五)

    编程合集: https://www.cnblogs.com/jssj/p/12002760.html 前言:不仅仅要实现,更要提升性能,精益求精,用尽量少的时间复杂度和空间复杂度解决问题. [程序88 ...