国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go 語言微服務框架 Kratos 開發 HTTP API

開發 前端
本文我們介紹使用 kratos 微服務框架,怎么創建 HTTP API,介紹了怎么通過 kratos 腳手架創建項目和生成 proto 文件。Kratos 微服務框架使用 DDD 和 DI 的代碼架構,我們介紹 kratos 模板生成的代碼目錄的作用。

1.介紹

Kratos 一套輕量級 Go 微服務框架,包含大量微服務相關框架及工具。

本文我們分為開發環境,創建項目,代碼目錄,HTTP API,四個部分介紹 Kratos 微服務框架。

2.開發環境

使用 Kratos 微服務框架,我們需要準備 Go 開發環境,我們選擇使用 Go 當前最新版本 go v1.23。

因為 Kratos 微服務框架通過 Protobuf IDL 定義 API,所以我們需要安裝工具 protoc,以及相關插件,比如 protoc-gen-go 等。

因為 Kratos 微服務框架使用依賴注入,所以我們需要安裝依賴工具 wire。

此外,Kratos 微服務框架提供了腳手架工具 kratos。

3.創建項目

我們可以使用 Kartos 微服務框架的腳手架工具 kratos 創建項目。

示例代碼:

kratos new user-center -r https://gitee.com/go-kratos/kratos-layout.git

閱讀上面這段代碼,我們可以發現使用 kratos 的 new 命令創建項目名稱為 user-center 的項目,使用 -r 指定模板源。

此外,也可以使用環境變量指定模板源,例如:KRATOS_LAYOUT_REPO=https://gitee.com/go-kratos/kratos-layout.git。

4.代碼目錄

在使用 kratos 創建項目之后,我們再介紹一下項目的代碼目錄。

示例代碼:

.
└── user-center
    ├── api
    │   ├── helloworld
    ├── cmd
    │   └── user-center
    ├── configs
    │   └── config.yaml
    ├── Dockerfile
    ├── go.mod
    ├── go.sum
    ├── internal
    │   ├── biz
    │   ├── conf
    │   ├── data
    │   ├── server
    │   └── service
    ├── LICENSE
    ├── Makefile
    ├── openapi.yaml
    ├── README.md
    └── third_party
        ├── errors
        ├── google
        ├── openapi
        ├── README.md
        └── validate

閱讀上面的代碼目錄,我們分別介紹每個目錄的作用,api 目錄中是 proto 文件以及 protoc 生成的 go 文件;cmd 目錄中是項目入口文件 main.go 和 wire 工具的文件 wire.go 以及 wire 生成的 go 文件;configs 目錄中是配置文件;

internal 目錄中是業務邏輯代碼,其中 biz 目錄中是 DDD 的 domain 和 usecase,data 目錄中是 DDD 的 repository,service 目錄中是 DDD 的 delivery;

conf 目錄中是使用 proto 格式的配置文件,server 目錄中是 http 和 grpc 的實例。

5.HTTP API

創建 proto 文件

Kratos 微服務框架開發 HTTP API 和 RPC API 都是通過定義 proto。

我們可以使用 kratos 腳手架工具生成 proto 模板文件,然后按照自己的需求修改。

示例代碼:

kratos proto add api/user/v1/user.proto

也可以手動創建 proto 文件,并且編寫相關代碼。

示例代碼:

syntax = "proto3";

package user.v1;

import "google/api/annotations.proto";

option go_package = "user-center/api/user/v1;v1";

service User {
    rpc Login (LoginReq) returns (LoginRes) {
        option (google.api.http) = {
            post: "/login",
            body: "*",
        }
    }
}

message LoginReq {
    string email = 1;
    string password = 2;
}

message LoginRes {
    string name = 1;
}

在創建 proto 文件之后,我們生成 go 文件,可以直接使用 protoc 工具,也可以使用 kratos 腳手架,本文我們使用 kratos 腳手架。

生成 client 源碼

示例代碼:

kratos proto client api/user/v1/user.proto

生成 server 源碼

示例代碼:

kratos proto server api/user/v1/user.proto -t internal/service

接入 XORM

修改 internal/data/data.go 文件。

示例代碼:

// Data .
type Data struct {
 // TODO wrapped database client
 dbEngine *xorm.Engine
}

// NewData .
func NewData(c *conf.Data, logger log.Logger, dbEngine *xorm.Engine) (*Data, func(), error) {
 cleanup := func() {
  log.NewHelper(logger).Info("closing the data resources")
 }
 return &Data{
  dbEngine: dbEngine,
 }, cleanup, nil
}

// NewDbEngine .
func NewDbEngine(c *conf.Data) (dbEngine *xorm.Engine, err error) {
 dbEngine, err = xorm.NewEngine(c.Database.Driver, c.Database.Source)
 return
}

修改配置文件

修改 configs/config.yaml 文件。

示例代碼:

data:
  database:
    driver: mysql
    source: frank:123456@tcp(192.168.110.156:3306)/user?parseTime=True&loc=Local

domain 層和 usecase 層

在 internal/biz/user.go 文件中,編寫 domain 層和 usecase 層代碼。

示例代碼:

package biz

import (
 "context"
 pb "user-center/api/user/v1"
)

type User struct {
 Email    string
 Password string
}

type UserRepo interface {
 Create(ctx context.Context, loginReq *pb.LoginReq) (int64, error)
}

type UserUsecase struct {
 ur UserRepo
}

func NewUserUsecase(ur UserRepo) *UserUsecase {
 return &UserUsecase{
  ur: ur,
 }
}

func (u *UserUsecase) Register(ctx context.Context, loginReq *pb.LoginReq) (id int64, err error) {
 id, err = u.ur.Create(ctx, loginReq)
 return
}

repository 層

在 internal/data/user.go 文件中,編寫 reporitory 層代碼。

示例代碼:

package data

import (
 "context"
 "fmt"
 pb "user-center/api/user/v1"
 "user-center/internal/biz"
)

type userRepo struct {
 data *Data
}

func NewUserRepo(data *Data) biz.UserRepo {
 return &userRepo{
  data: data,
 }
}

func (u *userRepo) Create(ctx context.Context, loginReq *pb.LoginReq) (id int64, err error) {
 fmt.Println(loginReq)
 id, err = u.data.dbEngine.InsertOne(loginReq)
 return
}

delivery 層

在 internal/service/user.go 文件中,編寫 delivery 層代碼。

示例代碼:

package service

import (
 "context"
 "user-center/internal/biz"

 pb "user-center/api/user/v1"
)

// UserService is a user service.
type UserService struct {
 pb.UnimplementedUserServer
 uc *biz.UserUsecase
}

// NewUserService new a user service.
func NewUserService(uc *biz.UserUsecase) *UserService {
 return &UserService{
  uc: uc,
 }
}

// Login implements user.UserService.
func (u *UserService) Login(ctx context.Context, req *pb.LoginReq) (res *pb.LoginRes, err error) {
 _, err = u.uc.Register(ctx, req)
 return
}

注冊 HTTP API

在生成 server 源碼之后,我們需要注冊 HTTP API。

在 internal/server/http.go 文件中,修改代碼,導入 v1 blog/api/user/v1 ,在 NewHTTPServer 函數的參數列表中添加 user *service.UserService ,在函數體中添加 v1.RegisterUserHTTPServer(srv, user) 。

wire 生成

接下來,我們需要修改 wire 的 provider。

在 internal/service/service.go 文件中,新增 NewUserService。

示例代碼:

var ProviderSet = wire.NewSet(NewGreeterService, NewUserService)

在 internal/biz/biz.go 文件中,新增 NewUserUsecase。

示例代碼:

var ProviderSet = wire.NewSet(NewGreeterUsecase, NewUserUsecase)

在 internal/data/data.go 文件中,新增 NewUserRepo。

示例代碼:

var ProviderSet = wire.NewSet(NewData, NewDbEngine, NewGreeterRepo, NewUserRepo)

執行 wire 生成命令:

示例代碼:

cd cmd/user-center
wire

查看 wire_gen.go 文件。

示例代碼:

// wireApp init kratos application.
func wireApp(confServer *conf.Server, confData *conf.Data, logger log.Logger) (*kratos.App, func(), error) {
 engine, err := data.NewDbEngine(confData)
 if err != nil {
  return nil, nil, err
 }
 dataData, cleanup, err := data.NewData(confData, logger, engine)
 if err != nil {
  return nil, nil, err
 }
 greeterRepo := data.NewGreeterRepo(dataData, logger)
 greeterUsecase := biz.NewGreeterUsecase(greeterRepo, logger)
 greeterService := service.NewGreeterService(greeterUsecase)
 grpcServer := server.NewGRPCServer(confServer, greeterService, logger)
 userRepo := data.NewUserRepo(dataData)
 userUsecase := biz.NewUserUsecase(userRepo)
 userService := service.NewUserService(userUsecase)
 httpServer := server.NewHTTPServer(confServer, userService, logger)
 app := newApp(logger, grpcServer, httpServer)
 return app, func() {
  cleanup()
 }, nil
}

閱讀上面代碼,我們可以發現 wire 工具已經生成依賴注入代碼。

運行代碼

示例代碼:

kratos run

6.總結

本文我們介紹使用 kratos 微服務框架,怎么創建 HTTP API,介紹了怎么通過 kratos 腳手架創建項目和生成 proto 文件。

Kratos 微服務框架使用 DDD 和 DI 的代碼架構,我們介紹 kratos 模板生成的代碼目錄的作用。

關于 proto 和 wire 工具,以及 DDD 和 DI 的詳細介紹,我們在之前的文章中都介紹過,讀者朋友們可以按需翻閱。

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2025-08-04 01:22:00

Go 語言微服務Kratos

2025-01-13 00:00:07

Go語言微服務

2025-01-20 00:10:00

Go語言Kratos

2024-12-30 00:38:23

Go語言微服務

2025-10-20 07:17:10

Go語言微服務

2025-01-06 00:00:01

KratosGo微服務

2024-11-07 11:46:41

2018-12-11 10:43:09

Go語言 HTTP服務器

2021-07-26 11:19:43

微服務開發技術

2023-12-13 07:19:01

微服務架構Golang

2021-09-06 11:34:47

架構微服務Hystrix

2021-03-05 11:09:46

Go框架微服務

2020-11-03 09:00:00

API微服務JavaScript框

2018-01-22 11:50:30

華為云

2017-04-10 20:21:39

Go語言源碼分析Handler

2017-04-10 13:26:06

Go語言源碼

2021-01-14 09:55:21

Java微服務Go

2018-12-13 09:00:23

GoogleGo微服務

2022-06-08 08:52:04

Tars微服務開發C++開發

2025-05-26 04:00:00

點贊
收藏

51CTO技術棧公眾號

精品国产乱码久久久久久108| 久草在线资源视频在线观看| 国产韩国精品一区二区三区| 成人免费视频网站入口| 一本一道久久a久久精品综合| 日韩欧美中字| 久久久在线视频| 天天综合网天天| 欧美一级日韩免费不卡| 男女污污视频在线观看| 亚洲国产成人一区二区三区| 又粗又黑又大的吊av| 激情五月播播久久久精品| 欧美一区二区视频在线| 伊人激情综合| 国产欧美一区二区三区另类精品 | 国产肥臀一区二区福利视频| 国产一区二区调教| 伊人婷婷久久| 国产99久久久国产精品潘金| 好吊色视频988gao在线观看| 国产精品亚洲一区二区三区在线| 亚洲精品成人久久久998| 人人超碰91尤物精品国产| 日韩和欧美的一区二区| 蜜臀精品久久久久久蜜臀| 国产又大又长又粗又黄| 成人综合在线观看| 婷婷无套内射影院| 国产嫩草影院久久久久| 成人嫩草影院免费观看| 亚洲黄色片在线观看| 国外男同性恋在线看| 欧美视频在线视频| 黄网站在线免费| 日韩国产精品亚洲а∨天堂免| 神马久久资源| 久久久久久国产免费 | 国产一区久久| 成人亚洲综合色就1024| 久久精品亚洲人成影院 | 一区二区欧美国产| 四虎电影院在线观看| 欧美日韩一区中文字幕| av在线播放观看| 精品视频在线播放| av在线成人| 国产ts人妖一区二区三区| 欧美日韩福利| 日韩视频在线免费播放| 久久综合久久综合九色| 蜜桃臀av在线| 欧美变态口味重另类| 久久久久黄色| 国产精品看片资源| 久久亚洲色图| 50路60路老熟妇啪啪| 亚洲va欧美va人人爽| av色综合久久天堂av色综合在| 黄色影院在线看| 91精品国产欧美一区二区| 国产剧情av在线播放| 在线观看国产精品淫| 日韩av免费在线看| 国产一区二区三区亚洲| 国产精品久久久久久久久免费| 激情五月***国产精品| 国内外成人激情免费视频| 中文字幕一区二区三区蜜月 | 国产情侣第一页| 国产精品美女久久久久久久久| 酒色婷婷桃色成人免费av网| 精品一区二区三区四区在线| 国产精品久av福利在线观看| 国产精品一 二 三| 国产日韩欧美一区二区三区综合| 国产一级片在线| 久久精品男人天堂| 欧美国产三区| 国产主播中文字幕| 精品免费99久久| 久久av资源| 黄色一级片在线看| 色婷婷av一区| 久久97精品| 在线观看成人一级片| 亚洲成av人片在线观看| 亚洲网站三级| 亚洲国产一区二区精品视频| 欧美日韩亚洲精品内裤| 亚洲日本va午夜在线电影| 一本一道久久a久久精品综合| 天涯成人国产亚洲精品一区av| 欧美国产视频| 夜夜爽99久久国产综合精品女不卡 | 亚洲国产精品高清久久久| 伊人春色之综合网| 亚洲精品蜜桃久久久久久| 欧美午夜精品电影| 欧美综合精品| 97免费视频观看| 欧美一区二区黄色| 日韩在线视屏| av在线无限看| 亚洲小视频在线| 狂野欧美一区| 男女av在线| 日本欧美在线视频| 久久人人爽人人爽| 中文字幕成在线观看| 国产高清在线精品一区二区三区| 专区另类欧美日韩| 国产精品亚洲欧美一级在线 | 青青草国产成人a∨下载安卓| www国产精品内射老熟女| 精品国产乱码久久久久久牛牛| 女主播福利一区| 中文字幕一区二区三区域| 久久av红桃一区二区小说| 国产精品自拍网站| av资源新版天堂在线| 国产一区免费在线| 欧美日韩另类字幕中文| 免费电影一区二区三区| 色悠悠久久综合网| 欧美成人亚洲成人日韩成人| 成人97人人超碰人人99| 素人啪啪色综合| 2022中文字幕| 一区二区三区四区在线观看视频 | 亚洲欧美自拍偷拍色图| 国产精品一级在线观看| 国产精品无码人妻一区二区在线| 国产午夜精品全部视频播放| 久久精品国产精品亚洲综合| 污影院在线观看| 欧美精品一区二区三区久久| 91精品国产综合久久久久久| 久久精品1区| 超碰激情在线| www.av片| 国模私拍视频一区| 一区二区视频在线| 91麻豆精品国产91久久久平台 | 精一区二区三区| 17videosex性欧美| 中文字幕中文字幕在线中一区高清| 亚洲精品在线电影| 国产一区不卡精品| 欧美久久久网站| 99热在线免费观看| 一区二区三区国产盗摄| 亚洲伦理在线| 日韩人妻精品无码一区二区三区| 国产精品国产福利国产秒拍| www..com久久爱| 日日夜夜一区二区| 日韩视频在线一区二区三区| 亚洲视频中文| 99国产精品一区二区| 成人精品3d动漫| 91亚洲精选| 国产一区99| 97人人精品| 麻豆成人在线| 一区二区三区日韩| 欧美日韩精品欧美日韩精品| 欧美日本韩国一区二区三区视频| 欧美激情女人20p| 亚洲免费一在线| 91精品国产91久久久久久一区二区| 亚洲国产精品专区久久| 欧美伦理91i| 欧洲成人一区二区| 精品女厕厕露p撒尿| 色a资源在线| 狼人天天伊人久久| 日韩视频一二区| 国产欧美高清视频在线| 少妇精品久久久一区二区三区| 日韩欧美一级| 国产精品一线天粉嫩av| 国产一区二区三区国产| 国产在线播放一区三区四| 丰满少妇久久久久久久| 亚洲成av人在线观看| 国产一区av在线| 福利视频久久| 一本大道香蕉8中文在线视频| 欧美××××黑人××性爽 | 成功精品影院| 开心九九激情九九欧美日韩精美视频电影 | 韩国福利在线| 日韩在线黄色| 久久精品男女| 在线免费观看日本欧美| 亚洲影院色无极综合| 男女av在线| 日本不卡一区二区三区高清视频| 欧美日韩在线影院|