成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

依葫蘆畫瓢理解一個小型Go框架

開發 前端
最近在開發Go程序,同事(github.com/WiFeng/go-sky)參考go-kit框架封裝了一個簡易的輪子,包含了Api和Task任務,已經能滿足大部分Web需求,依葫蘆畫瓢。

最近在開發Go程序,同事(github.com/WiFeng/go-sky)參考go-kit框架封裝了一個簡易的輪子,包含了Api和Task任務,已經能滿足大部分Web需求,依葫蘆畫瓢,自己理解了下,參考下圖:

圖片

1:cmd/service.go

package main

import (
"github.com/WiFeng/go-sky"
"pkg/config"
"pkg/endpoint"
"pkg/service"
"pkg/task"
"pkg/transport/http"
)

func main() {

var (
service = service.New()
endpoints = endpoint.New(service)
httpHandler = http.NewHandler(endpoints)
)

sky.LoadAppConfig(&config.GlobalAppConfig)
sky.RegisterTask(task.Start, nil, true)
sky.Run(httpHandler)
}

初始化service、endpoint,NewHandler注冊路由作為web服務,再注冊Task運行后臺任務。

2:pkg\endpoint\endpoint.go:

package endpoint
import "pkg/service"

type Endpoints struct {
Article ArticleEndpoints
}

func New(s service.Service) Endpoints {
return Endpoints{
Article: NewArticleEndpoints(s),
}
}

返回一個大的Endpoints,其中包含子的Endpoints,會將service.Service結構體傳遞給Endpoints。

3:pkg\endpoint\article.go:

package endpoint

import (
"context"
kitendpoint "github.com/go-kit/kit/endpoint"
. "pkg/entity"
"pkg/service"
)

type ArticleEndpoints struct {
MGet kitendpoint.Endpoint
}

func NewArticleEndpoints(s service.Service) ArticleEndpoints {
return ArticleEndpoints{
MGet: MakeArticleMGetEndpoint(s),
}
}

func MakeArticleMGetEndpoint(s service.Service) kitendpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
req := request.(ArticleInfoMGetRequest)
return s.Article.MGet(ctx, req)
}
}

每一個子的Endpoint應該包含同一種類型的服務,最終調用對應的service服務方法。

不過ArticleInfoMGetRequest也可以在service\article.go(例子中注冊在entity) 中定義。MakeArticleMGetEndpoint返回一個閉包,注冊了一個路由。

4:pkg\entity\article.go

package entity

type ArticleInfo struct {
ArticleId int64 `json:"aid"`
Uid int64 `json:"uid"`
}

type ArticleInfoMGetRequest struct {
BaseRequest
ArticleIds []int64 `json:"aids"`
ForceNoCache bool `json:"force_no_cache"`
}

type ArticleInfoMGetRespData struct {
Infos []ArticleInfo `json:"infos"`
}

type ArticleInfoMGetResponse struct {
BaseResponse
Data ArticleInfoMGetRespData `json:"data"`
}

entity包含特定的工具方法。

5:pkg\service\service.go:

package service

type Service struct {
Article ArticleService
}

func New() Service {
return Service{
Article: ArticleService{},
}
}

service大結構體初始化,包括子service初始化。

6:pkg\service\article.go:

package service

import (
"context"
"pkg/dao"
. "github.com/xiwujie/article/pkg/entity"
)

type ArticleSyncJobRequest struct {
BaseRequest
Limit int `json:"limit"`
JobName string `json:"job_name"`
}

type ArticleSyncJobResponse struct {
BaseResponse
}

type ArticleService struct {
}

func (s *ArticleService) MGet(ctx context.Context, req ArticleInfoMGetRequest) (interface{}, error) {
var resp ArticleInfoMGetResponse

if req.ArticleIds == nil || len(req.ArticleIds) < 1 {
return resp, nil
}
sdao = dao.NewSearchActivityTable(ctx)
sdao.FetchById()

return resp, nil
}

具體的service服務,包含req,response的定義,也可以定義到 entry 目錄下。

7:pkg/dao/article.go

package dao

import (
"context"
"database/sql"
"fmt"

skydb "github.com/WiFeng/go-sky/database"
)

const (
searchActivityTableName = ""
)

type SearchActivityTable struct {
db *sql.DB
}

func NewSearchActivityTable(ctx context.Context) (*SearchActivityTable, error) {
}

func (t *SearchActivityTable) FetchById(ctx context.Context, id int) {
}

dao方法,主要進行數據庫等資源的操作。

8:pkg\transport\http\handler.go

func NewHandler(endpoints endpoint.Endpoints) http.Handler {
r := skyhttp.NewRouter()

genericOptions := []kithttp.ServerOption{
kithttp.ServerErrorEncoder(genericErrorEncoder),
}

r.Methods(http.MethodPost).Path(ArticleInfoMgetURI).Handler(skyhttp.NewServer(
endpoints.Article.MGet,
decodeHTTPArticleInfoMgetRequest,
encodeHTTPGenericResponse,
genericOptions...,
))

return r
}

注冊http路由,endpoint作為參數傳遞給handler。

責任編輯:武曉燕 來源: 虞大膽的嘰嘰喳喳
相關推薦

2021-01-13 05:21:59

參數

2021-07-21 09:35:36

switchbreakJava

2019-08-09 10:33:36

開發技能代碼

2013-04-11 14:16:57

Objective-CiOS開發內存管理

2021-02-20 09:45:02

RPC框架Java

2021-07-18 09:30:56

微軟Windows 10Windows

2011-07-22 09:17:26

ApacheJava

2024-02-27 07:33:32

搜索引擎Rust模型

2015-10-12 15:50:07

PaaS云平臺開發go

2023-02-26 01:37:57

goORM代碼

2023-05-10 08:05:41

GoWeb應用

2023-01-06 08:59:07

模塊化基礎設施框架

2025-01-13 13:00:00

Go網絡框架nbio

2021-09-02 11:11:27

網絡數據技術

2020-03-26 17:00:53

HashMapputJava

2020-11-02 08:19:18

RPC框架Java

2024-01-02 12:17:44

Go傳統遠程

2024-09-27 09:51:06

2020-08-17 08:20:16

iOSAOP框架

2021-07-26 10:14:38

Go語言工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 另类专区亚洲 | 亚洲精品在线看 | 亚洲欧美bt | 一本大道久久a久久精二百 欧洲一区二区三区 | 成人性视频免费网站 | 国产精品久久7777777 | 精品一二区 | 综合久久综合久久 | 日韩在线播放视频 | 久久一区视频 | 亚洲一区二区视频 | 国产在线观看一区二区三区 | 久久精品无码一区二区三区 | 亚洲精品在线视频 | 亚洲精品久久久久久久久久久久久 | 亚洲久在线 | 日韩欧美一区二区三区免费观看 | 国产欧美一级二级三级在线视频 | 亚洲一区二区在线电影 | 日本精品视频在线观看 | 国产羞羞视频在线观看 | 亚洲va欧美va天堂v国产综合 | 久久久久久久久国产成人免费 | 三级黄色片在线 | 国产美女免费视频 | 国外成人在线视频网站 | 国产黄色大片在线免费观看 | 久久久精品国产 | 作爱视频免费看 | 亚洲精品乱码久久久久久9色 | 欧美jizzhd精品欧美巨大免费 | 精品伊人久久 | 成人午夜免费网站 | 99精品国产在热久久 | 欧美成人免费在线视频 | h片在线免费观看 | 精品一区二区三区中文字幕 | 羞羞视频在线观免费观看 | 欧美一区二区三区四区在线 | 黄色免费av| 久草在线 |