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

news2024/11/26 13:43:44

开始前必读:​​基于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://www.coloradmin.cn/o/867608.html

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

相关文章

hbase 报错 Master passed us a different hostname to use; was=

原因 wsl2的 /etc/hosts 配置的不兼容,我这里是ubuntu22 修改为 127.0.0.1 ubuntu22 即可

Blazor 调试控制台

文章目录 设置 设置 Blazor项目启动之后,有好几种项目设置,我其实想要这一种控制台 直接Console.log就行了 public void LoginBtn(){Console.WriteLine("登录");//navigationManager.NavigateTo("/index");}

STM32 LL库开发

一、STM32开发方式 标准库开发:Standard Peripheral Libraries,STDHAL库开发:Hardware Abstraction Layer,硬件抽象层LL库开发:Low-layer,底层库 二、HAL库与LL库开发对比 ST在推行HAL库的时候,…

手机怎样换ip地址 更改手机IP地址有哪些方式

ip地址怎么改:使用深度ip转换器 在互联网时代,IP地址扮演着网络世界中的独特标识符。它是我们在上网时必不可少的元素,负责为设备提供独立的身份,并将信息传输到正确的目的地。然而,有时我们需要改变IP地址&#xff0c…

婚恋交友h5多端小程序开源版开发

婚恋交友h5多端小程序开源版开发 以下是婚恋交友H5多端小程序的功能列表: 用户注册和登录:用户可以通过手机号码或第三方账号注册和登录。个人信息填写:用户可以填写个人基本信息,包括姓名、性别、年龄、身高、体重、学历、职业等…

第11集丨Vue 江湖 —— 过滤器(filter)

目录 一、过滤器1.1 局部过滤器1.2 全局过滤器1.3 过滤器的串联1.4 案例 二、BootCDN2.1 在BootCDN下载dayjs2.2 dayjs官方文档 一、过滤器 过滤器: 定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。语法: a. 注册过…

阿里巴巴面试题---考察对底层源代码的熟悉程度

题目如图所示: 很多人可能会觉得两个输出都会是false,因为我们都会觉得""比较的是引用类型的地址,虽然放入的值都一样但是重新创造了新对象,地址不一样,所以结果都是false. 然而,当我们运行程序会发现结果都是false. 下面,我们来分析为什么是这样的结果. 我们知道…

nodejs+vue+elementui健身俱乐部网站rix1z

为设计一个安全便捷,并且使用户更好获取本健身俱乐部管理信息,本文主要有安全、简洁为理念,实现用户快捷寻找健身课程、健身器材、会员卡信息、新闻公告等信息,从而解决健身俱乐部管理信息复杂难辨的问题。该系统以vue架构技术为基…

Linux 目录和文件常见操作

就常见的命令: pwd pwd 显示当前的目录 目录迁移 我以如下的目录大致结构做一个简单的例子 cd 迁移到指定的路径,可以指定相对路径和绝对路径,默认相对 .指向当前路径,…/ 指向上一级的目录。 ls 列出文件及其目录 命令选…

取个对象值导致系统崩溃

取个对象值导致系统崩溃 前言 想必各位小伙经常在项目中遇到一些错误,取对象值的时候,经常报错,又或者某些项目突然就挂经常都是出现在一些对象取值上面,然后就被领导一顿训斥 报错分析 例如: 下面这个报错大家想必不会陌生&am…

华尔街之狼

(1) 我最近在重看一本书《物理学家走进华尔街》,顺便我还又重看了一遍《华尔街之狼》。 华尔街之狼,我最感兴趣三点: 垃圾产品:退市的垃圾股粉单 垃圾顾客:没有钱,但想发财的平民。就…

掌握Python的X篇_28_python包管理工具pip命令

本篇将会介绍在实际使用python中最能节省效率的内容,利用第三方库拿来就用。 文章目录 1. pip命令是什么2. pip相关操作2.1 list2.2 install2.3 uninstall2.4 导出和导入2.4.1 freeze命令2.4.2 “-r” 3. 国内镜像4. Python Packges Index网站 1. pip命令是什么 p…

mysql安装配置教程

mysql下载 mysql官网 mysql英文官网下载 mysql安装 解压安装包,如下效果 2.配置初始化文件my.ini 在根目录下创建一个txt文件,名字叫my,文件后缀为ini 之后复制下面这个代码放在文件下 (新解压的文件没有my.ini文件,需自行创建…

QT界面的布局

QT界面的布局 qt 下的布局: 1.水平布局2.垂直布局3格布局 图片记得设置大小后在进行布局 文字居中

c++11-14-17_内存管理(RAII)_多线程

文章目录 前言:什么是RAII?指针/智能指针:使用智能指针管理内存资源:unique_ptr的使用:自定义删除器: shared_ptr的使用:shared_ptr指向同一个对象的不同成员:自定义删除函数&#x…

时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)

时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测) 目录 时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)效果一览基本描述模型结构程序设计参考资料效果一览

英雄联盟LOL无法登录,登录后客户端转圈,客户端无法与登陆队列进行通讯,平台也许在维护

问题描述: 1、英雄联盟客户端登录后转圈,随后提示客户端无法与登陆队列进行通讯,平台也许在维护。 2、多试几次或许能登录,但打完该局游戏后客户端闪退,随后再也无法登录。 无效的解决方案:建议不要尝试…

江湖游历:Mysql操作内功、面向对象心法兼修秘籍

文章目录 前言一 PyMysql入门二 综合案例2.1 案例需求2.2 DDL定义2.3 实现步骤2.4 参考代码2.4.1 封装数据对象2.4.2 读取文件数据对象2.4.3 连接并写入数据库对象 2.5 1045错误解决 三 今日作业3.1 实现思路3.2 参考代码3.2.1 对象类的封装3.2.2 操作代码 3.3 出现的错误3.3.1…

java+springboot+mysql智能社区管理系统

项目介绍: 使用javaspringbootmysql开发的社区住户综合管理系统,系统包含超级管理员、管理员、住户角色,功能如下: 超级管理员:管理员管理;住户管理;房屋管理(楼栋、房屋&#xff…

如何使用Markdown编辑器?详细做法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…