微服务从代码到k8s部署应有尽有系列(五、民宿服务)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 微服务从代码到k8s部署应有尽有系列(五、民宿服务)

我们用一个系列来讲解从需求到上线、从代码到k8s部署、从日志到监控等各个方面的微服务完整实践。

整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中间件,所用到的技术栈基本是go-zero项目组的自研组件,基本是go-zero全家桶了。

实战项目地址:https://github.com/Mikaelemmmm/go-zero-looklook

1、民宿服务业务架构图

2、依赖关系

travel-api(民宿api) 依赖 travel-rpc(民宿rpc)、usercenter-rpc(用户中心rpc)

usercenter-rpc(用户中心rpc)依赖 identity-rpc(授权中心rpc)

travel分为几个业务

  • homestay :民宿房源
// 民宿模块v1版本的接口
@server(
  prefix: travel/v1
  group: homestay
)
service travel {
  @doc "民宿列表(为你优选)"
  @handler homestayList
  post /homestay/homestayList (HomestayListReq) returns (HomestayListResp)
  
  @doc "房东所有民宿列表"
  @handler businessList
  post /homestay/businessList (BusinessListReq) returns (BusinessListResp)
  
  @doc "猜你喜欢民宿列表"
  @handler guessList
  post /homestay/guessList (GuessListReq) returns (GuessListResp)
  
  @doc "民宿详情"
  @handler homestayDetail
  post /homestay/homestayDetail (HomestayDetailReq) returns (HomestayDetailResp)
}
  • homestayBusiness :民宿店家
// 店铺模块v1版本的接口
@server(
  prefix: travel/v1
  group: homestayBussiness
)
service travel {
  @doc "最佳房东"
  @handler goodBoss
  post /homestayBussiness/goodBoss (GoodBossReq) returns (GoodBossResp)
  
  @doc "店铺列表"
  @handler homestayBussinessList
  post /homestayBussiness/homestayBussinessList (HomestayBussinessListReq) returns (HomestayBussinessListResp)
  
  @doc "房东信息"
  @handler homestayBussinessDetail
  post /homestayBussiness/homestayBussinessDetail (HomestayBussinessDetailReq) returns (HomestayBussinessDetailResp)
}
  • homestayComment :民宿评论
// 民宿评论模块v1版本的接口
@server(
  prefix: travel/v1
  group: homestayComment
)
service travel {
  @doc "民宿评论列表"
  @handler commentList
  post /homestayComment/commentList (CommentListReq) returns (CommentListResp)
}

3、举例:民宿列表(为你优选)

1、api服务

1、写api接口文件

app/travel/cmd/api/desc/homestay/homestay.api

type (
  HomestayListReq {
    LastId   int64  `json:"lastId"`
    PageSize int64  `json:"pageSize"`
    RowType  string `json:"rowType"` //preferredHomestay:优选民宿
  }
  HomestayListResp {
    List []Homestay `json:"list"`
  }
)

app/travel/cmd/api/desc/travel.api

import (
  "homestay/homestay.api"
  ....
)
// 民宿模块v1版本的接口
@server(
  prefix: travel/v1
  group: homestay
)
service travel {
  @doc "民宿列表(为你优选)"
  @handler homestayList
  post /homestay/homestayList (HomestayListReq) returns (HomestayListResp)
  ......
}

2、goctl生成api代码

1)命令行进入app/travel/cmd/api/desc目录下。

2)去项目目录下deploy/script/gencode/gen.sh中,复制如下一条命令,在命令行中执行(命令行要切换到app/travel/cmd目录)

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

3、打开app/travel/cmd/api/internal/logic/homestay/homestayListLogic.go

因为我们的推荐是在后台配置的,所以我们创建了一个活动表(这里你也可以选择配置到redis中),总之我们就是先从活动表中拿到配置的推荐民宿id,然后再通过id去获取对应民宿信息列表。

2【小技巧】 mapreduce

这里可以看到,我拿到了id集合之后,不是普通的foreach一个个获取,而是使用了go-zero为我们封装好了的mapreduce获取数据,这样就可以并发去获取数据,而不是要去取一个完成之后再取下一个,时间上大大缩短了,这里只是想给搭建展示这样一个功能,有的同学非要较真,可以传递一个id slice或者id arr到rpc,然后在rpc中在去并发获取每个,这样也没什么不好,我这里只是给大家展示这个功能

3、rpc服务

定义protobuf文件

app/travel/cmd/rpc/pb/travel.proto

// model
message Homestay {
    int64   id = 1;
    string  title = 2;
    string  subTitle = 3;
    string  banner = 4;
    string  info = 5;
    int64   peopleNum = 6;            // 容纳人的数量
    int64   homestayBusinessId = 7;   // 店铺id
    int64   userId = 8;               // 房东id
    int64   rowState = 9;             // 0:下架 1:上架
    int64   rowType = 10;             // 售卖类型0:按房间出售 1:按人次出售
    string  foodInfo = 11;            // 餐食标准
    int64   foodPrice = 12;           // 餐食价格(分)
    int64   homestayPrice = 13;       // 民宿价格(分)
    int64   marketHomestayPrice = 14; // 民宿市场价格(分)
}
// req 、resp
message HomestayDetailReq {
  int64   id = 1;
}
message HomestayDetailResp {
  Homestay homestay = 1;
}
// service
service travel {
    // 民宿详情
    rpc homestayDetail(HomestayDetailReq) returns(HomestayDetailResp);
}
  • 使用goctl生成代码,这里不需要自己手动敲
    1)命令行进入app/travel/cmd/rpc/pb目录下。
    2)去项目目录下deploy/script/gencode/gen.sh中,复制如下两条命令,在命令行中执行(命令行要切换到app/travel/cmd目录)
$ goctl rpc protoc *.proto --go_out=../ --go-grpc_out=../  --zrpc_out=../
$ sed -i "" 's/,omitempty//g' *.pb.go
  • 打开app/travel/cmd/rpc/internal/logic/homestayDetailLogic.go写逻辑代码
    这里没什么逻辑,查询Findone,然后返回给api,因为api那边是通过id传递过来的,然后可以看到我们这边又一次使用了前一章提到的gorm作者提供的另外一款神器copier,上一节是在api中使用,将rpc的proto文件的数据copy到api文件 , 这里可以看到,我们把model返回的数据copy给proto的数据同样可以用,怎么样是不是很方便。

4、【小技巧】 model cache、singleflight

在这里为什么我们不去findlist,是因为我们在findone方法中有缓存,我们一个个根据id查询数据时候,只有第一次会命中db,其他时间基本都是命中的redis cache,这样不仅速度快,就算流量激增的时候,也不会全部打到db上,而是都在redis上,这样会大大提高我们系统的访问速度以及db支撑能力。

一般我们自己维护db cache会写的零零散散,但是go-zero使用了配套内置工具goctl生成的model,自带sqlc+sqlx实现的代码,实现了自动缓存管理,我们根本不需要去管理缓存,只需要用sqlx写 sql数据,sqlc会自动帮我们管理缓存,并且是通过singleflight ,也就是说即使缓存在某个时间失效,在失效那一刻同时有大量并发请求进来时,go-zero在查询db时候也只会放行一个线程进来,其他线程是在等待,当这个线程从数据库拿数据回来之后将该数据缓存到redis同时所有之前等待线程共享此数据返回,后续在进来的线程查相同数据时,就只会进入到redis中而不会进入到db。

这样rpc拿到所有数据之后,就可以返回给前端显示了。

4、小结

其他的几个服务没有业务什么逻辑性的这里就不再一一说明,看api文档基本都知道是什么了,根据上面例子代码自行查看即可,后面有牵扯业务复杂的地方会逐一说明

项目地址

https://github.com/zeromicro/go-zero

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
15天前
|
Kubernetes Java 调度
无需接入执行器,0 代码改造实现微服务任务调度
本文提出了一种基于云原生的任务调度新方案,不需要依赖SDK,不依赖语言,实现定时调度和分布式跑批。
107 14
|
19天前
|
Kubernetes 调度 微服务
无需接入执行器,0代码改造实现微服务任务调度
本文提出了一种基于云原生的任务调度新方案,不需要依赖SDK,不依赖语言,实现定时调度和分布式跑批
94 1
|
2月前
|
jenkins Java 持续交付
使用 Jenkins 和 Spring Cloud 自动化微服务部署
随着单体应用逐渐被微服务架构取代,企业对快速发布、可扩展性和高可用性的需求日益增长。Jenkins 作为领先的持续集成与部署工具,结合 Spring Cloud 提供的云原生解决方案,能够有效简化微服务的开发、测试与部署流程。本文介绍了如何通过 Jenkins 实现微服务的自动化构建与部署,并结合 Spring Cloud 的配置管理、服务发现等功能,打造高效、稳定的微服务交付流程。
302 0
使用 Jenkins 和 Spring Cloud 自动化微服务部署
|
8月前
|
存储 Kubernetes 开发工具
使用ArgoCD管理Kubernetes部署指南
ArgoCD 是一款基于 Kubernetes 的声明式 GitOps 持续交付工具,通过自动同步 Git 存储库中的配置与 Kubernetes 集群状态,确保一致性与可靠性。它支持实时同步、声明式设置、自动修复和丰富的用户界面,极大简化了复杂应用的部署管理。结合 Helm Charts,ArgoCD 提供模块化、可重用的部署流程,显著减少人工开销和配置错误。对于云原生企业,ArgoCD 能优化部署策略,提升效率与安全性,是实现自动化与一致性的理想选择。
435 0
|
4月前
|
存储 监控 Shell
SkyWalking微服务监控部署与优化全攻略
综上所述,虽然SkyWalking的初始部署流程相对复杂,但通过一步步的准备和配置,可以充分发挥其作为可观测平台的强大功能,实现对微服务架构的高效监控和治理。尽管未亲临,心已向往。将一件事做到极致,便是天分的展现。
|
7月前
|
存储 Kubernetes 异构计算
Qwen3 大模型在阿里云容器服务上的极简部署教程
通义千问 Qwen3 是 Qwen 系列最新推出的首个混合推理模型,其在代码、数学、通用能力等基准测试中,与 DeepSeek-R1、o1、o3-mini、Grok-3 和 Gemini-2.5-Pro 等顶级模型相比,表现出极具竞争力的结果。
|
6月前
|
人工智能 搜索推荐 前端开发
从代码到心灵对话:我的CodeBuddy升级体验之旅(个性化推荐微服务系统)
本文分享了使用CodeBuddy最新版本的深度体验,重点探讨了Craft智能体、MCP协议和DeepSeek V3三大功能。Craft实现从对话到代码的无缝转化,大幅提升开发效率;MCP协议打通全流程开发,促进团队协作;DeepSeek V3则将代码补全提升至新境界,显著减少Bug并优化跨语言开发。这些功能共同塑造了AI与程序员共生的未来模式,让编程更高效、自然。
608 15
|
8月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
733 33
|
8月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
413 19
|
8月前
|
存储 测试技术 对象存储
使用容器服务ACK快速部署QwQ-32B模型并实现推理智能路由
阿里云最新发布的QwQ-32B模型,通过强化学习大幅度提升了模型推理能力。QwQ-32B模型拥有320亿参数,其性能可以与DeepSeek-R1 671B媲美。

热门文章

最新文章

推荐镜像

更多