基于grpc从零开始搭建一个准生产分布式应用(1) - 开始准备

开始前必读:​​基于grpc从零开始搭建一个准生产分布式应用(0) - quickStart​​ 

本来笔者并不想开设这个系列,因为工作量比较大,另外此专题的技术点也偏简单。最近复盘了下最近的工作,发现一个问题就是各个互联网大厂一般都会有专门的部门开发专用的框架,所有发布出来的文章也是基于这些内部框架来写的,可能导致未进过大厂的同学很难更深入的理解也没法实际应用起来。

另外很容易形成一个误区,就是开源的框架不经过二次封装是否可直接用到生产环境。这里笔者想说如果换成8、9年前答案是不可以,但现在随着三方框架的完善完全可以不经过二开直接应用到生产环境中。笔者最近就在实际工作中采用了全开源的框架构建了一个生产系统,运行过程中也还算OK,所以整理一下过程写成这个专题。笔者以一个DEMO为主线,然后围绕实现过程展开各分层技术的必要知识点。

之所以系列标题叫“准生产应用”原因是,一个生产环境除了应用代码外还包含比如集群和监控等内容,不过也没多大问题因为集群和监控一般都可以后期配置并不影响应用代码。此系列主要还是面向后端开发同学。

一、准备工作

笔者的开发环境如下,建议读者也最好在开发前提前准备好,也可以按此专题的顺序来安装,在进入下一小节时建设读者必须安装好以下标为红色的软件

  • 开发环境:Macos 11.6.5、Intellij IDEA 2022.1.2、JDK 1.8.0_144、Maven 3、Git、
  • 测试环境:Ubuntu
  • 部署方式:Docker
  • 中间件:MySQL8.0.23、Redis6.2.6、RocketMq

二、DEMO介绍

在一些应用中一般都会把重要的操作记录在数据表以供后续审记,比如付款记录或是登陆记录等。这里笔者选了一个通用的日志记录功能的demo,后续会逐步实现这个需求。PS:这里虽然说是demo,但是实现后的代码是可以直接应用到生产环境中的。只是由于一些涉密的原因,没法把一些复杂的真实需求摆到网上。

此需求比较简单:提供一个通用的操作日志记录和列表查询功能,并担任GRPC和HTTP两种API接口。分解后需求如下:

需求名称

接口类型

功能描述

增加操作记录

HTTP、GRPC

添加一条操作记录

列表查询操作记录

HTTP、GRPC

根据操作用户、业务类型等条件查询操作记录集合

数据库表结构:

CREATE TABLE `t_sys_record`  (`id` bigint(20) NOT NULL,`biz_id` bigint(20) NULL DEFAULT NULL COMMENT '业务ID',`user_id` bigint(20) NULL DEFAULT NULL COMMENT '操作用户ID',`track_uid` varchar(255) NULL DEFAULT NULL COMMENT '链路ID',`code` int(11) NULL DEFAULT NULL COMMENT '操作代码',`custom_code` int(11) NULL DEFAULT NULL COMMENT '操作2级代码',`state` int(11) NULL DEFAULT NULL COMMENT '记录状态:1可查询,0不可查询',`ctime` datetime NULL DEFAULT NULL,`utime` datetime NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

三、应用整体架构设计

3.1、整体设计

这是整体的架构设计图,后续我们会一点点拆解这个架构来一步步实现第二章中的需求,最终实现整个架构实可以实现部署,并达到一个准生产的水平,也可以说接下来的文章都是围绕下面这张图展形的。

这里只是简单介绍一下,以便有个全局的认知,方便后续章节的学习。

3.1.1、分层详解

整体架构分为5层,我们只会服务层(4层),不会实现client端。详细的层次解释如下:

  • APP层:指供终端用户使用的客户端程序,可以是web也可以是app,anywhere这不是本专题的内容所以不再细说了;
  • OpenApi层:提供给APP端使用的API接口,在本专题中会实现Http接口,网关是介于APP和OpenApi中的一个中间组件,一般不是SAAS这样的平台并不需要网关层。本专题中并不会实现一个网关,上图中只是为了表述完整指出了网关层的位置;
  • Server-API:其实也可认为它是Open Api的一种实现方式,可以供APP层直接调用。因为规范的原因在笔者的部门最终决定并不对APP暴露,所以在架构上下沉了一层;
  • Server-Server:这没啥好说的,是Server-API的实现,内部分为两层Grpc和Server。可以把Grpc简单理解为门面。Server才是核心的实现;
  • Persistence:存储层,在本专题中只用了mysql存储;

3.1.2、涉及的三方库

  • google proto:一种跨语言的定义脚本语言;
  • spring boot:
  • spring mvc:
  • mybatisPlus:一个数据库持久框架;
  • mapStruct:Bean深拷贝框架;

3.2、层次调用

下面放出两张图,左图是笔者部门的规范用法,右图的调用方法也是被允许的也可以用于实际生产环境中。

3.2.1、调用链路分析

  • App-Http-Grpc-Server-Dao:适用于单机和小型应用,比较规范,强调了Http和Grpc的职责;
  • App-Http-Server-Dao:适用于单机和小型应用,会省略很多代码,适合http和grpc在同一应用中的设计,但同样也会带来后续拆分的问题;
  • App-SDK-Grpc-Server-Dao:适合单机应用,在分布式应用中不建议用这种设计;
  • App-Grpc-Server-Dao:适合大型分布式应用;

上面按适用场景拆分4条调用链路,这里总结说下在上述设计中:1、http就适用于大型应用的主要原因是性能比较慢,如果真要开放http接口不如直接用网关来代替。2、SDK这种交互方式只一点耦合改动的问题就非常建议如果没必要不要采用这种设计方式;但有一种弱SDK的方式是在序列化包提供一些工具类用来做API接口的辅助置换(前提是做好兼容性,但也要谨慎使用)


下一节会描述下工程的构建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1382608.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序开发(十)小程序支付-查询退款

应用场景 提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。 接口说明 这里退款还是根据商户订单号-out_trade_no去微信那边查询 代码实现 /** 根…

微信中的这个功能尽早设置,即使转错账也能及时收回!

生活在快节奏的我们,是离不开互联网的,出门在外,旅行,购物,点餐等等都离不开手机中,手机中最不可能缺少的两款APP就是微信和支付宝,不管是微信,还是支付宝这两款软件在大家心目中是不…

Java - 微信支付

首先贴出官方文档,关于介绍,场景,参数说明,可以直接看文档:https://pay.weixin.qq.com/wiki/doc/api/index.html 一. APP支付 官方文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter9_1…

JAVA微信退款(JSAPI支付)

上一章咱们介绍了微信支付整个流程,这章就趁热打铁地整理下微信退款(JSAPI支付)相关的知识,为这几章的微信支付画上一个句号把。 前提:从微信公众号那边获取appid,mchid,paternerKey三个参数备…

实例:用C#.NET手把手教你做微信公众号开发(20)--使用微信支付线上收款:jsapi方式

在做线上、线下销售时,可以使用微信便捷支付,通过微信公众号收款有很多种收款方式,如下图: 今天我们来讲一下jsapi支付,场景就是在微信内打开某个页面,完成在线支付,同样一个网页,使…

基于时态差分法的强化学习:Sarsa和Q-learning

时态差分法(Temporal Difference, TD)是一类在强化学习中广泛应用的算法,用于学习价值函数或策略。Sarsa和Q-learning都是基于时态差分法的重要算法,用于解决马尔可夫决策过程(Markov Decision Process, MDP&#xff0…

微信小游戏直播在Android端的跨进程渲染推流实践

本文由微信开发团队工程师“virwu”分享。 1、引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳、欢乐斗地主等),在右上角菜单就可以看到发起直播的按钮一键成…

辞职信微信html,微信退款处理.html

微信退款处理 $axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; }; $axure.utils.getOtherPath function() { return resources/Other.html; }; $axure.utils.getReloadPath function() { return resources/reload.h…

php微信退款到银行卡,微信支付PHP开发教程七查询退款

重要:本文最后更新于2019-06-07 08:47:57,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗。 上一篇我们已经学会了如何使用微信支付的退款接口发起退款请求,并且能判断退款成功与否,为了安…

题解:ABC276E - Round Trip

题解:ABC276E - Round Trip 题目 链接:Atcoder。 链接:洛谷。 难度 算法难度:普及。 思维难度:提高。 调码难度:提高。 综合评价:困难。 算法 bfs。 思路 从起点周围四个点中任选两…

北京冬奥会 向世界展示了什么

01 北京冬奥会让全球的目光,再次聚焦到中国。大家深刻感知到了一个巨大的变化:从过去中国需要融入世界,需要走向全球化,到今天世界需要中国,中国做好了准备。从2008年北京奥运会,到2022年北京冬奥会&#…

我们该不该旗帜鲜明地反对李彦宏当选院士?

这几天, 中国工程院对外公布2019年 院士增选候选人,百度董事长兼 首席执行官 李彦宏位列其中。尽管,最终有望从531名候选人中脱颖而出的,可算凤毛麟角。但是,针对李彦宏的候选,还是有网友喊出了“旗帜鲜明地…

程序员为什么应该旗帜鲜明地反对“最佳实践”?

让第一个版本的系统混乱一点,或许是件好事。 作者 | 黄峰达,CSDN 博客专家 Phodal 责编 | 唐小引 头图 | 作者绘制并授权 CSDN 使用 出品 | CSDN(ID:CSDNnews) 最近,我在设计、开发、维护一个基于『文档代码…

旗帜鲜明地反对“码而优则仕”

点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复“大礼包”有惊喜礼包! 每日英文 Real strong men are not those without tears,but those running in tears. 真正的强者,不是没有眼泪的人,而是含着眼泪奔跑的人。 每日…

微软GitHub旗帜鲜明抵制996!

作者 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 自3月27日996.ICU话题诞生以来,已引发国内外持续不断地关注和热议。国内大佬忙着发声,主流浏览器忙着屏蔽项目的GitHub地址。 而马云几天前谈的“996成功论”,被图…

我的世界java什么村民卖地图_教程/村民交易大厅

此条目的(部分)内容需要翻译。 你可以帮助我们来翻译此条目,但请勿使用机器翻译。 这篇教程将教你如何建造一个村民交易大厅。 主条目:交易 村民交易大厅要求最大限度地增加易于达到的村民数量,也要求提供一个快速遗弃并替换不需要的村民的途径。 村民交易大厅中有三个部分:…

旗帜鲜明的反对基因编辑婴儿!

阅读本文大概需要 3.3 分钟。 昨天的新闻,相信大家都知道了,媒体报道称世界首例免疫艾滋病的基因编辑婴儿在中国诞生,这事引起大家激烈的讨论,后台很多人问我对这件事是什么看法,我不是生物医学领域内的科学家&#xf…

攻防世界web刷题

web新手区 view_sourcerobotsbackupcookiedisabled_buttonweak authsimple_phpget_postxff_refererwebshellcommand_execution view_source 打开源代码发现答案就在这里 robots 查看robots.txt文件 发现flag文件并打开 backup 网站存在备份文件,常见的备份文件…

程序员与你共观世界杯:Javascript 简易绘制世界杯旗帜(含足球元素)

引言:2022年是世界杯赛事年,世界杯是一项非常受全世界欢迎的大赛事,一到世界杯赛事期间,各大平台热搜就一直是世界杯相关的话题,在这期间,即使你不了解足球,也能耳濡目染,因为身边到…

初学RenderMonkey做一面旗帜飘动的效果

这几天在捣鼓一个游戏 骑马与砍杀 不知道有没有人玩过。官方出了个shader包,可以自定义shader,于是就开始学起来了,学了一点,简单的实现了一直想弄的动态世界。这期间一直在用RenderMonkey开发(貌似停止更新了,会不会有…