Dalam seni bina perkhidmatan mikro, get laluan memainkan peranan penting, biasanya digunakan untuk permintaan penghalaan, pengimbangan beban dan pengesahan keselamatan. Mod proksi boleh memberikan kebolehskalaan dan fleksibiliti yang lebih baik. Artikel ini akan memperkenalkan cara menggunakan Golang untuk melaksanakan proksi get laluan mudah.
Pertama, mari kita fahami peranan proksi get laluan. Proksi get laluan boleh memajukan permintaan luaran kepada perkhidmatan dalam sistem mikroperkhidmatan dalaman dan boleh mencapai fungsi berikut:
1) Permintaan penghalaan
Proksi get laluan boleh berdasarkan laluan dan parameter permintaan yang berbeza, Forward permintaan kepada contoh perkhidmatan mikro yang betul.
2) Pengimbangan Beban
Apabila terdapat terlalu banyak tika sistem mikroperkhidmatan, proksi get laluan boleh melaksanakan pengimbangan beban permintaan untuk memastikan setiap tika perkhidmatan mikro boleh mendapatkan permintaan diproses.
3) Pengesahan keselamatan
Proksi get laluan boleh melakukan pengesahan keselamatan pada permintaan, seperti mengesahkan identiti permintaan, tandatangan, kebenaran, dsb.
Seterusnya, mari mula menggunakan Golang untuk melaksanakan proksi get laluan mudah.
2.1 Laksanakan permintaan penghalaan
Mula-mula, kita perlu menghuraikan laluan permintaan dan memajukan permintaan kepada contoh perkhidmatan mikro yang sepadan mengikut laluan yang berbeza. Untuk ini kita boleh menggunakan fungsi penghalaan dalam rangka kerja Gin. Kodnya adalah seperti berikut:
router := gin.Default() // 转发请求给微服务 router.GET("/user/:id", func(c *gin.Context) { // 解析请求参数 id := c.Param("id") // 根据要请求的微服务实例,进行转发 req, err := http.NewRequest("GET", "http://user-service/"+id, nil) if err != nil { // 处理请求失败的情况 } resp, err := client.Do(req) if err != nil { // 处理请求失败的情况 } // 将响应返回给请求方 c.DataFromReader(resp.StatusCode, resp.ContentLength, resp.Header.Get("Content-Type"), resp.Body, nil) })
Dalam kod di atas, kami menggunakan kaedah router.GET
rangka kerja Gin untuk menghuraikan laluan permintaan dan menggunakan kaedah http.NewRequest
untuk memajukan permintaan kepada contoh perkhidmatan mikro yang betul. Diandaikan di sini bahawa kami mempunyai contoh perkhidmatan mikro bernama user-service
dan boleh memajukan permintaan dengan betul dengan menghuraikan laluan permintaan.
2.2 Laksanakan pengimbangan beban
Apabila terdapat terlalu banyak tika perkhidmatan mikro, satu proksi get laluan mungkin tidak dapat memenuhi beban permintaan yang tinggi. Untuk menyelesaikan masalah ini, kami perlu melaksanakan pengimbangan beban permintaan. Di Golang, kita boleh menggunakan pemalam pengimbangan beban dalam rangka kerja Gin untuk melaksanakan fungsi pengimbangan beban. Kodnya adalah seperti berikut:
router := gin.Default() // 初始化负载均衡器 rr, err := roundrobin.NewBalancer( &roundrobin.Config{ Servers: []string{ "http://user-service-1:8080", "http://user-service-2:8080", "http://user-service-3:8080", }, Method: roundrobin.RoundRobin, }, ) if err != nil { // 处理初始化失败的情况 } // 转发请求给微服务 router.GET("/user/:id", func(c *gin.Context) { // 解析请求参数 id := c.Param("id") // 取得要请求的微服务实例 server, err := rr.GetServer() if err != nil { // 处理获取微服务实例失败的情况 } // 根据要请求的微服务实例,进行转发 url := fmt.Sprintf("%s/%s", server, id) req, err := http.NewRequest("GET", url, nil) if err != nil { // 处理请求失败的情况 } resp, err := client.Do(req) if err != nil { // 处理请求失败的情况 } // 将响应返回给请求方 c.DataFromReader(resp.StatusCode, resp.ContentLength, resp.Header.Get("Content-Type"), resp.Body, nil) })
Dalam kod di atas, kami menggunakan kaedah roundrobin.NewBalancer
untuk memulakan pengimbang beban dan menentukan URL bagi tiga contoh perkhidmatan mikro. Apabila proksi get laluan menerima permintaan, ia akan mendapatkan contoh perkhidmatan mikro daripada pengimbang beban dan memajukan permintaan berdasarkannya.
2.3 Laksanakan pengesahan keselamatan
Apabila proksi get laluan membenarkan akses sistem luaran, kami perlu melakukan pengesahan keselamatan untuk mengelakkan permintaan yang menyalahi undang-undang dan kebocoran data. Di Golang, kita boleh menggunakan JWT (Token Web JSON) sebagai bukti kelayakan untuk pengesahan dan kebenaran. Kodnya adalah seperti berikut:
router := gin.Default() // 定义JWT密钥和超时时间 var jwtSecret = []byte("my_secret_key") var jwtTimeout = time.Hour * 24 // 1 day // 创建JWT验证中间件 authMiddleware := jwtmiddleware.New(jwtmiddleware.Options{ ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) { return jwtSecret, nil }, SigningMethod: jwt.SigningMethodHS256, ErrorHandler: func(c *gin.Context, err error) { // 处理JWT验证错误的情况 }, }) // 转发请求给微服务 router.GET("/user/:id", authMiddleware.Handler(), func(c *gin.Context) { // 解析请求参数 id := c.Param("id") // 根据要请求的微服务实例,进行转发 req, err := http.NewRequest("GET", "http://user-service/"+id, nil) if err != nil { // 处理请求失败的情况 } resp, err := client.Do(req) if err != nil { // 处理请求失败的情况 } // 将响应返回给请求方 c.DataFromReader(resp.StatusCode, resp.ContentLength, resp.Header.Get("Content-Type"), resp.Body, nil) })
Dalam kod di atas, kami menggunakan kaedah jwtmiddleware.New
dalam rangka kerja JWT untuk mencipta perisian tengah pengesahan JWT dan menentukan kunci JWT dan tamat masa. Apabila permintaan mencapai proksi get laluan, pengesahan JWT akan dilakukan terlebih dahulu dan permintaan akan dimajukan hanya selepas pengesahan berjaya.
3. Ringkasan
Artikel ini memperkenalkan cara menggunakan Golang untuk melaksanakan fungsi umum proksi get laluan, termasuk permintaan penghalaan, pengimbangan beban, pengesahan keselamatan, dsb. Fungsi ini boleh membantu kami menyelenggara dan mengurus sistem perkhidmatan mikro dengan lebih baik. Sudah tentu, ini hanyalah pelaksanaan peringkat permulaan, dan sistem proksi get laluan sebenar mungkin lebih kompleks, dan banyak isu praktikal perlu diambil kira.
Atas ialah kandungan terperinci Golang melaksanakan proksi gerbang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!