分发的作用

在开发过程中,要保持内部服务对外不可见的状态,并且要对传入的请求做初步的筛选防止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}
Last modification:November 11th, 2019 at 01:27 pm
如果觉得我的文章对你有用,请随意赞赏