服務器裸奔
==========
在 go 語言下要跑起一個HTTP服務器是很容易的.
```go
package main
import "net/http"
func main() {
http.ListenAndServe(":8080", http.FileServer(http.Dir("/usr/share/doc")))
}
```
這就行了,一個靜態文件服務器就跑起來了. TypePress 下的代碼是這樣的
```go
package main
import "github.com/typepress/server"
func main() {
server.Simple()
}
```
這個服務器沒有設置任何 Route, 只返回 404, 裸奔的服務器. 這只是表面, 下面來列舉下這個 Simple Server 背后都做了哪些工作
## 配置基本參數
有三種方法設置服務器基本參數:
- 通過命令行參數 --help 可以獲得幫助列表
- os.Getenv 獲取 應用通過 os.Setenv 設置參數
- 從 TOML 文件讀取 [TOML][1] 文件支持已經默認加入
## 基本功能
有些基本的功能是一個框架需要提供的
- 安全關閉機制 shutdown 總用 kill 是不安全的. 得益于 [manners][2]
- i18n 接口 [i18n][3] 接口非常輕量, 當 fmt.Sprintf 使就行
- 自定義信號 完全采用 os.Signal 接口, 安全關閉信號就是基于這個
- 延遲初始化 有些初始化工作需要在 main 執行時調用
- 子路由 按 http method 劃分的子路由, 主路由只能由 main 函數調用
- 角色控制 字符串角色命名, 自動轉化為 [accessflags][4] 支持的 interger
- 日志支持 引入 [typepress/log][5], 支持 file 分割, email發送
- 數據庫接口支持 引入[typepress/db][6], 即便不需要也不必擔心, 這是個輕量接口
- [core][7] 全局可訪問的對象和 [types][8] 類型
- **基于 Martini Injector 的設計 這是最最重要的**
這樣列舉起來, 貌似這個 Simple Server 貌似已經不輕量了. 不! 他依然是輕量的, 因為這些接口設計的很輕量, 當你不用他們的時候, 他們不會產生過多的消耗. 這些接口的代碼都很短, 引入他們, 怎加不了多少代碼空間.
應該可以看出僅僅是這些基礎的功能已經形成了一個服務器框架.
這些都已經準備好了. 哦還有模板, 這個東西不打算默認引入, 各種口味難調.
## 模塊化
這些很多都是獨立的 package, 可以單獨使用. 從 [typepress][9] org 可以看出, 模塊以獨立的 rep 出現.
typepress 特別注意降低依賴, 寫成獨立 rep 是最基本的方法.
[1]: https://github.com/mojombo/toml
[2]: github.com/braintree/manners
[3]: https://github.com/typepress/i18n
[4]: https://github.com/typepress/accessflags
[5]: https://github.com/typepress/log
[6]: https://github.com/typepress/db
[7]: https://github.com/typepress/core
[8]: https://github.com/typepress/types
[9]: https://github.com/typepress