小秦哥 发表于 2024-8-6 22:45:58

云端golang开辟,无需本地配置,能上网就能开辟和运行

欢迎访问我的GitHub

   这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
需求



[*]学习golang的时间,必要一个IDE,还必要一个能运行程序的环境,以及一个MySQL数据库
[*]对于有履历的程序员来说,自己动手安装摆设即可,但是小白和懒人也是存在的…
背景



[*]背景很简单:欣宸个人环境如下

[*]穷:有个能上网的破电脑,乃至电脑都没有,仅有个安卓平板(万幸的是有键盘鼠标,打字没问题)
[*]懒:不想安装golang,也不想安装vscode(如果只有安卓平板,就是想装也没办法装)


[*]面对如许无可救药的自己,内心还是想拯救一下,于是有了这篇文章,基于GitHub的Codespaces 快速搭建一套云端开辟环境,让穷、懒不再拖累我学习的热情…
前提



[*]用破电脑凭空打造golang开辟环境,必要以下两个前提条件

[*]能上网,因为要访问GitHub
[*]有个属于自己的GitHub账号


[*]准备好以上条件就开始吧
打造环境



[*]起首登录GitHub
[*]其次准备好一个代码堆栈,已有的或如今就新建都可以,我这里用的是旧堆栈,内里保存了多年的博客中用到的源码,是个超等大杂烩,有java工程的,也有golang的,还有一些ansible脚本,如下所示,不过没事儿,不影响,都能用
https://i-blog.csdnimg.cn/blog_migrate/a51be8c55f70d9687672bce5b3e8303e.png
[*]然后按照下图的数字顺序进行操纵,进入云端开辟环境的设置页面
https://i-blog.csdnimg.cn/blog_migrate/b9cd5954be2d9c053d89537a2c8d9839.png
[*]然后按照下图操纵,选择配置模板
https://i-blog.csdnimg.cn/blog_migrate/7d10d5b201e1626b75400f94fd28f185.png
[*]按照下图操纵,获取到配置模板,然后粘贴到自己项目的配置地区,再提交保存,如许就完成了自己的golang云开辟环境配置
https://i-blog.csdnimg.cn/blog_migrate/9607815a96bc4bc009f7172b8c055416.png
[*]注意上面的内容,共有两个配置项

[*]摆设了go1.18版本,您可以根据自己的必要修改,我这改成了1.19
[*]安装了docker(配置里叫docker-in-docker,因为咱们的云开辟环境就是个docker容器,官方文档中有说明)


[*]然后回到堆栈主页面,按照如下操纵,即可创建一个云开辟环境,用的是前面的配置
https://i-blog.csdnimg.cn/blog_migrate/8ae2d454e57cc1801106e0883d979f02.png
[*]然后必要等候几分钟,GitHub会根据您的配置创建新的云开辟环境
[*]稍作等候就会跳转到web版本的vscode页面,如下图(安卓平板电脑浏览器截图),资源管理器的内容就是您的GitHub堆栈的内容,由于我的堆栈中有很多java旧代码,被vscode辨认到之后会提示安装JDK,请无视掉这些提示,因为它们都和本篇无关
https://i-blog.csdnimg.cn/blog_migrate/77b0d88df32e065cc115ed47cacb65a0.jpeg
[*]如下图,在控制台查看golang和docker的版本,都符合预期,微软真是给力,web版IDE和服务器都白送
https://i-blog.csdnimg.cn/blog_migrate/2fba7da293b82170796ee2107a078104.jpeg
[*]用top下令查看资源环境,发现是2核4G的服务器资源
https://i-blog.csdnimg.cn/blog_migrate/b49f6a764f11f47d9ba01f1e6cd76234.jpeg
[*]实在微软还算慷慨,免费资源最多给到了4核8G,咱们回到堆栈页面去调解一下,如下图
https://i-blog.csdnimg.cn/blog_migrate/fdd9b6c4cb92c1d811690564c8ad4106.png
[*]如下图修改配置,并使其立即生效
https://i-blog.csdnimg.cn/blog_migrate/1dbd22653d893a1e8e8068520989f487.png
[*]至此,环境准备好了,咱们来写代码验证一下
设置GO111MODULE



[*]记得用go env看一下GO111MODULE环境变量的设置,因为接下来的项目是基于go mod进行管理的,所以要打开这个设置,最好是执行以下下令,使其生效
go env -w GO111MODULE=on
验证之一:helloworld



[*]接下来咱们基于gin新建一个web服务,试试这个开辟环境能否正常利用
[*]在web版的vscode上,找个干净目次,例如我这边新建名为test003的文件夹
[*]用go mod下令新建module
go mod init test003


[*]下载和安装gin
go get -u github.com/gin-gonic/gin


[*]新建main.go文件,内容如下
package main

import "github.com/gin-gonic/gin"

func main() {
        router := gin.Default()
        router.GET("/", func(c *gin.Context) {
                c.JSON(200, gin.H{
                        "message": "hello world",
                })
        })
        router.Run()
}



[*]执行go mod tidy解决依赖
[*]末了执行go run main.go将服务运行起来
@zq2599 ➜ /workspaces/blog_demos/tutorials/test003 (dev) $ go run main.go
Creating an Engine instance with the Logger and Recovery middleware already attached.

Running in "debug" mode. Switch to "release" mode in production.
- using env:   export GIN_MODE=release
- using code:gin.SetMode(gin.ReleaseMode)

GET    /                         --> main.main.func1 (3 handlers)
You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
Environment variable PORT is undefined. Using port :8080 by default
Listening and serving HTTP on :8080
2023/02/04 - 14:10:22 | 200 |      58.7µs | 220.246.254.226 | GET      "/"
2023/02/04 - 14:10:22 | 404 |         900ns | 220.246.254.226 | GET      "/favicon.ico"


[*]再去看端口这个Tab页,如下图,发现gin监听的8080端口已经被forward到一个公网地址,点击赤色箭头的图标,用浏览器访问这个地址
https://i-blog.csdnimg.cn/blog_migrate/842fbf888ac80dc56d3e0b694a930e43.png
[*]可以或许收到body响应,证实刚才的代码已经生效了,至此云端的IDE和运行环境都验证通过
https://i-blog.csdnimg.cn/blog_migrate/15f297571f36f41e329a6931310363a7.png
[*]至此,云端开辟运行根本的web应用没问题了,咱们再试试数据库的摆设和操纵
验证之二:docker摆设MySQL



[*]go服务操纵MySQL数据库是很常见的,这里咱们也在云开辟环境验证一下
[*]如今的环境已摆设了docker服务,所以用docker安装MySQL最省事儿,一行下令即可
docker run \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-d \
mariadb:10.3


[*]微软服务器的网络环境真好,如下图,docker镜像下载得飞快
https://i-blog.csdnimg.cn/blog_migrate/11067f08be108f2f115f4f22f6b0027d.png
[*]进入容器
docker exec -it mysql /bin/bash


[*]如今已经在MySQL容器中了,执行以下下令直接进入mysql下令行模式
mysql -uroot -p123456


[*]新建名为demo的数据库
create database demo;
use demo;


[*]数据库准备完毕,接下来接着刚才的module继续开辟,先安装gorm和MySQL驱动
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql


[*]再在gin上新增一个路由,对应的操纵是接收求参数,在数据库新增一条纪录,由于代码过于简单就不多废话了,在下面直接全部贴出来
package main

import (
        "fmt"
        "strconv"

        "github.com/gin-gonic/gin"
        "gorm.io/driver/mysql"
        "gorm.io/gorm"
)

type Student struct {
        gorm.Model
        Name string
        Ageuint64
}

// 全局数据库 db
var db *gorm.DB

// 包初始化函数,可以用来初始化 gorm
func init() {
        // 账号
        username := "root"
        // 密码
        password := "123456"
        // mysql 服务地址
        host := "127.0.0.1"
        // 端口
        port := 3306
        // 数据库名
        Dbname := "demo"

        // 拼接 mysql dsn,即拼接数据源,下方 {} 中的替换参数即可
        // {username}:{password}@tcp({host}:{port})/{Dbname}?charset=utf8&parseTime=True&loc=Local&timeout=10s&readTimeout=30s&writeTimeout=60s
        // timeout 是连接超时时间,readTimeout 是读超时时间,writeTimeout 是写超时时间,可以不填
        dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)

        // err
        var err error
        // 连接 mysql 获取 db 实例
        db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil {
                panic("连接数据库失败, error=" + err.Error())
        }

        // 设置数据库连接池参数
        sqlDB, _ := db.DB()
        // 设置数据库连接池最大连接数
        sqlDB.SetMaxOpenConns(10)
        // 连接池最大允许的空闲连接数,如果没有sql任务需要执行的连接数大于2,超过的连接会被连接池关闭
        sqlDB.SetMaxIdleConns(2)

        // 建表
        db.AutoMigrate(&Student{})
}

func main() {

        router := gin.Default()
        router.GET("/", func(c *gin.Context) {
                c.JSON(200, gin.H{
                        "message": "hello world",
                })
        })

        router.GET("/create", func(c *gin.Context) {
                name := c.DefaultQuery("name", "小王子")
                ageStr := c.DefaultQuery("age", "1")

                var age uint64
                var err error
                if age, err = strconv.ParseUint(ageStr, 10, 32); err != nil {
                        age = 1
                }

                fmt.Printf("name [%v], age [%v]\n", name, age)

                student := &Student{
                        Name: name,
                        Age:age,
                }

                if err := db.Create(student).Error; err != nil {
                        c.JSON(500, gin.H{
                                "code":    0,
                                "message": "insert db error",
                        })

                        return
                }

                c.JSON(200, gin.H{
                        "code":    0,
                        "message": fmt.Sprintf("insert db success [%+v]", student.Model.ID),
                })

        })
        router.Run()
}


[*]再次执行go run main.go运行应用,继续利用云开辟环境给出的forward地址,如下图赤色箭头所指,这次要在后面加上path和参数/create?name=Tom&age=10
https://i-blog.csdnimg.cn/blog_migrate/a97f9495b2e229fd0610657ea7a4abf2.png
[*]浏览器成返回新增纪录的id
https://i-blog.csdnimg.cn/blog_migrate/6f5741e904a704a787641d87a0b07455.png
[*]登录MySQL查一下表,如下,数据全部写入成功
root@5e9f15ab9ac1:/# mysql -uroot -p123456
Welcome to the MariaDB monitor.Commands end with ; or \g.Your MariaDB connection id is 42Server version: 10.3.37-MariaDB-1:10.3.37+maria~ubu2004 mariadb.org binary distributionCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> use demo;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedMariaDB > select * from students;+----+-------------------------+-------------------------+------------+------+------+| id | created_at            | updated_at            | deleted_at | name | age|+----+-------------------------+-------------------------+------------+------+------+|1 | 2023-02-05 02:05:56.733 | 2023-02-05 02:05:56.733 | NULL       | Tom|   10 ||2 | 2023-02-05 02:09:35.537 | 2023-02-05 02:09:35.537 | NULL       | Tom|   10 ||3 | 2023-02-05 02:10:43.815 | 2023-02-05 02:10:43.815 | NULL       | Tom|   10 ||4 | 2023-02-05 02:10:45.069 | 2023-02-05 02:10:45.069 | NULL       | Tom|   10 ||5 | 2023-02-05 02:10:45.717 | 2023-02-05 02:10:45.717 | NULL       | Tom|   10 ||6 | 2023-02-05 02:10:46.000 | 2023-02-05 02:10:46.000 | NULL       | Tom|   10 ||7 | 2023-02-05 02:10:46.213 | 2023-02-05 02:10:46.213 | NULL       | Tom|   10 ||8 | 2023-02-05 02:10:46.578 | 2023-02-05 02:10:46.578 | NULL       | Tom|   10 ||9 | 2023-02-05 02:10:46.780 | 2023-02-05 02:10:46.780 | NULL       | Tom|   10 || 10 | 2023-02-05 02:10:46.976 | 2023-02-05 02:10:46.976 | NULL       | Tom|   10 || 11 | 2023-02-05 02:10:47.155 | 2023-02-05 02:10:47.155 | NULL       | Tom|   10 || 12 | 2023-02-05 02:10:47.359 | 2023-02-05 02:10:47.359 | NULL       | Tom|   10 |+----+-------------------------+-------------------------+------------+------+------+12 rows in set (0.000 sec) 桌面版



[*] 可能有些读者对网页面的IDE心存顾虑:操纵流畅度和体验方面与传统桌面版有差距,或者说习惯了桌面版(重要是不像欣宸这么穷,破电脑只够运行浏览器),这时间还可以用本地桌面版远程连接云开辟环境,这时间编码在本地vscode,而编译运行还在之前的云环境进行,既解决了习惯问题,又不影响白嫖微软服务器,依旧是快乐满满,具体操纵方法如下,点击赤色箭头所指的菜单
https://i-blog.csdnimg.cn/blog_migrate/4124b6174deb4a1dfdb881fe51b51fcf.png
[*] 此时浏览器就会拉起本地vscode
https://i-blog.csdnimg.cn/blog_migrate/600d8234c84cee3599cbc7efcc319cba.png
[*] 拉起的过程可能没那么顺利,会要求您的vscode登录GitHub账号,然后再重新拉起,多折腾几次就可以了,拉起后的效果如下,和在本地运行项目看不出区别
https://i-blog.csdnimg.cn/blog_migrate/59594b09fe041ae19fcaaa247e97b108.png
[*] 一切都符合预期,可见微软诚不欺我,4核8G服务器资源免费用,诚意满满
[*] 这下好像找不到偷懒的来由了,电脑破没关系,不想安装设置也没关系,没有服务器也没关系,GitHub都为你准备好了,还有什么来由不静下心来认真学习呢?
[*] 了解更多codespaces详情,请访问官方资料:https://docs.github.com/zh/codespaces/overview
你不孤单,欣宸原创一路相伴


[*]Java系列
[*]Spring系列
[*]Docker系列
[*]kubernetes系列
[*]数据库+中间件系列
[*]DevOps系列

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 云端golang开辟,无需本地配置,能上网就能开辟和运行