桌面版vscode用免費的微軟4核8G伺服器做遠程開發(編譯運行都在雲上,還能自由創建docker服務)

来源:https://www.cnblogs.com/bolingcavalry/archive/2023/08/20/17642364.html
-Advertisement-
Play Games

GitHub的Codespaces為個人用戶提供了免費的4核8G伺服器資源,今天就來實戰如何用桌面版vscode連接codespace伺服器做遠程開發,把編譯運行下載等耗時耗資源的操作都轉移到雲端進行,還能為應用創建各種docker服務,這都不要錢! ...


歡迎訪問我的GitHub

這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos

本篇概覽

  1. 網頁版vscode,其效果體驗已經接近桌面版,實測電腦、iPad Pro、華為MatePad Pro的瀏覽器上都能使用
  2. 遠程開發,編譯和運行GitHub倉庫的代碼,實際操作是在4核8G的微軟伺服器上進行的,而這伺服器資源對個人GitHub用戶是免費的
  • 然而,對一些專一的程式員而言,網頁版vscode做得再好也沒有興趣,畢竟桌面版vscode已經很優秀,習慣後實在沒必要換成網頁版
  • 但4核8G免費伺服器的誘惑擺在眼前,豈能輕言放棄,於是就有了這篇文章:桌面版vscode遠程開發,遠程伺服器是Codespaces的免費伺服器
  • 另外還有一個衍生需求:這個免費的4核8G伺服器,除了運行應用,還能做其他的事情嗎?例如運行一些後臺服務,為咱們的開發自測帶來便利
  • 其實Codespaces官方是支持這些特性的,如下圖所示,紅框中就是桌面版vscode,本文要做的就是實戰體驗這個功能,再在Container中加入docker,讓更多服務運行在這個docker上
    在這裡插入圖片描述

實戰目標

  • 為了突出實用性,本文不會照抄官方文檔,而是模擬一次常規的開發過程,作為一個Java程式員,開發SpringBoot應用並操作資料庫是個很有代表性的場景,因此,本篇會實現下圖的效果:在VSCODE桌面版編碼,而應用和MySQL(docker版)都運行在CodeSpace伺服器上
    在這裡插入圖片描述

  • 將上述任務拆分成以下步驟去完成

  1. 在vscode桌面版進行全部操作
  2. 在vscode上做設置,使其支持Codespaces
  3. 基於GitHub倉庫創建codespace
  4. 個性化設置,如設定jdk,添加docker服務
  5. 在伺服器上部署MySQL
  6. GitHub倉庫拉新分支
  7. 在新分支開發一個SpringBoot應用,可以操作剛纔部署好的MySQL
  8. 用單元測試驗證應用的基本功能
  9. 啟動應用,用web頁面驗證基本功能
  • 經歷了上述實戰,對於codespace是否具備實用型這個問題,相信您應該會有自己的判斷了

重要前提

  • 以下是能愉快進行本篇操作的重要前提
  1. 您的網路可以訪問GitHub
  2. 您有自己的GitHub賬號
  3. 您有自己的代碼倉庫
  4. 欣宸是個普通的Java程式員,所以在開發體驗中用的是Java相關技術棧,例如代碼工程是SpringBoot的,如果您擅長的是其他語言,請自行調整

環境信息

  • 以下是本次實戰的環境信息,可以作為參考
  1. 操作系統:macOS Monterey(M1 Pro晶元的MacBook Pro,16G記憶體)
  2. vscode: 1.67.2 (Universal)
  3. JDK:8
  4. MySQL:8.0.29
  5. SpringBoot:2.7.0
  • 結束閑聊,接下來開始實戰

在vscode上做設置,使其支持Codespaces

  • 打開vscode,安裝codespaces插件,操作如下圖
    在這裡插入圖片描述

  • 登錄GitHub
    在這裡插入圖片描述

  • 點擊同意後,會打開瀏覽器驗證身份,再並彈出如下菜單
    image-20220603102400303

  • vscode彈出確認
    image-20220603102523684

  • 現在進入了Codespaces管理頁面,現在創建一個新的codespace,如下圖,選擇對應的代碼倉庫
    image-20220603103947429

  • 然後選擇分支
    image-20220603104033045

  • 現在靜候後臺伺服器初始化,大概幾分鐘後,頁面如下,codespace創建成功,4核8G微軟伺服器到手,該琢磨怎麼用了
    在這裡插入圖片描述

新建分支

  • 為了不影響當前倉庫的代碼,這裡新建一個分支,操作如下圖
    在這裡插入圖片描述

  • 我這裡新建了名為vscode-desktop-tutorial的分支,裡面沒有任何內容

個性化設置

  • 開始後臺環境的個性化設置,這裡簡單起見僅設置兩個特性:
  1. JDK設置成8
  2. 增加docker服務
  • 打開命令面板,輸入Add Development Container Configuration Files...然後回車
    在這裡插入圖片描述

  • 系統會列出諸多預設環境供我們選擇,Java8是現成的,果斷選擇
    在這裡插入圖片描述

  • 選擇debian操作系統的版本
    在這裡插入圖片描述

  • Node.js?謝謝,不用了
    在這裡插入圖片描述

  • 構建工具選擇maven

image-20220604115444000
  • 其他特性列表中,選擇下圖紅框中的Docker (Moby) supoort,這樣咱們的伺服器就有了docker服務
image-20220604115552699
  • 做完這一切後屏幕右下角會彈出提示,如下圖,註意:不要點擊下圖紅框的按鈕!不要點擊
image-20220604115804875
  • 之所以不立即構建,因為還要給當前codespace增加兩個vscode插件:SpringBoot和Lombok,下圖是剛纔的設置結束後自動新增的devcontainer.json文件,增加黃框中的內容
image-20220604200739756
  • 如果您好奇我是如何知道SpringBoot插件對應的名字是Pivotal.vscode-boot-dev-pack,可以瀏覽插件市場官方網站:https://marketplace.visualstudio.com/items ,這裡面的每個插件都有自己的Unique Identifier,如下圖紅框所示

image-20220604150015155

  • 現在可以構建鏡像並重建容器了,按照下圖操作即可
image-20220604120207490
  • 點擊下圖紅框中的按鈕就能看到構建鏡像的過程,如果出錯了也能在這裡找到問題原因
image-20220604120452488
  • 建議將剛纔新增的devcontainer.json和Dockerfile文件提交到GitHub保存,這樣下次新建codespace時,因為它們的存在,codespace會根據它們去構建鏡像,於是每個新的codespace都會帶上之前添加的個性化設置

  • 容器重建完成後,在TERMINAL用maven和docker命令驗證,全部符合預期

image-20220604121004214

  • 伺服器算是設置得差不多了,接下來藉助Docker部署MySQL

部署MySQL

  • 接下來在vscode的TERMINAL上操作,也就是在後臺伺服器的控制台操作,如下圖
image-20220604151752774
  • 新建一個文件夾,用來存儲MySQL的資料庫文件,這樣即便容器被刪除資料庫文件也在,我這裡是/workspaces/java-demo/mysql-data
  • 藉助docker創建資料庫也就是一行命令的事兒,完整命令如下,版本是8.0.29,root賬號密碼是123456
docker run \
--name mysql \
-p 3306:3306 \
-v /workspaces/java-demo/mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-idt \
mysql:8.0.29 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
  • 因為本地沒有MySQL鏡像,於是微軟伺服器去docker鏡像倉庫拉取鏡像,那網速看著真是賞心悅目
image-20220604152425084
  • MySQL容器很快就啟動了,執行以下命令進入容器內部
docker exec -it mysql /bin/bash
  • 在容器內部就可以用mysql命令來操作資料庫了
@zq2599 ➜ ~ $ docker exec -it mysql /bin/bash
root@f6a9dcc7fdcd:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.29 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
  • 接下來用命令建庫、建表、新增記錄,參考命令如下(這裡建了個賣家表,裡面有主鍵、賣家名稱、產品數量三個欄位)
# 建資料庫
CREATE DATABASE first_db;

# 選中資料庫
use first_db;

# 建表
CREATE TABLE IF NOT EXISTS `seller`(
    `id` INT UNSIGNED AUTO_INCREMENT,
    `name` VARCHAR(100) NOT NULL,
    `product_num` INT NULL,
    PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

# 新增三條記錄
insert into seller (name, product_num) values ('seller1', 1111);
insert into seller (name, product_num) values ('seller2', 2222);
insert into seller (name, product_num) values ('seller3', 3333);
  • 完成了,接下來寫個SpringBoot應用,然後運行起來操作資料庫

開發SpringBoot應用

  • 命令行面板,輸入下圖紅框中的內容,選擇Spring Initializr
image-20220604155446315
  • 選擇SpringBoot版本
image-20220604155559748
  • 選擇語言
image-20220604155623041
  • 然後是GAV坐標,java版本等,最後是依賴模塊,我這裡選擇了web和lombok
image-20220604155816261
  • 項目名稱我這裡是demo
  • 最後是源碼目錄,我這裡是/workspaces/java-demo/,所有操作完成後,右下角提示新增workspace,點擊Open,會打開新的workspace視窗,裡面是java工程的視圖,如下圖所示,一定要用這個新的workspace,因為它是以demo目錄為根目錄層級,可以讓java和maven插件識別成功,而原有的workspace以java-demo為根目錄層級,導致新增的java項目無法被java和maven插件識別

image-20220604165449543

  • 接下來要修改代碼,增加資料庫操作的功能,關於java訪問MySQL的代碼,就不在本篇多說了,您可以在我的GitHub倉庫查看詳細源碼,地址是:https://github.com/zq2599/java-demo/tree/vscode-desktop-tutorial ,代碼在下圖紅框內,一定要選vscode-desktop-tutorial分支
image-20220604201541977
  • 這個SpringBoot應用是通過MyBatis庫來訪問MySQL的,其配置文件如下,可見連接資料庫用的是127.0.0.1,因為MySQL的3306埠已經映射到應用所在伺服器的3306埠
server:
  port: 8080

spring:
  # 數據源
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/first_db?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver

# mybatis配置
mybatis:
  # 配置文件所在位置
  config-location: classpath:mybatis-config.xml
  # 映射文件所在位置
  mapper-locations: classpath:mappers/*Mapper.xml

# 日誌配置
logging:
  level:
    root: INFO
    com:
      bolingcavalry:
        demo:
          mapper: debug

驗證-單元測試

  • 來看看這個SpringBoot應用的單元測試類,是查詢id等於1的記錄,並驗證查詢結果的合法性
package com.bolingcavalry.demo;

import org.junit.jupiter.api.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.bolingcavalry.demo.entity.Seller;
import com.bolingcavalry.demo.service.SellerService;

@SpringBootTest
class DemoApplicationTests {

	@Autowired
	SellerService sellerService;

	@Test
	void testGetById() {
		int id = 1;
		Seller seller = sellerService.get(id);
		// 判定非空
        Assertions.assertNotNull(seller);
		// id相等
		Assertions.assertEquals(id, seller.getId());
	}
}
  • 點擊下圖紅框中的按鈕,執行單元測試通過,證明讀資料庫一切正常
image-20220604202857131

驗證:web

  • 這個SpringBoot應用有一個web介面,源碼如下
@RestController
@Slf4j
public class SellerController {
    
    @Autowired
    private SellerService sellerService;

    @RequestMapping(value = "/seller/{id}", method = RequestMethod.GET)
    public Seller get(@PathVariable("id") Integer id) {
        log.info("get entity, id=[{}]", id);
        return sellerService.get(id);
    }
}
  • 點擊下圖紅框中的按鈕啟動應用
image-20220604203203087
  • 確認8080出現在埠映射列表中
image-20220604203306357 image-20220604203421793
  • 驗證完成

提交到GitHub

  • 最後記得將代碼和codespace配置提交到GitHub倉庫
  • 由於新建的/workspaces/java-demo/mysql-data目錄里保存的是MySQL資料庫文件,沒必要提交到GitHub,建議在.gitignore中添加此目錄,位置和內容如下
image-20220604204011140
  • 至此,一次典型的SpringBoot應用開發和調試過程就完成了,整個過程中vscode作為文本編輯和命令輸入的工具,編譯、單元測試、運行、docker服務這些都在遠程codespace後臺運行,下載鏡像和jar包也是伺服器去做的,實際網速非常理想,本地電腦始終保持低資源消耗,流暢的體驗貫穿始終(網路要保持穩定)

  • 希望本篇能給您一些參考,白piao微軟,我們一直在努力...

歡迎關註博客園:程式員欣宸

學習路上,你不孤單,欣宸原創一路相伴...


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 前提 之前曾經寫過一篇[《SpringBoot3.x 原生鏡像-Native Image 嘗鮮》](https://vlts.cn/post/spring-boot-native-image-demo),當時`SpringBoot`處於`3.0.0-M5`版本,功能尚未穩定。這次會基於`Spr ...
  • ### POM.XML配置 ``` 4.0.0 com.shouke des-utils 1.0 1.8 ${java.version} ${java.version} UTF-8 UTF-8 cn.hutool hutool-all 4.1.0 ``` ## 代碼實現 ```groovy pack ...
  • # 網路編程 ## 一、概述 網路編程是指編寫運行在多個設備(電腦)的程式,這些設備都通過網路連接起來。 ### 電腦網路 把分佈在不同地理區域的電腦與專門的外部設備用通信線路互連成一個規模大,功能強的網路系統, 從而使眾多的電腦可以方便地互相傳遞信息,共用硬體,軟體,數據信息等資源。 ## ...
  • 在Python中,元組(Tuple)是一種有序且不可變的數據類型。元組可以包含任意數量的元素,用逗號分隔,並用圓括弧括起來。與列表(List)不同,元組的元素不能修改。元組與列表一樣,可以通過索引訪問其中的元素。 ```python my_tuple = ("apple", "banana", "c ...
  • OpenAI的Karpathy利用周末搞了一個迷你Llama2項目llama2.c用500行C語言實現無任何依賴項的推理程式,此項目在github發佈以來衍生出了基於各種語言的迷你Llama推理實現llama2.go、llama2.java、llama2.py等等; 但該項目原本的模型並不支持中文, ...
  • # wangyi > 記錄一次某大廠筆試的AC過程 ![image-20230820152914557](https://img2023.cnblogs.com/blog/2862884/202308/2862884-20230820160050687-208549606.png) ``給定一個二維 ...
  • ## 一,下載安裝相關 ### 1,這個軟體什麼作用? Anaconda:Python大禮包(包含解析器,一系列庫,軟體包管理器Conda) 主要作用,不用配庫,如果需要庫a,anaconda會把庫a相關的依賴庫一併打包下載 次要作用,可以同時安裝不同版本的python,和對應依賴庫,相互隔離。 # ...
  • [TOC] # 本篇前瞻 好的,現在你已經來到一個新的小結,在這裡你將學習到go語言的重要內容,習得go 25個關鍵字中的12個:var, const, if, else, switch, case, default, fallthrough, for, break, goto, continue, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...