เห็นใน Go 1.13 beta 1 นั้นทำการกำหนดค่า default ของ GOPROXY ให้
จะวิ่งไปที่ https://proxy.golang.org และ direct (ออกไปยัง GitHub, bitbucket ตรง ๆ)
ที่สำคัญ สามารถใส่ comma(,) ได้ด้วย
นั่นคือกำหนด proxy ได้มากกว่า 1 นั่นเอง
ดังนั้นเรามาลองทำความรู้จักและใช้งานกันหน่อย

ทำไมต้องใช้ GOPROXY ด้วย ?

โดยค่าปกตินั้น Go module นั้น
จะทำการตรวจสอบ module/dependency ที่ใช้
ใน $GOPATH/pkg/mod
ถ้าไม่เจอจะไปที่ github, gitlab, bitbucket และอื่น ๆ ก็ว่าไป

ปัญหาคือ 

ถ้าออก internet ไม่ได้จะทำอย่างไร ?
ยิ่งในโลกของ container ยิ่งลำบากเพราะว่า
ต้องทำการ download module/dependency มาตลอด
เพราะว่าต้องทำการ build ใหม่ตลอด
หรือแก้ไขด้วยการทำ caching ใน container เอาอีก
ซึ่งดูลำบาก
ยิ่งการ scale ทีมหรือ project ก็ยิ่งยาก

ดังนั้นทางทีม Go จึงสร้าง GOPROXY ขึ้นมา

เพื่อแก้ไขปัญหาต่าง ๆ เหล่านี้ นั่นคือ
ให้เราสามารถสร้าง GOPROXY ได้เอง
เพื่อทำการเก็บ cached ของ module ต่าง ๆ ที่ download มาไว้
ทำให้ไม่ต้องทำการ download ใหม่ทุก ๆ ครั้ง
แสดงดังรูป

อยากรู้ว่าการทำงานของ GOPROXY เป็นอย่างไร ?

ว่าแล้วก็เขียน code ด้วยภาษา Go แบบง่าย ๆ
เพื่อ tracking ดูว่าทำงานอย่างไร ดังนี้

จากนั้นทำการ run หรือ start ขึ้นมา จะทำการ port=8080 นะ

เมื่อเรียบร้อยแล้ว สร้างระบบงานตัวอย่าง
โดยระบบงานตัวอย่างจะใช้งาน module color

ทำการ run และดูผลที่เกิดขึ้น
อย่าลืมไปลบ $GOPATH/pkg/mod ด้วย
มิเช่นนั้นจะไม่เห็นผลการทำงานที่ฝั่ง proxy ที่สร้างไว้

แต่ถ้า run ด้วยการไม่กำหนด direct ไปใน GOPROXY 
จะได้ผลคือ  ไม่พบข้อมูลของ module ที่ใช้งานดังนี้

นั่นหมายความว่า proxy จะมีรูปแบบของไฟล์และ folder ตามที่กำหนดด้วย
ประกอบไปด้วย

  • List of version ถ้า go ไม่รู้ว่าเราต้องการ version อะไร
  • ไฟล์ .mod หรือ Module metadata
  • ไฟล์ go.mod ของ module นั้น ๆ
  • Zip file ของ module

น่าพอเห็นภาพแล้วว่า GOPROXY ต้อง implement อะไรบ้าง

ไว้ค่อยไปทำต่อไป น่าจะเห็นแนวทาง คิดว่า น่าจะมีคนทำไว้ให้เราใช้แน่ ๆ
ก็ไปเจอ Go Proxy, Athens และ JFrog Go Registry

ยังไม่พอนะใน GOPROXY เราสามารถกำหนด path ตรง ๆ ได้เลย

ยกตัวอย่างเช่น

$export GOPROXY=file://mypath/to/module1,file://mypath/to/module2

น่าจะพอทำให้เห็นประโยชน์ของ GOPROXY กันบ้าง

Tags:,