Thứ Năm, 21 tháng 6, 2012

Cài đặt môi trường phát triễn web trên Google Appengine Go

Cài đặt môi trường phát triễn web trên Google Appengine Go

Mức độ khó: 1
Google Appengine hiểu nôm na là môi trường server của Google, ứng dụng web của bạn sẽ đuợc đặt trên server của Google (chất lượng rất tốt), sử dụng một số dịch vụ của Google (như là database, chức năng đăng nhập với tài khảon Google...). Vào thời điểm viết bài này, Appengine hổ trợ 3 ngôn ngữ đó là Java, Python và Go
Go - Golang là một ngôn ngữ của Google. Xem chi tiết tại golang.org.
Bài viết sẽ hướng dẫn cài đặt và chạy chuơng trình "Hello world" trên môi trường Linux.


Việc đầu tiên cần làm là download bộ công cụ phát triễn phần mềm của Google Appengine dành cho Go, hiện tại chỉ hổ trợ các hệ điều hành Linux và Mac. Gọi là bộ công cụ nhưng các bạn sẽ phải làm việc trên môi trường dòng lệnh khá nhiều.
Cập nhật 30/6/2012: App Engine Go nay đã hỗ trợ Windows.
Sau khi download gói thích hợp, giải nén nó ra một thư mục (tốt nhất là trong thư mục home của bạn) ví dụ:

Bên trong thư mục Home tôi tạo 1 thư mục tên là WorkSpace, sau đ1o tôi giải nén file vừa download vào thư mục GO, trong thư mục GO, ngoại trừ các files, folders có sẵn, tôi tạo thêm 1 thư mục apps để chứa các ứng dụng tôi sẽ phát triễn sau này, nhưng hiện tại điều chúng ta quan tâm là thư mục demos sẵn có. Nếu các bạn chưa thành thạo về các thao tác dòng lệnh, hãy tạo các thư mục y hệt như tôi.
Bây giờ hãy mở chuơng trình Terminal lên, nó giống như cmd của windows thôi. Để mở cửa sổ này lên, nhấn Ctrl + Alt + T nếu đang dùng Ubuntu, đối với các dòng khác, đa phần bạn có thể tìm thấy nó trong Menu Application -> System.
Trong cửa sổ hiện ra, bạn gõ dòng lệnh:
WorkSpace/GO/dev_appserver.py WorkSpace/GO/demos/helloworld
Chú ý là bạn đặt tên in hoa như thế nào thì phải viết đúng như thế. Sau khi nhấn enter, một vài dòng thông tin hiện ra, nếu mọi việc đều ổn thì bạn sẽ đuợc hỏi:
Allow dev_appserver to check for updates on startup? (Y/n):
Bấm "y" rồi nhấn enter. Nếu cửa sổ dừng lại ở output như trong hình, có nghĩa là mọi việc đã ổn thỏa:

hãy thử truy cập vào địa chỉ http://localhost:8080/ và xem output trên trình duyệt. Bạn đã có 1 website chạy trên môi trường Google Appengine viết với ngôn ngữ Go.

Tiếp theo, ta sẽ tìm hiểu xem cấu trúc của chương trình helloworld tao vừa chạy.
Bên trong thư mục demos còn có rất nhiều ứng dụng khác, thời gian sau ta sẽ cùng nghiên cứu.
Bên trong thư mục helloworld, ta sẽ thấy có 2 file app.yaml (bắt buộc, là file cấu hình, chứa thông tin cần thiết để chạy ứng dụng trên môi trường Appengine), favicon.ico (không bắt buộc, chỉ có nhiệm vụ làm cái icon cho website, tương tự như icon ) và một thư mục nữa cũng tên là helloworld (bắt buộc, chứa source code của ứng dụng). ta sẽ xem qua file app.yaml:
===================================

application: helloworld
version: 1
runtime: go
api_version: go1


handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico


- url: /.*
  script: _go_app
===================================
application: giá trị của trường này là id của ứng dụng bạn đã đăng kí trên trang appengine.google.com, khi phát triễn ứng dụng thật sự của bạn, hạy thay bằng id app của mình thay vì "helloworld"
version: appengine cho phép bạn upload nhiều phiên bản của ứng dụng, bạn có thể chuyễn đổi sử dụng các phiên bản khác nhau tùy nhu cầu.
runtime, api_version: luôn giữ nguyên nếu ta đang phát triễn ứng dụng với Go
handlers: ấn định việc quản lí các URI như thế nào, cụ thể với trường hợptre6nc ó thể giải thích như sau: với đường dẫn localhost:8080/favicon.ico thì sẽ trả về nội dung của file tĩnh favicon.ico, đã đuợc upload với địa chỉ /favicon.ico. Với tất cả các trường hợp còn lại, sẽ đuợc xử lý bởi chường trình mà chúng ta viết.

và bây giờ chúng ta xem tới phần quan trọng nhất, file helloworld.go trong thư mục helloworld:
===================================

package helloworld


import (
"fmt"
"net/http"
)


func init() {
http.HandleFunc("/", handle)
}


func handle(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "<html><body>Hello, World! 세상아 안녕!</body></html>")
}
===================================
Sau đây xin giải thích cấu trúc của 1 chương trình Go trên môi trường Appengine (hơi khác với 1 chuơng trình Go không chạy trên môi trường Appengine).
Mỗi một ứng dụng có 1 tên, quy định bởi dòng đầu tiên package, thực chất cái ta đang viết là 1 thư viện, không phải 1 chương trình - tương tự như thư viện .dll, sau đó thư viện sẽ được chương trình của môi trường Appengine sử dụng.
Khối import, có công dụng giống như include trong C++, using trong C# và import trong Java =)). Khi cần dùng thư viện nào của Go, ta cần phải import tên của nó vào.
Mỗi một ứng dụng Go trên Appengine cần có 1 hàm init() có cấu trúc chính xác như vậy. Nếu viết 1 chuơgn trình độc lập, mỗi chuơgn trình cần có 1 hàm main() (quy tắc như C++), và dòng đầu tiên của chuơng trình sẽ là package main thay vì package xxxx
Trong hàm init() ta gọi duy nhất 1 dòng lệnh http.HandleFunc("/", handle), dòng lệnh này có nghĩa là "hàm handle sẽ xử lý tất cả mọi việc". Hàm handle phải có signature chính xác như được khai báo bên dưới.
===================================

func handle(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "<html><body>Hello, World! 세상아 안녕!</body></html>")
}

===================================
hàm này nhận vào 2 tham số, đối số thứ nhất, gọi nôm na là 1 stream output về phía nguời dùng. dòng lệnh fmt.Fprint(w, "string"), hiểu nôm na là "viết chuỗi kí tự này vào stream w". Đối số thứ 2 là 1 đối tượng con trỏ lưu giữ tất cả thông tin về request (header, query string parameter, form data...), trong ví dụ này ta chưa hề thao tác với đối tượng request.
Hãy sửa fmt.Fprint(w, "Hello, World! 세상아 안녕!") thành fmt.Fprint(w, "Xin chào!"), save lại, sau đó reload trang http://localhost:8080/ và xem chuyện gì xảy ra, đơn giản phải không nào!?

Không có nhận xét nào:

Đăng nhận xét