分发的作用
在开发过程中,要保持内部服务对外不可见的状态,并且要对传入的请求做初步的筛选防止SQL注入等攻击手段。
最初的想法
最开始对分发组件进行构思的时候,我的想法是动态的注册handler函数这样子来接收前端传递来的各种请求,但是实际上手之后,我发现我根本写不出来。穷则思变,我想到了第二个办法:使用一个Handler来接受前端传递过来的所有请求,再通过获取url来分辨所想请求的具体服务。通过读取配置文件来获取具体的主机地址,将body传递过去。
最终成果
1package main
2
3import (
4 "bytes"
5 "encoding/json"
6 "fmt"
7 "io/ioutil"
8 "log"
9 "net/http"
10 "strings"
11)
12
13type ShareAdd struct {
14 Route string `json:"Route"`
15 Add string `json:"Add"`
16}
17type Alladd struct {
18 SA []ShareAdd
19}
20
21var Address Alladd
22
23func main() {
24 readFile()
25 http.HandleFunc("/", share)
26 http.ListenAndServe(":8090", nil)
27}
28func errWork(e error, say string) {
29 if e != nil {
30 log.Print(say)
31 }
32}
33func share(w http.ResponseWriter, r *http.Request) {
34
35 url := r.URL.Path
36 biao := "/"
37 f := strings.Split(url, biao)
38 fmt.Print(f)
39
40 log.Print(url)
41 for i := 0; i < len(Address.SA); i++ {
42 if f[1] == Address.SA[i].Route {
43 log.Print(r.Body)
44 rebody, _ := ioutil.ReadAll(r.Body)
45 re := &http.Client{}
46 add := "http://" + Address.SA[i].Add + "/" + f[2]
47 log.Print(add)
48 body := bytes.NewBuffer(rebody)
49 reque, err := http.NewRequest("GET", add, body)
50
51 resp, err := re.Do(reque)
52 log.Print(resp)
53 errWork(err, "请求失败")
54 log.Print(err)
55 defer r.Body.Close()
56 js, er := ioutil.ReadAll(resp.Body)
57 errWork(er, "服务返回出错")
58 fmt.Fprint(w, string(js))
59 break
60 }
61 }
62}
63
64func readFile() {
65 log.Print("读取文件中")
66 temp, err := ioutil.ReadFile("./set.txt")
67 err = json.Unmarshal(temp, &Address)
68 if err != nil {
69 log.Print("配置文件读取出错")
70 log.Print(err)
71 }
72 log.Print(Address)
73}