[golang gin Framework] 40. ジンモールプロジェクト - マイクロサービス戦闘におけるキャプチャ検証コードマイクロサービス

このコンテンツを よりよく理解するには、 gin フレームワークの基本知識 golang マイクロサービスの基本知識が必要です。

1.Captcha認証コード機能の導入

前編ではマイクロサービスのアーキテクチャなどを説明しましたが、ここでは 前回のモールプロジェクトの キャプチャ認証コード マイクロサービスについて説明します キャプチャ認証コード機能はフォアグラウンドとバックエンドで 利用されており、 抽出して作成する ことができます マイクロサービス関数

編集

この検証コード関数は、次のようにコード captcha.go をカプセル化します。

package models

//验证码属性: https://captcha.mojotv.cn/
import (
    "github.com/mojocn/base64Captcha"
    "image/color"
)

//创建store,保存验证码的位置,默认为mem(内存中)单机部署,如果要布置多台服务器,则可以设置保存在redis中
//var store = base64Captcha.DefaultMemStore

//配置RedisStore, 保存验证码的位置为redis, RedisStore实现base64Captcha.Store接口
var store base64Captcha.Store = RedisStore{}

//获取验证码
func MakeCaptcha(height int, width int, length int) (string, string, error) {
    //定义一个driver
    var driver base64Captcha.Driver
    //创建一个字符串类型的验证码驱动DriverString, DriverChinese :中文驱动
    driverString := base64Captcha.DriverString{
        Height:          height,                                     //高度
        Width:           width,                                    //宽度
        NoiseCount:      0,                                      //干扰数
        ShowLineOptions: 2 | 4,                                  //展示个数
        Length:          length,                                      //长度
        Source:          "1234567890qwertyuioplkjhgfdsazxcvbnm", //验证码随机字符串来源
        BgColor: &color.RGBA{ // 背景颜色
            R: 3,
            G: 102,
            B: 214,
            A: 125,
        },
        Fonts: []string{"wqy-microhei.ttc"}, // 字体
    }
    driver = driverString.ConvertFonts()
    //生成验证码
    c := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := c.Generate()
    return id, b64s, err
}

//校验验证码
func VerifyCaptcha(id string, VerifyValue string) bool {
    // 参数说明: id 验证码id, verifyValue 验证码的值, true: 验证成功后是否删除原来的验证码
    if store.Verify(id, VerifyValue, true) {
        return true
    } else {
        return false
    }
}
この検証コードをマイクロサービス化する場合、検証コードの取得 (MakeCaptcha)、 検証コードの検証 (VerifyCaptcha) の上記2つのメソッドを実装する必要があります。

2. キャプチャ検証コードのマイクロサービス サーバーを作成する

  1. client(クライアント)、server(サーバー)の2つのフォルダを作成します

  1. サーバー側のキャプチャ マイクロサービス コードを生成する

サーバー ディレクトリで実行: go-micro new service captcha を実行し、キャプチャ サーバー コードを生成します。
コマンドを実行すると、生成されるサーバー ディレクトリは次のようになります。
  1. proto/captcha.proto ファイルを書き込む

このファイルに書き込み、 認証コードを取得し、認証コード 関連のコード を検証します。

syntax = "proto3";

package captcha;

option go_package = "./proto/captcha";

service Captcha {
    //获取验证码: MakeCaptchaRequest请求, MakeCaptchaRequest返回
    rpc MakeCaptcha(MakeCaptchaRequest) returns (MakeCaptchaResponse) {}
    //校验验证码: VerifyCaptchaRequest请求, VerifyCaptchaResponse返回
    rpc VerifyCaptcha(VerifyCaptchaRequest) returns (VerifyCaptchaResponse) {}
}

//以下具体参数类型参考captcha.go中对应的方法

//获取验证码请求参数
message MakeCaptchaRequest {
    //验证码高度
    int32 height =1;
    //验证码宽度
    int32 width = 2;
    //验证码长度
    int32 length = 3;
}

//获取验证码返回数据
message MakeCaptchaResponse {
    //验证码id
    string id = 1;
    //验证码base64编码
    string b64s = 2;
}

//校验验证码请求参数
message VerifyCaptchaRequest {
    //验证码id
    string id = 1;
    //输入的验证码
    string verifyValue = 2;
}

//校验验证码返回数据
message VerifyCaptchaResponse {
    //校验的结果
    bool verifyResult = 1;
}
  1. プロト関連ファイルを生成する

[golang マイクロサービス] 7. go-micro フレームワークの紹介 、go-micro スキャフォールディング、go-micro と consul を組み合わせてマイクロサービス ケースを構築し 、 Windows の Makefile の proto でコードを 実行します : protoc --proto_path= -- micro_out= . --go_out=:. proto/captcha.proto もちろん、初めて go-micro を使用する場合は、init (@go xxx) の下のコードを実行して関連パッケージをインポートする必要もあります

  1. プロジェクトを初期化する

captcha ディレクトリでコマンドを実行します: go mod init captcha 、プロジェクトを初期化します
go.mod を削除した後、 go mod init captcha コマンドを再度実行します。
コマンド go mod tiny を実行して、プロジェクトに必要なパッケージをロードします。
上記の内容: パッケージ "go-micro.dev/v4" のダウンロードに失敗した場合は、コマンド go get go-micro.dev/v4 を実行する必要があります。 具体的な参照 : [golang microservice] 7. go-micro の概要フレームワーク、Go-micro スキャフォールディング、go-micro と consul を組み合わせてマイクロサービス ケースを構築すると、 インポートが常に red でレポートされるように
見える場合があります 解決策は、インポート後の golang open mod を参照してください。 red ソリューション
  1. 領事サービスの検出を開始する

cmd でコマンドを実行します: consul Agent -dev、具体的な参照: [golang microservice] 5. マイクロサービス サービス ディスカバリの導入、インストール、および consul、Consul クラスターの使用
  1. main.goでconsulをインスタンス化する

具体的な参考資料: [golang microservice] 7. Go-micro フレームワークの紹介、go-micro スキャフォールディング、go-micro と consul を組み合わせてマイクロサービス ケースを構築する コードは次のとおりです。

package main

import (
    "captcha/handler"
    pb "captcha/proto/captcha"
    "go-micro.dev/v4"
    "go-micro.dev/v4/logger"
    "github.com/go-micro/plugins/v4/registry/consul"
)

var (
    service = "captcha"
    version = "latest"
)

func main() {
    //集成consul
    consulReg := consul.NewRegistry()
    // Create service
    srv := micro.NewService(
        micro.Address("127.0.0.1:8081"),  //指定微服务的ip:  选择注册服务器地址,也可以不配置,默认为本机,也可以选择consul集群中的client
        micro.Name(service),
        micro.Version(version),
        //注册consul
        micro.Registry(consulReg),
    )
    srv.Init(
        micro.Name(service),
        micro.Version(version),
    )

    // Register handler
    if err := pb.RegisterCaptchaHandler(srv.Server(), new(handler.Captcha)); err != nil {
        logger.Fatal(err)
    }
    // Run service
    if err := srv.Run(); err != nil {
        logger.Fatal(err)
    }
}
  1. handler/captcha.go は、proto/captcha.proto に rpc メソッドをカプセル化して実装します。

実装についてはproto/captcha.proto サービス Captcha メソッド を参照する か、生成された .pb.micro.go で生成されたメソッドを参照して 実装してください。

(1).pb.micro.go 参照コード:



// Client API for Captcha service
type CaptchaService interface {
    // 获取验证码: MakeCaptchaRequest请求, MakeCaptchaRequest返回
    MakeCaptcha(ctx context.Context, in *MakeCaptchaRequest, opts ...client.CallOption) (*MakeCaptchaResponse, error)
    // 校验验证码: VerifyCaptchaRequest请求, VerifyCaptchaResponse返回
    VerifyCaptcha(ctx context.Context, in *VerifyCaptchaRequest, opts ...client.CallOption) (*VerifyCaptchaResponse, error)
}

(2).handler/captcha.go コード:

「1.Captcha認証コード機能紹介」 のcaptcha.goの コードを handler/captcha.go に コピーし 、 修正します。

1) まず、「github.com/mojocn/base64Captcha」をインポートします。

github.com/mojocn/base64Captcha」 を import に入れてから、 go mod tiny または go get
github.com/mojocn/base64Captcha を通じてインポートします 。

2). RedisStoreを構成する

varstorebase64Captcha.Store = RedisStore{} をそこに コピーします

//创建store,保存验证码的位置,默认为mem(内存中)单机部署,如果要布置多台服务器,则可以设置保存在redis中
//var store = base64Captcha.DefaultMemStore

//配置RedisStore, 保存验证码的位置为redis, RedisStore实现base64Captcha.Store接口
var store base64Captcha.Store = RedisStore{}
ここではredis のストレージメソッド を使用するため redisの初期化と、 captchaの設定メソッドを 実装するコードが 必要となるため、captcha配下に models/redisCore.go models/redisStore.go ファイル を作成する必要があります 。詳細は、 [golang gin Framework] を参照してください。 12.Gin mall project-base64Captcha は、グラフィック検証コードを生成し、分散アーキテクチャで Captcha を構成します
Redisを初期化するコード
redisCore.go コードは次のとおりです。

package models

//redis官网: github.com/go-redis
//下载go-redis: go get github.com/redis/go-redis/v9
//连接redis数据库核心代码

import (
    "context"
    "fmt"
    "github.com/redis/go-redis/v9"
    "gopkg.in/ini.v1"
    "os"
)

//全局使用,就需要把定义成公有的
var ctxRedis = context.Background()

var (
    RedisDb *redis.Client
)

//是否开启redis
var redisEnable bool

//自动初始化数据库
func init() {
    //加载配置文件
    config, iniErr := ini.Load("./conf/app.ini")
    if iniErr != nil {
        fmt.Printf("Fail to read file: %v", iniErr)
        os.Exit(1)
    }
    //获取redis配置
    ip := config.Section("redis").Key("ip").String()
    port := config.Section("redis").Key("port").String()
    redisEnable, _ = config.Section("redis").Key("redisEnable").Bool()

    //判断是否开启redis
    if redisEnable {
        RedisDb = redis.NewClient(&redis.Options{
            Addr:     ip + ":" + port,
            Password: "", // no password set
            DB:       0,  // use default DB
        })

        //连接redis
        _, err := RedisDb.Ping(ctxRedis).Result()
        //判断连接是否成功
        if err != nil {
            println(err)
        }
    }
}
キャプチャを設定するメソッドのコード
redisStore.go コードは次のとおりです。

package models

/**
使用redis需实现Store中的三个方法
type Store interface {
    // Set sets the digits for the captcha id.
    Set(id string, value string)

    // Get returns stored digits for the captcha id. Clear indicates
    // whether the captcha must be deleted from the store.
    Get(id string, clear bool) string

    //Verify captcha's answer directly
    Verify(id, answer string, clear bool) bool
}
 */

import (
    "context"
    "fmt"
    "time"
)

var ctx = context.Background()

const CAPTCHA = "captcha:"

type RedisStore struct {
}

//实现设置 captcha 的方法
func (r RedisStore) Set(id string, value string) error {
    key := CAPTCHA + id
    err := RedisDb.Set(ctx, key, value, time.Minute*2).Err()
    return err
}

//实现获取 captcha 的方法
func (r RedisStore) Get(id string, clear bool) string {
    key := CAPTCHA + id
    //获取 captcha
    val, err := RedisDb.Get(ctx, key).Result()
    if err != nil {
        fmt.Println(err)
        return ""
    }
    //如果clear == true, 则删除
    if clear {
        err := RedisDb.Del(ctx, key).Err()
        if err != nil {
            fmt.Println(err)
            return ""
        }
    }
    return val
}

//实现验证 captcha 的方法
func (r RedisStore) Verify(id, answer string, clear bool) bool {
    v := RedisStore{}.Get(id, clear)
    return v == answer
}
ここでは、Ini.Load を使用してロードします。
参考: [golang gin Framework] 9. トランザクションと go-ini を使用して、Gin GORM に .ini 設定ファイルをロードする

3). 検証コードメソッドのビジネスロジックコードの実装

handler/captcha.go のMakeCaptcha 、「1.Captcha 認証コード機能紹介」 認証コードを取得した captcha.go のメソッド コードを コピーし 、修正します。

//获取验证码的方法
func (e *Captcha) MakeCaptcha(ctx context.Context, req *pb.MakeCaptchaRequest, rsp *pb.MakeCaptchaResponse) error {
    //实现业务逻辑代码
    //定义一个driver
    var driver base64Captcha.Driver
    //创建一个字符串类型的验证码驱动DriverString, DriverChinese :中文驱动
    driverString := base64Captcha.DriverString{
        Height:          int(req.Height),                                     //高度
        Width:           int(req.Width),                                    //宽度
        NoiseCount:      0,                                      //干扰数
        ShowLineOptions: 2 | 4,                                  //展示个数
        Length:          int(req.Length),                                      //长度
        Source:          "1234567890qwertyuioplkjhgfdsazxcvbnm", //验证码随机字符串来源
        BgColor: &color.RGBA{ // 背景颜色
            R: 3,
            G: 102,
            B: 214,
            A: 125,
        },
        Fonts: []string{"wqy-microhei.ttc"}, // 字体
    }
    driver = driverString.ConvertFonts()
    //生成验证码
    c := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := c.Generate()
    //把生成的验证码id,base64编码赋值给返回的rsp参数
    rsp.Id = id
    rsp.B64S = b64s

    return err
}

4). 検証検証コード方式のビジネスロジックコードの実現

handler/captcha.go のMakeCaptchaに、 「1.Captcha 検証コード機能紹介」 で検証コードを検証する captcha.go のメソッド コードを コピーし 、修正します。

//校验验证码的方法
func (e *Captcha) VerifyCaptcha(ctx context.Context, req *pb.VerifyCaptchaRequest, rsp *pb.VerifyCaptchaResponse) error {
    // 参数说明: id 验证码id, verifyValue 验证码的值, true: 验证成功后是否删除原来的验证码
    if store.Verify(req.Id, req.VerifyValue, true) {
        rsp.VerifyResult = true  //校验成功
    } else {
        rsp.VerifyResult = false  //校验失败
    }
    return nil
}

4). 完全なコードは次のとおりです。


package handler

import (
    "captcha/models"
    pb "captcha/proto/captcha"
    "context"
    "github.com/mojocn/base64Captcha"
    "image/color"
)

//创建store,保存验证码的位置,默认为mem(内存中)单机部署,如果要布置多台服务器,则可以设置保存在redis中
//var store = base64Captcha.DefaultMemStore

//配置RedisStore, 保存验证码的位置为redis, RedisStore实现base64Captcha.Store接口
var store base64Captcha.Store = models.RedisStore{}

type Captcha struct{}

//获取验证码的方法
func (e *Captcha) MakeCaptcha(ctx context.Context, req *pb.MakeCaptchaRequest, rsp *pb.MakeCaptchaResponse) error {
    //实现业务逻辑代码
    //定义一个driver
    var driver base64Captcha.Driver
    //创建一个字符串类型的验证码驱动DriverString, DriverChinese :中文驱动
    driverString := base64Captcha.DriverString{
        Height:          int(req.Height),                                     //高度
        Width:           int(req.Width),                                    //宽度
        NoiseCount:      0,                                      //干扰数
        ShowLineOptions: 2 | 4,                                  //展示个数
        Length:          int(req.Length),                                      //长度
        Source:          "1234567890qwertyuioplkjhgfdsazxcvbnm", //验证码随机字符串来源
        BgColor: &color.RGBA{ // 背景颜色
            R: 3,
            G: 102,
            B: 214,
            A: 125,
        },
        Fonts: []string{"wqy-microhei.ttc"}, // 字体
    }
    driver = driverString.ConvertFonts()
    //生成验证码
    c := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := c.Generate()
    //把生成的验证码id,base64编码赋值给返回的rsp参数
    rsp.Id = id
    rsp.B64S = b64s

    return err
}

//校验验证码的方法
func (e *Captcha) VerifyCaptcha(ctx context.Context, req *pb.VerifyCaptchaRequest, rsp *pb.VerifyCaptchaResponse) error {
    // 参数说明: id 验证码id, verifyValue 验证码的值, true: 验证成功后是否删除原来的验证码
    if store.Verify(req.Id, req.VerifyValue, true) {
        rsp.VerifyResult = true  //校验成功
    } else {
        rsp.VerifyResult = false  //校验失败
    }
    return nil
}
  1. 登録検証コード マイクロサービス サーバーからサービス検出 (consul)

captcha ディレクトリで go run main.go を実行し、consul UI でチェックインして登録が成功したかどうかを確認します。
正常に登録

3. キャプチャ検証コードのマイクロサービス クライアントを作成する

  1. 以前のモールプロジェクトの単一アーキテクチャでクライアントコードを生成

単一アーキテクチャ モールでキャプチャ検証コードを呼び出すためのインターフェイス コードは、 インターフェイス http://127.0.0.1:8080/admin/captcha を通じてアクセスされます 。具体的なコードは次のとおりです。

adminRouters.go


//验证码
adminRouters.GET("/captcha", admin.LoginController{}.Captcha)

LoginController.go


//获取验证码,验证验证码func(con LoginController) Captcha(c *gin.Context) {
	id, b64s, err := models.MakeCaptcha(50, 100 ,1)
	if err != nil {
		fmt.Println(err)
	}
	c.JSON(http.StatusOK, gin.H{
		"captchaId":    id,
		"captchaImage": b64s,
	})
}
上記は モデル配下の captcha.go MakeCaptcha() メソッドを呼び出して検証コードを取得しています このcaptcha.goは「 1.Captcha検証コード機能紹介」 のcaptcha.goのコードで もあります これが 独自のシングルアーキテクチャアプローチ ですアクセス以下のとおりであります:
次に、キャプチャ検証コード マイクロサービス に渡されて処理されます。
  1. まず、server/captcha/proto フォルダーをプロジェクトにコピーします。

  1. captcha.go 検証コードのマイクロサービス クライアント メソッドをカプセル化する

前章の検証コードでは、 フロントエンド バックグラウンドの両方で 検証コードのロジック処理を 行う必要があり 、呼び出しメソッドはmodels/captcha.go配下のメソッドとなっているため、マイクロサービスクライアントを処理する際にはここでも変更されます。

(1). 領事サービス検出の設定

まず、モデルの下に initCaptchaConsul.go を作成し、呼び出し用の consul サービス検出を設定します。コードは次のとおりです。
package models

//微服务客户端配置: 初始化consul配置,当一个项目中多个微服务时,就很方便了
//建议:一个微服务对应一个客户端,这样好管理

import (
    "github.com/go-micro/plugins/v4/registry/consul"
    "go-micro.dev/v4/client"
    "go-micro.dev/v4/registry"
)

//CaptchaClient: 全局变量 在外部的包中可以调用
var CaptchaClient client.Client

//init 方法: 当程序运行时就会自动执行
func init() {
    consulRegistry := consul.NewRegistry(
        //指定微服务的ip:  选择注册服务器地址,默认为本机,也可以选择consul集群中的client,建议一个微服务对应一个consul集群的client
        registry.Addrs("127.0.0.1:8500"),
    )
    // Create service
    srv := micro.NewService(
        micro.Registry(consulRegistry),
    )
    srv.Init()

    CaptchaClient = srv.Client()
}
ここでは、おそらく紹介されていないかもしれませんが、コマンドを実行します: go mod tiny imports 対応するパッケージをインポートします

(2).models/captcha.go の MakeCaptcha を改良し、検証コードメソッドを取得できるようにします。

このメソッドでは、検証コードのマイクロサービスを呼び出して取得するロジック関数を実装します。
//调用获取验证码微服务
func MakeCaptcha(height int, width int, length int) (string, string, error) {

    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的MakeCaptcha方法
    rsp, err := captchaClient.MakeCaptcha(context.Background(), &pbCaptcha.MakeCaptchaRequest{
        Height:     int32(height),  //验证码高度
        Width:     int32(width),  //验证码宽度
        Length:     int32(length),  //验证码长度
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    return rsp.Id, rsp.B64S, err
}

(3). models/captcha.go の VerifyCaptcha 検証コード メソッドを改善します。

このメソッドでは、検証検証コードを呼び出すマイクロサービスロジック機能を実現します。
//调用校验验证码微服务
func VerifyCaptcha(id string, VerifyValue string) bool {
    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的VerifyCaptcha方法
    rsp, err := captchaClient.VerifyCaptcha(context.Background(), &pbCaptcha.VerifyCaptchaRequest{
        Id:     id,  //验证码Id
        VerifyValue:     VerifyValue,  //验证码
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    return rsp.VerifyResult
}

(4). 完全なコードは次のとおりです。

package models

//验证码属性: https://captcha.mojotv.cn/
import (
    "context"
    "github.com/prometheus/common/log"
    pbCaptcha "goshop/proto/captcha"
)

//调用获取验证码微服务
func MakeCaptcha(height int, width int, length int) (string, string, error) {
    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的MakeCaptcha方法
    rsp, err := captchaClient.MakeCaptcha(context.Background(), &pbCaptcha.MakeCaptchaRequest{
        Height:     int32(height),  //验证码高度
        Width:     int32(width),  //验证码宽度
        Length:     int32(length),  //验证码长度
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    return rsp.Id, rsp.B64S, err
}

//调用校验验证码微服务
func VerifyCaptcha(id string, VerifyValue string) bool {
    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的VerifyCaptcha方法
    rsp, err := captchaClient.VerifyCaptcha(context.Background(), &pbCaptcha.VerifyCaptchaRequest{
        Id:     id,  //验证码Id
        VerifyValue:     VerifyValue,  //验证码
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    return rsp.VerifyResult
}
  1. キャプチャ検証コードのマイクロサービス関数を検証する

(1). まずサーバーを起動します

前のコードを参照してください

(2). クライアントを起動する

プロジェクトのルート ディレクトリで実行します : go main.go を実行して プロジェクトを開始します

(3). http://127.0.0.1:8080/admin/captcha にアクセスしてください。

http://127.0.0.1:8080/admin/captcha にアクセスして、 確認コード関連のデータが表示されるかどうかを確認します。
検証コードのマイクロサービス操作が呼び出されたことが表示されます。

(4). 検証コードのマイクロサービス操作が成功したかどうかを確認します。

バックグラウンド ログイン ページにアクセスし、ユーザー名、パスワード、確認コードを入力し、成功したかどうかを確認します。
これで、キャプチャ検証コード マイクロサービス クライアントの操作が完了しました。ここでは、Web ページ上でキャプチャ検証コード マイクロサービスを呼び出す関数を説明します。以下は、キャプチャ検証コード マイクロサービスを呼び出す Go Web Restfull APi の説明です。

4. Go Web Restfull API は、Captcha 検証コード マイクロサービスを呼び出します

Go Web Restfull APi は、主にモバイル アプリ、WeChat アプレットなどのインターフェイスを提供するために、Captcha 検証コード マイクロサービスを呼び出します。アーキテクチャは次のとおりです。
  1. API Gin プロジェクトを作成し、ルーターを構成する

ここでは上記のプロジェクトを直接ケースとして取り上げ、ルーターの下に apiRouters.go ルーティング ファイル を作成します。
  1. 検証コード関連のインターフェイスを構築します。コードは次のとおりです。

controllers/api/ CaptchaController.go に検証コードを記述して取得し 、検証コードの関連ロジックを検証します。コードは次のとおりです。
package api

import (
    "context"
    "github.com/gin-gonic/gin"
    "github.com/prometheus/common/log"
    "goshop/models"
    pbCaptcha "goshop/proto/captcha"
    "net/http"
)

type CatpchaController struct {
}

//获取验证码的接口(调用验证码微服务操作)
func (con CatpchaController) MakeCaptcha(c *gin.Context) {
    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", models.CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的MakeCaptcha方法
    rsp, err := captchaClient.MakeCaptcha(context.Background(), &pbCaptcha.MakeCaptchaRequest{
        Height:     100,  //验证码高度
        Width:     200,  //验证码宽度
        Length:     4,  //验证码长度
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    c.JSON(http.StatusOK, gin.H{
        "captchaId": rsp.Id,
        "B64s": rsp.B64S,
    })
}

//校验验证码接口
func (con CatpchaController) VerifyCaptcha(c *gin.Context) {
    //获取请求参数
    verifyId := c.PostForm("verifyId")
    verifyValue := c.PostForm("verifyValue")

    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", models.CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的VerifyCaptcha方法
    rsp, err := captchaClient.VerifyCaptcha(context.Background(), &pbCaptcha.VerifyCaptchaRequest{
        Id:     verifyId,  //验证码Id
        VerifyValue:     verifyValue,  //验证码
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    if rsp.VerifyResult == true {  // 说明验证通过
        c.JSON(http.StatusOK, gin.H{
            "message": "验证验证码成功",
            "success": true,
        })
    } else {
        c.JSON(http.StatusOK, gin.H{
            "message": "验证验证码失败",
            "success": false,
        })
    }
}
  1. APIリクエストが成功したかどうかを確認する

http://127.0.0.1:8080/api/MakeCaptcha をリクエストして、対応する検証コードの JSON リクエストが返されるかどうかを確認します。
上図の通り、認証コードに相当するデータが返ってきたら、 B64s のデータを <img src = "B64s" />に入れればOKです。

次に、通常は郵便配達員による検証を通じて検証コードを検証します。

さて、Go Web Restfull API は、Captcha 検証コード マイクロサービスを呼び出して検証コードを取得し、検証コード API インターフェイスを検証する操作が完了します

[前のセクション] [golang gin フレームワーク] 39. Gin Mall プロジェクト - マイクロサービス実践におけるマイクロサービス アーキテクチャ

[次節] [golang gin Framework] 41. ジンモールプロジェクト - マイクロサービス実戦後のバックグラウンドRbacマイクロサービス (ユーザーログイン、Gormデータベース設定別途抽出、Consul設定別途抽出)

おすすめ

転載: blog.csdn.net/zhoupenghui168/article/details/131742761