微服务 - Go语言从单体服务到微服务(代码说明篇)_环球时快讯

2023-04-10 19:25:42 来源:腾讯云

概述

微服务是一种思想,与编程语言无关,编程语言是思想下具体的一种实现方式,使用的是Go语言的go-zero框架进行实现代码开发的,关于微服务的思考我在后面会做更具体和系统的说明。


(相关资料图)

请求流程

Api网关

go-zero高效开发的主要原因是得益于goctl开发工具的应用,goctl有非常丰富的命名,可以自动完成很多代码初始化工作,下面我为你逐一的介绍一下这些用法和注意的地方。

api文件编写

1.使用中间件和分组

middleware: 生成的中间件文件,路由会经过中间件验证权限,到达下一层group: 正确使用group分组,代码更加清晰而整洁,多个分组时,service名字需要保持一致
@server(middleware :AuthMiddlewaregroup: admin)service api {@doc "admin - 有声作品详情"@handler adminDramaInfoHandlerget /admin/audio/dramaInfo(DramaInfoRequest) returns (DramaInfoResp)}@server(middleware :AuthMiddlewaregroup: web)service api {@doc "web - 有声推荐删除操作"@handler webSoundSpecialHandlerget /web/home/getSoundSpecial(Req) returns (ShortRecPositionResp)}@server(middleware :AuthMiddlewaregroup: web)service api {@doc "web - 有声用户收藏"@handler webCheckUsercollDramaHandlerpost /web/usercoll/checkDrama(CheckCollDramaReq) returns (CheckCollDramaResp)}

2.正确定义结构体

先展示一下返回的Json结构体,Go语言是静态语言,对于返回的类型和结构有严格的控制,需要正确的定义对应的结构体。

{    "code": 200,    "msg": "OK",    "data": {        "dramaInfo": {            "id": 80,            "name": "打包购买且单集开关",            "author": "猪大肠",        },        "process": {            "1": "连载",            "2": "完结"        },        "producerList": [            {                "id": 18,                "name": "张宇工作室"            },        ]    }}

对应接口编写的结构体,有map类型的,Info类型的,还有切片List的,每个写一个Demo进行说明。

DramaInfoRequest {DramaId int `json:"dramaId,default=0"`}DramaInfoResp {DramaInfo    Info           `json:"dramaInfo"`Process      map[int]string `json:"process"`ProducerList []Producer     `json:"producerList"`}Info {Id                  int64  `json:"id"`Name                string `json:"name"`Author              string `json:"author"`}Producer {Id   int64  `json:"id"`Name string `json:"name"`}

3.使用goctl工具生成Api项目目录

goctl api go  -api api.api -dir ./ --style=goZero

Api配置文件编写

Api使用Etcd的方式调用Rpc服务,编写Yaml文件的时候一定要注意配置文件的正确编写,不能有多余空格,制表符等等问题,ip 172.23.0.2是我本地Docker的虚拟ip地址,默认的配置文件在etc目录下,你可以在启动文件里自定义这个配置文件。

Name: admin-apiHost: 0.0.0.0Port: 2080Log:  ServiceName: admin-api  KeepDays: 7  Stat: falseDramaRpcConf:  Etcd:    Hosts:      - 172.23.0.2:2379    key: cpdramaadmin.rpc

代码都是省略过的,只是起到说明的作用。

// 验证参数if req.DramaId <= 0 {return nil, xerr.NewErrCode(xerr.INVALID_ARGUMENT)}dramaInfoResp, err := l.svcCtx.DramaRpcClient.DramaInfo(l.ctx, &dramaclient.DramaInfoReq{Id: int64(req.DramaId),})if err != nil {return nil, xerr.NewErrCode(xerr.UNKNOWN)}//遍历数据var dramaInfo types.Info_ = copier.Copy(&dramaInfo, dramaInfoResp.Drama)//调用RpcProducer, err := l.svcCtx.DramaRpcClient.ProducerDict(l.ctx, &dramaclient.Req{})var typesProducerLists []types.Producerif len(Producer.List) > 0 {for _, ProducerList := range Producer.List {var typeProducer types.Producer_ = copier.Copy(&typeProducer, ProducerList)typesProducerLists = append(typesProducerLists, typeProducer)}}//返回实际需要的数据return &types.DramaInfoResp{DramaInfo:    dramaInfo,Process:      globalkey.Process,ProducerList: typesProducerLists,}, nil

Rpc

1.生成rpc服务项目的命令

goctl rpc protoc drama.proto --go_out=../ --go-grpc_out=../--zrpc_out=../ --style=goZero 

2.rpc配置文件

172.19.0.4是我本地Docker里的虚拟Ip地址,Redis集群cluster,如果是单点就配置node,名字叫什么都可以,再svc目录里做映射就可以。

Name: cpdramaadmin.rpcListenOn: 0.0.0.0:3080Mode: devEtcd:  Hosts:    - 172.23.0.2:2379  Key: cpdramaadmin.rpcLog:  ServiceName: drama-rpc  KeepDays: 7  Stat: falseDB:  DataSource: root:rootroot@tcp(127.0.0.1:3306)/cp_audio?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghaiSqlCache:  - Host: 172.19.0.4:6379    Pass:    Type: cluster

用一个小的list做Demo,Rpc层主要做的就是组合数据,外部的调用通过Api网关,再进入Rpc调用。

whereBuilder := l.svcCtx.DramaModel.RowBuilder()var ids string = in.Idslist, err := l.svcCtx.DramaModel.FindListByIds(l.ctx, whereBuilder, ids)if err != nil && err != producer.ErrNotFound {return nil, errors.New("UNKNOWN")}var resp []*drama.DramaShortif len(list) > 0 {for _, dramaItem := range list {var pbDramaCommonInfo drama.DramaShort_ = copier.Copy(&pbDramaCommonInfo, dramaItem)resp = append(resp, &pbDramaCommonInfo)}}return &drama.DramaShortListResp{List: resp,}, nil

最后

使用go-zero开发微服务的整体感受还是很高效的,但是有一点上其实需要我们做更多的反思,我们实际的业务体量到底需不需要搞微服务?Rpc搞起来很多对应的开发测试成本也相应加码,这是一个很值得思考的问题。

之前我使用PHP语言开发,我感觉PHP(Swoole)可以搞定绝大多数场景的开发和服务,而且开发高效,技术人的出路就是设计一个最适合业务发展的技术架构方案,产品赚钱,才是王道。

标签:

微服务 - Go语言从单体服务到微服务(代码说明篇)_环球时快讯

2023-04-10

4月12日,国际著名脊柱微创专家周跃教授将在郑州会诊手术_焦点快报

2023-04-10

微资讯!防雷器和电涌保护器的区别

2023-04-10

世界今头条!民和股份:3月销售收入1.35亿元,同比变动575.72%

2023-04-10

快看点丨拒绝“划船刺客” 杭州西湖涉事船工被取消从业资格

2023-04-10

【世界热闻】sgs认证是什么样子的_sgs认证是什么

2023-04-10

环球微资讯!香港餐饮业协会:复活节假期本地餐饮业生意淡静 整体生意额料将下跌约20%

2023-04-10

浙江子坤宁波鄞州住宅项目规划建9幢住宅 毛坯均价不高于2.61万元/平米-新要闻

2023-04-10

中汽协:1-2月国内汽车整车出口同比保持高速增长

2023-04-10

天天要闻:67.220.90.13(67.220.90.13)

2023-04-10

智飞生物:4月7日融资买入7879.95万元,融资融券余额19.37亿元 每日动态

2023-04-10

农村义务教育本科以上学历专任教师达76.01%(新数据 新看点) 教师结构不断优化 教育质量稳步提高|每日热议

2023-04-10

勇士狂轰157分创5神迹:NBA单节最高+创联盟本赛季中最大赢球分差 全球今热点

2023-04-10

【全球速看料】Skip:詹姆斯仍能以高水准去得分 但没法终结比赛 别说他是GOAT

2023-04-10

萨巴蒂尼谈尤文财务造假案:为什么总是尤文?显然是有原因的-视点

2023-04-10

TVB知名男星拍吻戏被曝遭嫌弃,受高层力捧,因太油腻观众缘不佳

2023-04-09

多项颠覆性创新加持,比亚迪海豹获央视中国汽车风云盛典最高奖

2023-04-09

股票ETF交易规则及费用是什么 是这样规定的|每日资讯

2023-04-09

环球热头条丨如何合理自学备考中级会计

2023-04-09

全球投资策略:2050年实现净零排放的途径(附下载)-天天最资讯

2023-04-09

叶子在我的天堂鸟上卷曲_适合闺蜜送的生日礼物送什么-世界报道

2023-04-09

全新JeepWrangler功能可帮助驾驶员找到完美的越野目的地_当前报道

2023-04-09

10.3英寸的大屏阅读器,文石BOOK Note就很奶思!

2023-04-09

广西民族大学专业有哪些_广西民族大学专业|全球报资讯

2023-04-09

宋传承

2023-04-09

湖北中考满分作文:和谐之歌_中考满分作文800字 山东潍坊中

2023-04-08

环球热文:橘核汤

2023-04-08

中甲更精彩?中超20周年独缺广州队,3名留洋球员让八冠王更正统

2023-04-08

大兴安岭地区中级人民法院:创建“无讼社区” 推动诉源治理-环球视点

2023-04-08

行业热点:极萌Jmoon官宣首位品牌全球代言人周冬雨

2023-04-08

Copyright ©  2015-2022 华南频道网版权所有  备案号:粤ICP备18025786号-52   联系邮箱: 954 29 18 82 @qq.com