āļĢāļđāđāļāļąāļāļāļąāļāļ āļēāļĐāļē Go āđāļāļāļŠāļąāđāļāđ
- āļŠāļĢāđāļēāļāđāļāļĒ Google āļāļēāļāļāļĢāļąāđāļāđāļĢāļĩāļĒāļāļ§āđāļē golang
- āļŠāļĢāđāļēāļāļāļķāđāļāđāļāļ·āđāļāđāļāđāđāļāļāđāļāļāļāļāļĢāđāļāļāļāļāļ C++
- āđāļāđāļŠāļģāļŦāļĢāļąāļ: āļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāļĢāļ°āļāļāđāļĨāļ°āđāļāļīāļĢāđāļāđāļ§āļāļĢāđāļāļĩāđāļāļĢāļąāļāļāļāļēāļāđāļāđ
- āļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļŠāļđāļ
- āļĄāļĩāđāļ§āļĒāļēāļāļĢāļāđāļāļĩāđāļāđāļēāļāļāđāļēāļĒ
āđāļāļĩāļĒāļāđāļāļĒ
Sirasit Boonklang – BorntoDev Co., Ltd.
Serverless architecture āđāļāđāļāļāļēāļĢāļāļąāļāļāļēāđāļāļāđāļāļāđāļĢāļĩāļĒāļāđāļāđ logic āļāļķāđāļāļāļ°āđāļāđāļāļēāļāļāļāļĢāļ°āļāļāļāļĨāļēāļ§āļāđ āđāļāļĒāļĄāļĩāļāļēāļĢāļāļąāļāļāļēāļĢ infrastructure āļāļāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđāļāđāļāļĒāļĨāļ
Azure Functions āļāļ·āļāļāļĢāļīāļāļēāļĢāļŦāļāļķāđāļāđāļ Microsoft Azure āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāđāļāļēāļ Serverless architecture āđāļāļĒāļāļ°āļĄāļĩāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđāđāļāđāļāļŦāļĢāļ·āļāļāļļāļāļāļģāļŠāļąāđāļāļāļēāļĄāļāļĩāđāļāļ§āļēāļĄāļāđāļāļāļāļēāļĢ āđāļāļĒāđāļĄāđāļāđāļāļāļāļąāļāđāļāļĢāļĩāļĒāļĄāđāļāļīāļĢāđāļāđāļ§āļāļĢāđāđāļāļ
āđāļāļĒ Azure Functions āļāļ°āļĄāļĩāļĢāļąāļāđāļāļĄāđāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ āļēāļĐāļē āļāļķāđāļāļŦāļēāļāđāļĄāđāļĄāļĩāļ āļēāļĐāļēāļāļĩāđāļāđāļāļāļāļēāļĢāđāļŦāđāđāļĢāļēāđāļĨāļ·āļāļāđāļāđāļāļąāļ§āļāļąāļāļāļēāļĢāđāļāļāļāļģāļŦāļāļāđāļāļāļŦāļĢāļ·āļāļāļĩāđāđāļĢāļĩāļĒāļāļ§āđāļē Custom handlers āđāļāđ
Custom handlers āļāļ·āļāļāļ°āđāļĢ
Custom handlers āļāļ·āļāđāļ§āđāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđāļāļĩāđāļĢāļąāļ events āļāļēāļ Functions host
āļāļēāļāļāļąāđāļāđāļĢāļēāļāļ°āđāļāļĩāļĒāļāđāļāđāļāđāļāļ āļēāļĐāļēāļāļĩāđāđāļĢāļē Request āđāļāļ·āđāļāļĢāļāļĢāļąāļ response āļāđāļ events āļāļąāđāļ āđ āđāļĨāļ°āļ āļēāļĐāļēāļāļĩāđāđāļāđāļāļēāļāđāļāđāļāđāļāļ·āļāļ āļēāļĐāļēāļāļĩāđāļĢāļāļāļĢāļąāļ HTTP āļāļąāđāļāđāļāļ āļāļķāđāļÂ Go āļāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļēāļāđāļāđāļāļ°āļāļĢāļąāļÂ
Concepts and flow āļāļĩāđāļŠāļģāļāļąāļāļāļāļ Azure Functions
- Triggers āļāļ·āļ events āļāļĩāđāđāļĢāļīāđāļĄāđāļĢāļĩāļĒāļāđāļāđāļāļąāļāļāđāļāļąāļ
āļāļĢāļīāļāđāļāļāļĢāđāđāļāļĒāļāļąāđāļ§āđāļāđ āđāļāđāļ HTTP requests, queue messages, āļŦāļĢāļ·āļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāđāļāļĄāļđāļĨāđāļāļāļēāļāļāđāļāļĄāļđāļĨ - Bindings āļāļ·āļ āđāļāđāļāļāļąāļ§āļāđāļ§āļĒāļāļĩāđāđāļāļ·āđāļāļĄāļāđāļāļāļąāļāļāđāļāļąāļāļāļąāļāļāļĢāļīāļāļēāļĢāļāļĨāļēāļ§āļāđāļāļ·āđāļ āđāļāļ·āđāļāļĄāđāļĒāļāļāļīāļāļāļļāļāđāļĨāļ°āđāļāļēāļāđāļāļļāļ āļŠāļēāļĄāļēāļĢāļāļŠāđāļāļāđāļāļĄāļđāļĨāđāļāđāļēāđāļĨāļ°āļāļāļāļāļēāļāļāļąāļāļāđāļāļąāļāđāļāđ
- Functions host āđāļāđāļāļāļ§āļāļāļļāļĄ event flow āļāļāļāđāļāļāļāļĨāļīāđāļāļāļąāļ āđāļĄāļ·āđāļ host āļāļąāļ events āļāļąāļ§āļāļąāļāļāļēāļĢāļāļ°āļāļđāļāđāļĢāļĩāļĒāļāđāļāđāđāļĨāļ°āļŠāđāļāļāļ·āļāļāļēāļĢāļāļāļāļŠāļāļāļāļāļāļāļāļąāļāļāđāļāļąāļ
āđāļĢāļēāļĄāļēāđāļĢāļīāđāļĄāļŠāļĢāđāļēāļ REST API āļāđāļ§āļĒ Go āļāļąāļāđāļĨāļĒÂ
1.āđāļĢāļīāđāļĄāļāļēāļāļāļēāļĢāļŠāļĢāđāļēāļ REST API āđāļāļĒāđāļāđ Go āļāļēāļĢāđāļāđāļāļēāļāđāļĨāļāļĢāļēāļĢāļĩ fmt āđāļĨāļ° net/http āļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļēāļĢ routes āđāļĨāļ° requests āļāļĩāđāđāļāđāļēāļĄāļē āđāļāļĒāđāļāđāļāļģāļŠāļąāđāļāļāđāļāđāļāļāļĩāđ
import ( Â Â Â Â "fmt" Â Â Â Â "net/http" )
2. āļāļēāļĢāļāļąāđāļāļāđāļēāļāļģāļŦāļāļ routes āļāļĢāļ°āļāļāļāļāđāļ§āļĒāļŠāđāļ§āļ logical āļāļĩāđāđāļĢāļĩāļĒāļāļ§āđāļē routes āļŦāļĢāļ·āļ āđāļŠāđāļāļāļēāļ
routes āļāļ·āļāļāļĩāđāļāļĒāļđāđāļāļāļ respond āđāļāđāļāļ āđāļāļāļēāļĢāļāļąāđāļāļāđāļē routes āđāļŦāđāđāļĢāļĩāļĒāļāđāļāđāđāļĄāļāļāļ HandleFunc() āļāļāļāļīāļāļŠāđāļāļāļāđ http āđāļĨāļ°āļāļģāļŦāļāļ routes āđāļāļ·āđāļāļāļāļāļŠāļāļāļāļāđāļāļāļģāļāļ āđāļāļĒāđāļāļāļĢāļāļĩāļāļĩāđ āļāļ°āļāđāļāļāļŠāļĢāđāļēāļāļāļąāļāļāđāļāļąāļ handleRoute āđāļāļ·āđāļāļāļąāļāļāļđāđ requests āļāļĩāđāđāļāđāļēāļĄāļēāļāļąāļ routes “/”
http.HandleFunc("/", handleRequest)
3. āđāļāļĒāļāļēāļĢāļāļąāļāļāļēāļĢāļāļąāļ requests āļāļĩāđāđāļāđāļēāļĄāļēāđāļĨāļ°āļāļ°āļāđāļāļāļĄāļĩāļāļąāļ§āļāđāļēāļāļŠāļīāđāļāļāđāļēāļ āđ āļāļĩāđāđāļāđāļēāļĄāļēāļāļĩāļāļāđāļ§āļĒ āđāļāđāļÂ
āđāļĢāļēāđāļāļāļĢāđ āļāļēāļĢāļēāļĄāļīāđāļāļāļĢāđāļŦāļĢāļ·āļāđāļāļ·āđāļāļŦāļēāļāđāļēāļāđ āļāļēāļāļāļąāđāļāļāļ° respond āđāļāļĒāļąāļ āļāļąāļāļāđāļāļąāļāļāļĩāđāļāļąāļāļāļēāļĢ requests āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāļĩāđ
func handleRequest(w http.ResponseWriter, r *http.Request) { Â Â Â Â fmt.Fprintf(w, "Hello") }
4. āļŠāļĢāđāļēāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđāđāļāļ·āđāļāđāļŦāđāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļģāļāļāđāļāđ āđāļāļĒāļāļēāļĢāđāļĢāļīāđāļĄāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđ āļāļ°āļāđāļāļāļĢāļ°āļāļļāļŠāđāļ§āļāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļŠāđāļāļāļģāļāļāđāļāđ āđāļāļĒāđāļāđāļāļāđāļāđāļāļāļĩāđāļāļ°āđāļŠāļāļāļ§āļīāļāļĩāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđ
package main  import (     "fmt"     "net/http" )  func handleRequest(w http.ResponseWriter, r *http.Request) {     fmt.Fprintf(w, "My Rest API") }  func main() {     http.HandleFunc("/", handleRequest)     http.ListenAndServe(":3000", nil) }
5. āđāļāļīāļĢāđāļāđāļ§āļāļĢāđāļāļģāļāļēāļāđāļĨāđāļ§āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļāļĢāļąāļ requests āļāļāļāļāļĢāđāļ 3000 āđāļāđ
āļāļēāļĢāđāļāđ custom handler āđāļāļāļēāļĢāļŠāļĢāđāļēāļ serverless app āļāđāļ§āļĒ Azure Function
6. āđāļāļīāļ Visual Studio Code āđāļĨāđāļ§āđāļĨāļ·āļāļ View > Command Palette
7. āđāļĨāļ·āļāļ Azure Functions: Create New Project
8. āđāļĨāļ·āļāļāđāļāļĨāđāļāļāļĢāđ āđāļāļĨāđāļāļāļĢāđāļāļąāļāļāļļāļāļąāļ
9. āđāļāđāļĨāļ·āļāļāļ āļēāļĐāļēāđāļāđāļ Custom Handler
10. āđāļĨāļ·āļāļāđāļāļĄāđāļāļĨāļāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāđāļāļąāļāđāļĢāļ āđāļāļĒāđāļĨāļ·āļāļāđāļāđāļ HttpTrigger
11. āļāļąāđāļāļāļ·āđāļāđāļāļāļāļāļāđāļĢāļē āđāļāļĒāļāļąāļ§āļāļĒāđāļēāļāļāļĩāđāļāļ·āđāļāļ§āđāļē âmyappâ
12. āđāļĨāļ·āļāļāļĢāļ°āļāļąāļāļāļēāļĢāđāļŦāđāļŠāļīāļāļāļīāđāđāļāđāļ anonymous (āļŠāļēāļĄāļēāļĢāļāđāļāļĨāļĩāđāļĒāļāđāļāđāđāļāļ āļēāļĒāļŦāļĨāļąāļ)
13.āđāļāļĒāļĢāļ°āļāļāļāļ°āļŠāļĢāđāļēāļāđāļāļĨāđāđāļĢāļīāđāļĄāļāđāļāđāļāļāļĨāļąāļāļĐāļāļ°āļāļąāļāļāļĩāđ
14.āļāļąāđāļāļāļāļāļāļąāļāđāļāļāļ·āļāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāļāļĩāđāļāļāļāļŠāļāļāļāļāđāļ HTTP trigger āđāļāđ
āļŠāļĢāđāļēāļāđāļāļĨāđāļāļ·āđāļ server.go āļāļĩāđ root āļāļāļāđāļāļĢāđāļāļāļāđ
15. āđāļĢāļĩāļĒāļāđāļāđāđāļĨāļāļĢāļēāļĢāļĩāļŠāļģāļŦāļĢāļąāļāļŠāļĢāđāļēāļāđāļāļ HTTPÂ āļāđāļ§āļĒāđāļāđāļāļāļąāļāļāđāļāđāļāļāļĩāđ
package main  import (  "fmt"  "io/ioutil"  "log"  "net/http"  "os" )
16. āđāļāļīāđāļĄāđāļāđāļāļāđāļāđāļāļāļĩāđāļŦāļĨāļąāļāļāļģāļŠāļąāđāļāđāļĢāļĩāļĒāļāđāļāđāļāļēāļāđāļĨāļāļĢāļēāļĢāļĩ
func main() { Â Â Â Â customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT") Â Â Â Â if !exists { Â Â Â Â Â Â customHandlerPort = "8080" Â Â Â Â } Â Â Â Â mux := http.NewServeMux() Â Â Â Â fmt.Println("Go server Listening on: ", customHandlerPort) Â Â Â Â log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux)) Â Â }
17. āđāļāļĒāļāļąāļāļāđāļāļąāđāļ main() āļāļ°āļāļđāļāđāļĢāļĩāļĒāļāđāļāđāđāļāļĒāđāļĢāļīāđāļĄāļāđāļ āđāļĨāļ°āļāļ°āļāđāļēāļāļāļąāļ§āđāļāļĢāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄāļāļēāļ FUNCTIONS_CUSTOM_HANDLER_PORTÂ āļāļąāļāđāļāđāļāļāđāļēāļāļĨāđāļēāļ
customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
18. āļāđāļāļāļēāļāļāļąāđāļāļāļąāļāļāđāļāļąāļāļāļ°āđāļāđāļāļ§āđāļēāļĄāļĩāļāļāļĢāđāļāļāļĒāļđāđāđāļŦāļĄ āļāđāļēāđāļĄāđāļāļąāļāļāđāļāļąāļāļāļ°āļāļģāļŦāļāļāļāļāļĢāđāļāđāļāđāļ 8080
if !exists { Â Â Â Â Â Â customHandlerPort = "8080" Â Â Â Â }
19. āļŠāļĢāđāļēāļāļāļīāļāļŠāđāļāļāļāđāļāļāļ HTTP server
mux := http.NewServeMux()
20. āļāļĢāļĢāļāļąāļāļŠāļļāļāļāđāļēāļĒāļāļ·āļāđāļĢāļīāđāļĄāļāļąāļāļāļāļĢāđāļāđāļāļāļēāļ°āđāļĨāļ°āļŠāđāļāļŠāļąāļāļāļēāļāļ§āđāļēāļāļĢāđāļāļĄāļāļĩāđāļāļ°āļĢāļąāļ requests āļāđāļ§āļĒāđāļĄāļāļāļ ListenAndServe():
log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
21. āļĢāļ°āļŦāļ§āđāļēāļāđāļāđāļāđāļĢāļĩāļĒāļāđāļāđāđāļĨāļāļĢāļēāļĢāļĩāđāļĨāļ°āļāļąāļāļāđāļāļąāļ main() āđāļŦāđāđāļāļīāđāļĄāđāļāđāļāļāđāļāđāļāļāļĩāđ
func helloHandler(w http.ResponseWriter, r *http.Request) { Â Â Â Â w.Header().Set("Content-Type", "application/json") Â Â Â Â if r.Method == "GET" { Â Â Â Â Â Â w.Write([]byte("hello world")) Â Â Â Â } else { Â Â Â Â Â Â body, _ := ioutil.ReadAll(r.Body) Â Â Â Â Â Â w.Write(body) Â Â Â Â } Â Â }
āļāļąāļāļāđāļāļąāļ helloHandler() āļāļąāđāļāļāđāļēāļāļĢāļ°āđāļ āļāđāļāļ·āđāļāļŦāļēāđāļāđāļ application/json āđāļāļĒāļāļ°āļāļāļāļāļĨāļąāļāļāđāļ§āļĒāļāļģāļ§āđāļē “hello world” Â
āđāļĄāļ·āđāļāđāļāļĩāļĒāļāđāļāđāļāđāļŠāļĢāđāļāđāļĨāđāļ§ āļāđāļāđāļāļāļ°āļāļģāļŦāļāļāļāđāļēāđāļāļ·āđāļāļāļāļāļ§āđāļēāđāļāļĨāđ exe āļāļĒāļđāđāļāļĩāđāđāļŦāļ āđāļāļ·āđāļāđāļŦāđāđāļŪāļŠāļāđ Function āļŠāļēāļĄāļēāļĢāļāļŦāļēāđāļāđ āđāļāļĒāļāđāļāļāļāļģāļŦāļāļāļāđāļē routing āđāļĨāļ°āļĢāļ°āļāļļāļ§āđāļēāđāļāļāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļāļāļąāļ HTTP triggers āđāļĨāļ°āđāļĄāđāļĄāļĩāļāļēāļĢāđāļāļ·āđāļāļĄāđāļĒāļāļāļĢāļ°āđāļ āļāļāļ·āđāļ
22. āđāļāļīāļāđāļāļāļĢāđāļĄāļīāļāļąāļĨāļĢāļąāļāļāļģāļŠāļąāđāļ go build server.go āđāļ root āđāļāļĢāđāļāđāļāļāđ āļāļ°āđāļāđāđāļāļĨāđ server.exe āđāļāļīāđāļĄāļāļķāđāļāļĄāļē
23. āđāļāļīāļāđāļāļĨāđ host.json āđāļĨāļ°āļŦāļē defaultExecutablePath āļ āļēāļĒāđāļ customHandler āđāļāļīāđāļĄ.\server
24. āđāļ customHandler āđāļŦāđāđāļāļīāđāļĄ enableForwardingHttpRequest āđāļĨāļ°āļāļģāļŦāļāļāļāđāļēāđāļāđāļ TrueÂ
25.āļāļēāļāļāļąāđāļāđāļāļīāļāđāļāļāļĢāđāļĄāļīāļāļąāļĨāđāļŦāđāļĢāļąāļ func start āđāļ root āđāļāļĢāđāļāđāļāļāđ āđāļāļ·āđāļāđāļĢāļīāđāļĄāļāļēāļĢāļāļģāļāļēāļāļāļāļ Functions appÂ
āļĒāļīāļāļāļĩāļāđāļ§āļĒāļāļĢāļąāļ! āļāļāļāļāļĩāđāļāļļāļāđāļāđāļĨāļāļāļŠāļĢāđāļēāļ serverless app āļāđāļ§āļĒ Go āđāļāļ·āđāļāļāļāđāļāđāļŠāļĢāđāļāđāļĢāļĩāļĒāļāļĢāđāļāļĒāđāļĨāđāļ§ ð
āļŠāļēāļĄāļēāļĢāļāđāļĢāļĩāļĒāļāļĢāļđāđāđāļāļīāđāļĄāđāļāļīāļĄāđāļāļĩāđāļĒāļ§āļāļąāļāļāļēāļĢāļŠāļĢāđāļēāļ serverless app āļāđāļ§āļĒāļ āļēāļĐāļē Go āđāļāđāļāļĩāđ
Build Serverless Apps using Go with Chris Noring | Web Wednesday | Channel 9 (msdn.com)
āļŦāļēāļāļāļļāļāļŠāļāđāļāļāļąāļāļāļē āļŠāļāļēāļĢāđāļāļāļąāļ āđāļāļāļāļĨāļīāđāļāļāļąāļ
āđāļĨāļ° āđāļāļāđāļāđāļĨāļĒāļĩāļāļāļāļāļąāļ§āđāļāļ ?
āļāļĒāđāļēāļĢāļāļāđāļē ! āđāļĢāļĩāļĒāļāļĢāļđāđāļāļąāļāļĐāļ°āļāđāļēāļāļāļīāļāļīāļāļąāļĨāđāļāļ·āđāļāļāļąāļāđāļāļĢāļāļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāļāļāļāļāļļāļ
āđāļĢāļīāđāļĄāļāļąāđāļāđāļāđāļāļ·āđāļāļāļēāļ āļāļĢāđāļāļĄāļāļāļīāļāļąāļāļīāļāļĢāļīāļāđāļāļĢāļđāļāđāļāļāļŦāļĨāļąāļāļŠāļđāļāļĢāļāļāļāđāļĨāļāđāļ§āļąāļāļāļĩāđ