当前位置: 首页 > news >正文

石家庄网站制作福州精美ppt模板图片

石家庄网站制作福州,精美ppt模板图片,国内创意产品网站,手机上怎么制作app写在前面 最近稍微重构了之前写的 grpc-todolist 模块 项目地址:https://github.com/CocaineCong/grpc-todoList 1. 项目结构改变 与之前的目录有很大的区别 1.1 grpc_todolist 项目总体 1.1.1 改变前 grpc-todolist/ ├── api-gatway // 网关模块 ├── ta…

写在前面

最近稍微重构了之前写的 grpc-todolist 模块
项目地址:https://github.com/CocaineCong/grpc-todoList

1. 项目结构改变

与之前的目录有很大的区别

1.1 grpc_todolist 项目总体

1.1.1 改变前

grpc-todolist/
├── api-gatway  // 网关模块
├── task		// task模块
└── user		// user模块

v1版本的项目结构是分成了三个模块,网关,task,user模块。每个模块下各自读取配置文件,各自进行服务注册。

http 请求进入网关之后,网关开始转发并调用 rpc 请求,user、task模块接受到 rpc 调用之后,开始进行操作业务逻辑处理,结果返回给网关,网关再次对客户端进行 resp 响应。

基本思想没有问题,但是这种结构的问题是重复代码过多,很多代码是可以复用的,就没必要都写。

1.1.2 改变后

我们抽离出各个微服务模块下相同的内容,比如config,pkg,proto的内容,并且新建一个app文件夹,放置所有的gateway、task、user模块中所独有的,并且启动文件都放到各个模块下的cmd中。

grpc-todolist/
├── app                   // 各个微服务
│   ├── gateway           // 网关
│   ├── task              // 任务模块微服务
│   └── user              // 用户模块微服务
├── bin                   // 编译后的二进制文件模块
├── config                // 配置文件
├── consts                // 定义的常量
├── doc                   // 接口文档
├── idl                   // protoc文件
│   └── pb                // 放置生成的pb文件
├── logs                  // 放置打印日志模块
├── pkg                   // 各种包
│   ├── e                 // 统一错误状态码
│   ├── discovery         // etcd服务注册、keep-alive、获取服务信息等等
│   ├── res               // 统一response接口返回
│   └── util              // 各种工具、JWT、Logger等等..
└── types                 // 定义各种结构体

1.2 gateway网关模块

网关模块单单只是处理http请求,没有任何的业务逻辑,所以基本都是大量的中间件的使用。比如jwt鉴权,限流,etcd的服务发现等等…

gateway/
├── cmd                   // 启动入口
├── internal              // 业务逻辑(不对外暴露)
│   ├── handler           // 视图层
│   └── service           // 服务层
│       └── pb            // 放置生成的pb文件
├── logs                  // 放置打印日志模块
├── middleware            // 中间件
├── routes                // http 路由模块
└── rpc                   // rpc 调用

1.3. 各微服务模块

各个微服务的结构比较简单,因为各微服务模块都是处于一种被调用的状态,在该模块下聚焦好业务即可。

user/
├── cmd                    // 启动入口
└── internal               // 业务逻辑(不对外暴露)├── service            // 业务服务└── repository         // 持久层└── db             // 视图层├── dao          // 对数据库进行操作└── model        // 定义数据库的模型

1.4 项目的总结模块

  • 抽离出 proto 成 idl ,抽离pkg,config等公共模块。
  • 简化各个微服务模块的结构。

2. 代码层级的改变

2.1 RPC的调用方式

2.1.1 改变前

在v1版本中,我们是将我们的微服务的服务实例放到 gin.Key

func InitMiddleware(service []interface{}) gin.HandlerFunc {return func(context *gin.Context) {// 将实例存在gin.Keys中context.Keys = make(map[string]interface{})context.Keys["user"] = service[0]context.Keys["task"] = service[1]context.Next()}
}

通过断言的方式取出这个服务实例

func UserRegister(ginCtx *gin.Context) {var userReq service.UserRequestPanicIfUserError(ginCtx.Bind(&userReq))// 从gin.Key中取出服务实例userService := ginCtx.Keys["user"].(service.UserServiceClient)userResp, err := userService.UserRegister(context.Background(), &userReq)PanicIfUserError(err)r := res.Response{Data:   userResp,Status: uint(userResp.Code),Msg:    e.GetMsg(uint(userResp.Code)),}ginCtx.JSON(http.StatusOK, r)
}

这种结构是没有什么问题,但是就是缺少 rpc调度 那个味道。

2.1.2 改变后

我们可以新建一个rpc的文件来存储rpc相关,例如下面这个代码,是对下游的 UserRegister 进行调用。

func UserRegister(ctx context.Context, req *userPb.UserRequest) (resp *userPb.UserCommonResponse, err error) {r, err := UserClient.UserRegister(ctx, req)if err != nil {return}if r.Code != e.SUCCESS {err = errors.New(r.Msg)return}return
}

然后在 handler 这里调用 rpc 进行操作。而不需要把服务实例放到ctx中,去取服务实例来进行调用。

func UserRegister(ctx *gin.Context) {var userReq pb.UserRequestif err := ctx.Bind(&userReq); err != nil {ctx.JSON(http.StatusBadRequest, ctl.RespError(ctx, err, "绑定参数错误"))return}r, err := rpc.UserRegister(ctx, &userReq)if err != nil {ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "UserRegister RPC服务调用错误"))return}ctx.JSON(http.StatusOK, ctl.RespSuccess(ctx, r))
}

2.2 Makefile文件编写

makefile文件是起到项目的快速启动和关闭的作用

2.2.1 proto文件的快速生成

这里使用protocprotoc-go-inject-tag的命令来生成.pb.go文件。

.PHONY: proto
proto:@for file in $(IDL_PATH)/*.proto; do \protoc -I $(IDL_PATH) $$file --go-grpc_out=$(IDL_PATH)/pb --go_out=$(IDL_PATH)/pb; \done@for file in $(shell find $(IDL_PATH)/pb/* -type f); do \protoc-go-inject-tag -input=$$file; \done

protoc命令:用于生成pb.go,grpc.go文件。
protoc-go-inject-tag 命令:用于重写pb.go文件中的tag,使得能加入json:“xxx” form:"xxx"等tag来进行操作。

例如如下proto文件,如果没有 protoc-go-inject-tag 那么我们生成的 NickName 中就是大写,也就是接受参数是大写,但我们一般是使用小写来接受参数。

message UserRequest{// @inject_tag: json:"nick_name" form:"nick_name" uri:"nick_name"string NickName=1;// @inject_tag: json:"user_name" form:"user_name" uri:"user_name"string UserName=2;// @inject_tag: json:"password" form:"password" uri:"password"string Password=3;// @inject_tag: json:"password_confirm" form:"password_confirm" uri:"password_confirm"string PasswordConfirm=4;
}

当然,除了这个解决方法我们可以将NickName写成nickname小写,也是可以的,protoc会自动在代码层面,将nickname变成Nickname,代码层面还是可以调用的,并且接受参数还可以是小写。例如这样

message UserRequest{string nick_name=1;string user_name=2;string password=3;string password_confirm=4;
}

看个人喜好吧…

2.2.2 环境的快速启动

快速启动环境

.PHONY: env-up
env-up:docker-compose up -d

这里会根据compose文件,来进行环境的快速启动。

在这里插入图片描述
创建的时候,已经是创建了数据库了,所以我们只需要去到各个模块下的cmd文件夹下进行启动微服务即可,例如到 app/user/cmd,启动这个main.go就可以启动user模块了。

快速关闭环境

.PHONY: env-down
env-down:docker-compose down

在这里插入图片描述

以上就是这次grpc重构过程中的重要更新,大家可以把项目clone下来,自己跑跑,切换一下v1,v2分支来进行感受这一次的改变。

http://www.yayakq.cn/news/895321/

相关文章:

  • 在那里能找到网站合肥网站建设百家号
  • 定边网站建设互联网保险的发展现状
  • 网站 粘度医疗企业vi设计公司
  • 中科宁波网站建设沧州网站制作的流程
  • 找个做网站的北京建筑工程公司
  • ios wordpress fixedseo需要付费吗
  • 景安建网站山东住房和建设庭官网站官
  • 西安网站建设服务商石家庄平山网站推广优化
  • 青岛网站建设加王道下拉阳江本地网络平台
  • seo技术优化整站百度热搜榜排名
  • 专门做鞋子的网站吗营销型网站建设思路
  • 陕西省建设八大员官方网站阿里云备案要关网站吗
  • 网站建设费用构成油边机 东莞网站建设
  • mysql网站后台管理系统下载油漆涂料网站建设
  • wordpress备份整站ppt超链接至网站怎么做
  • 重庆教育建设集团有限公司网站网站开发的代码
  • 上海网站建设 中华企业录重庆森林经典台词罐头
  • 客户端 网站开发 手机软件开发网络营销渠道建设方案
  • 网站一天要发多少外链产品广告策划方案
  • 温州网站制作优化加工网套
  • 网站可以用ai做吗wordpress toggle
  • php 企业网站框架怎么在网站上打广告
  • 域名绑定ip网站吗马鞍山 网站建设 有限公司
  • 中国能建旗下公司排名seo排名哪家公司好
  • 个人博客网站搭建模板在线做图软件
  • 如何做网站的后台本溪做网站的
  • 可以自己做logo的网站手机百度2022年新版本下载
  • 最专业网站建设公司哪家好销售外包公司
  • 宁波高端网站设计价格构建一个网站需要什么
  • 企业门户网站内容建设wordpress有赞支付插件