欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

simple go web application & 二维码生成 & 打包部署

程序员文章站 2022-07-05 14:17:27
go语言简易web应用 & 二维码生成及解码 & 打包部署 转载请注明出处: "https://www.cnblogs.com/funnyzpc/p/10801476.html" 前言(闲扯) 简单WEB应用 话说一个简单的WEB应用需要多少行依赖,多少行代码,运行需要多大的package,需要多大 ......

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)
      }
  • 最终效果图

    • 主页
      simple go web application & 二维码生成 & 打包部署

    • 结果
      simple go web application & 二维码生成 & 打包部署

打包部署

对于部署,在前面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