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

宁夏政务网站建设标准京津冀协同发展四区指的是

宁夏政务网站建设标准,京津冀协同发展四区指的是,ui设计师资格证,如何制作企业内部网站写在前面 最近稍微重构了之前写的 grpc-todolist 模块 项目地址#xff1a;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版本的项目结构是分成了三个模块网关taskuser模块。每个模块下各自读取配置文件各自进行服务注册。 http 请求进入网关之后网关开始转发并调用 rpc 请求user、task模块接受到 rpc 调用之后开始进行操作业务逻辑处理结果返回给网关网关再次对客户端进行 resp 响应。 基本思想没有问题但是这种结构的问题是重复代码过多很多代码是可以复用的就没必要都写。 1.1.2 改变后 我们抽离出各个微服务模块下相同的内容比如configpkgproto的内容并且新建一个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 抽离pkgconfig等公共模块。简化各个微服务模块的结构。 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文件的快速生成 这里使用protoc和protoc-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; \donefor file in $(shell find $(IDL_PATH)/pb/* -type f); do \protoc-go-inject-tag -input$$file; \doneprotoc命令用于生成pb.gogrpc.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_namestring NickName1;// inject_tag: json:user_name form:user_name uri:user_namestring UserName2;// inject_tag: json:password form:password uri:passwordstring Password3;// inject_tag: json:password_confirm form:password_confirm uri:password_confirmstring PasswordConfirm4; }当然除了这个解决方法我们可以将NickName写成nickname小写也是可以的protoc会自动在代码层面将nickname变成Nickname代码层面还是可以调用的并且接受参数还可以是小写。例如这样 message UserRequest{string nick_name1;string user_name2;string password3;string password_confirm4; }看个人喜好吧… 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下来自己跑跑切换一下v1v2分支来进行感受这一次的改变。
http://www.hkea.cn/news/14484481/

相关文章:

  • wordpress 站标不显示百度广告费
  • 用凡科网做网站怎么保存到桌面wordpress fold主题
  • 网站建设与网页设计论文wordpress 发邮件 php
  • 安徽网站推广公司服务器租用多少钱
  • 淄博找能做网站的公司网络营销的五大优势
  • 怎么组建企业网站seo辅助工具
  • 官方网站建设的意义阳江网雨大精神病专科医院
  • 阿里巴巴国际站外贸流程lovephoto wordpress
  • js网站评论框怎样做网站变手机软件
  • 做网站是用源码还是模版泰州网站优化公司
  • 中午网站做google广告好吗一个公司如何做多个网站备案
  • 企业建站的费用临淄关键词网站优化培训中心
  • 爱有声小说网站捡个校花做老婆企业级网站开发需求分析
  • 做民宿上几家网站好专业的南京网站建设
  • 做简历网站 39网站建设与维护高职
  • 青岛菜西有做网站的吗seo网站排名
  • WordPress移动站网站开发策划书
  • 中国建设报官网技术优化seo
  • 深圳网站营销推广公司电话网站建设杭州哪家好
  • 广州网站推广多少钱咸阳市城乡建设规划局网站
  • 网站建设 客户网站关键词排名提高
  • 怎么让网站被搜索到小企业网站建设平台
  • discuz做电影网站广州公司注册提供地址
  • 成都公司网站seo医疗网站跳出率平均是多少
  • 从化网站建设天眼查询企业信息官网电话
  • 查看网站开通时间网站中上传资料存放ftp
  • 专业做俄语网站建设司上蔡网站建设
  • dz论坛网站源码网站建设z亿玛酷1订制
  • 网站后台和前台不一致医院网站管理系统
  • 2019做哪个网站赚钱电脑编程培训学校哪家好