マイクロサービス アーキテクチャでは、ゲートウェイは重要な役割を果たし、通常はリクエストのルーティング、負荷分散、セキュリティ検証に使用されます。プロキシ モードは、優れたスケーラビリティと柔軟性を提供します。この記事では、Golang を使用して簡単なゲートウェイ プロキシを実装する方法を紹介します。
まず、ゲートウェイ プロキシの役割を理解しましょう。ゲートウェイ プロキシは、外部リクエストを内部マイクロサービス システムのサービスに転送でき、次の機能を実現できます。
1) リクエストのルーティング
ゲートウェイ プロキシは、さまざまなリクエスト パスとパラメータに基づいて次のことができます。 , リクエストを正しいマイクロサービス インスタンスに転送します。
2) 負荷分散
マイクロサービス システムのインスタンスが多すぎる場合、ゲートウェイ プロキシはリクエストの負荷分散を実装して、各マイクロサービス インスタンスがリクエストを処理できるようにすることができます。
3) セキュリティ検証
ゲートウェイ プロキシは、リクエストの ID、署名、権限などの検証など、リクエストのセキュリティ検証を実行できます。
次に、Golang を使用して単純なゲートウェイ プロキシを実装してみましょう。
2.1 ルーティング リクエストの実装
まず、リクエスト パスを解析し、さまざまなパスに従ってリクエストを対応するマイクロサービス インスタンスに転送する必要があります。このために、Gin フレームワークのルーティング機能を使用できます。コードは次のとおりです。
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) })
上記のコードでは、Gin フレームワークの router.GET
メソッドを使用してリクエスト パスを解析し、http.NewRequest# を使用します。 ## メソッドはリクエストを正しいマイクロサービス インスタンスに転送します。ここでは、
user-service という名前のマイクロサービス インスタンスがあり、リクエスト パスを解析することでリクエストを正しく転送できると仮定します。
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) })上記のコードでは、
roundrobin.NewBalancer メソッドを使用してロード バランサーを初期化し、3 つのマイクロサービス インスタンスの URL を指定します。ゲートウェイ プロキシはリクエストを受信すると、ロード バランサーからマイクロサービス インスタンスを取得し、それに基づいてリクエストを転送します。
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) })上記のコードでは、JWT フレームワークの
jwtmiddleware.New メソッドを使用して JWT 検証ミドルウェアを作成し、JWT キーとタイムアウトを指定しました。リクエストがゲートウェイ プロキシに到達すると、最初に JWT 検証が実行され、検証が成功した後にのみリクエストが転送されます。
以上がGolang はゲートウェイ プロキシを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。