基于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接口的辅助置换(前提是做好兼容性,但也要谨慎使用)


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AcWing算法提高课-4.2.3一个简单的整数问题2

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 给定一个长度为 N N N 的数列 A A A&#xff0c;以及 M M M 条指令&#xff0c;每条指令可能是以下两种之一&#xff1a; C l r…

嵌入式Linux下LVGL的移植与配置

一.sdk源码下载路径 1.官方源码下载路径如下: ​​​​​​ https://github.com/lvgl/lvgl git下载方式 git clone https://github.com/lvgl/lvgl.git 2.个人移植好的源码8.2版本下载路径: 链接&#xff1a;https://pan.baidu.com/s/1jyqIennsQpv-RB4RyKvZyg?pwdc68e 提取…

Spring-Cloud-Loadblancer详细分析_2

LoadBalancerClients 终于分析到了此注解的作用&#xff0c;它是实现不同服务之间的配置隔离的关键 Configuration(proxyBeanMethods false) Retention(RetentionPolicy.RUNTIME) Target({ ElementType.TYPE }) Documented Import(LoadBalancerClientConfigurationRegistrar…

电脑开不了机如何解锁BitLocker硬盘锁

事情从这里说起&#xff0c;不想看直接跳过 早上闲着无聊&#xff0c;闲着没事干&#xff0c;将win11的用户名称改成了含有中文字符的用户名&#xff0c;然后恐怖的事情发生了&#xff0c;蓝屏了… 然后就是蓝屏收集错误信息&#xff0c;重启&#xff0c;蓝屏收集错误信息&…

基于深度学习的3D城市模型增强【Mask R-CNN】

在这篇文章中&#xff0c;我们描述了一个为阿姆斯特丹 3D 城市模型自动添加门窗的系统&#xff08;可以在这里访问&#xff09;。 计算机视觉用于从城市全景图像中提取有关门窗位置的信息。 由于这种类型的街道级图像广泛可用&#xff0c;因此该方法可用于较大的地理区域。 推荐…

如何把图片转成gif?一分钟学会在线一键生成gif

平时我们在聊天的时候&#xff0c;经常会发送一下有趣的表情包&#xff0c;这些表情包是怎么做出来的呢&#xff1f;其实可以使用在线gif生成的方法&#xff0c;下面就来给大家演示一下图片制作gif&#xff08;https://www.gif.cn&#xff09;的具体步骤&#xff0c;一起来看看…

Flink学习记录

可以快速搭建一个Flink编写程序 mvn archetype:generate \-DarchetypeGroupIdorg.apache.flink \-DarchetypeArtifactIdflink-quickstart-java \-DarchetypeVersion1.17.1 \-DgroupIdcom.zxx.langhuan \-DartifactIdlanghuan-flink \-Dversion1.0.0-SNAPSHOT \-Dpackagecom.zx…

《全生命周期眼健康管理》助力健康科学用眼

8月8日下午&#xff0c;烟台正大光明眼科医院眼健康管理中心张提主任受邀来到烟台市残疾人事务综合服务中心&#xff0c;为残联康复训练教师及相关工作人员进行了《全生命周期眼健康管理》讲座。 烟台正大光明眼科医院眼健康管理中心张提主任 “全生命周期眼健康”这一理念其宗…

流水线时序调度之规避冲突

1 写在前面的&#xff1a; 其实略微一个大点的机器&#xff0c;一个测试流程需要若干个步骤&#xff0c;都可以用流水线的思维去看待它&#xff1b; 我之前也没往流水线的角度去考虑&#xff0c;那有些机器的时序调度是不好理解的&#xff0c;甚至计算个通量都很麻烦&#xff…

15-1_Qt 5.9 C++开发指南_Qt多媒体模块概述

多媒体功能指的主要是计算机的音频和视频的输入、输出、显示和播放等功能&#xff0c;Qt 的多媒体模块为音频和视频播放、录音、摄像头拍照和录像等提供支持&#xff0c;甚至还提供数字收音机的支持。本章将介绍 Qt 多媒体模块的功能和使用。 文章目录 1. Qt 多媒体模块概述2. …

pgAdmin开发工具之ERD

pgAdmin 是一个免费的 PostgreSQL 管理与开发平台&#xff0c;这篇文章介绍了它的安装与使用。 今天我们要介绍的是它的一个开发功能&#xff1a;实体关系图&#xff08;ERD&#xff09;工具。 ERD 工具可以使用图形化的方式表示数据库中的表、字段以及表之间的关系。 pgAdmin…

vue svg画渐变色线条

基于业务需求需要&#xff0c;需要使用svg画渐变色弧线并且采用虚线。并且封装成组件。 一、path路径 path路径是svg中最强大的图形&#xff0c;可以绘制各种svg所有能画的图形。 路径中的线是由d属性来绘制&#xff0c;属性参数由各种命令组成&#xff0c;以下是它的基本命…

selenium.webdriver Python爬虫教程

文章目录 selenium安装和使用 selenium安装和使用 pip install selenium 下载对应的浏览器驱动 实例化浏览器 from selenium import webdriverbrowser webdriver.Chrome()元素定位 控制浏览器

Jmeter设置中文的两种方式,建议使用第二种

方案一 进入jmeter图像化界面&#xff0c;选择Options下的Choose Language&#xff0c;再选择Chinese(Simplified)。这个就是选择语言为简体中文&#xff08;缺陷&#xff1a;这个只是在本次使用时为中文&#xff0c;下次打开默认还是英文的&#xff09; 方案二&#xff08;…

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

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

Redis安装配置远程连接

1. yum 安装 redis&#xff1a; 直接使用命令&#xff0c;将 redis 安装到 linux 服务器中&#xff1a; yum -y install redis 2. 启动 redis&#xff1a; 在 xshell 里&#xff0c;可以使用下面命令&#xff0c;以后台方式启动 redis&#xff1a; [rootVM-8-17-centos /]…

Vue3+Ts+Vite项目全局配置Element-Plus主题色

概述 我找了很多博客&#xff0c;想全局配置Elmenet-Plus组件主题色&#xff0c;但都没有效果。所以有了这篇博客&#xff0c;希望能对你有所帮助&#xff01;&#xff01;&#xff01; 文章目录 概述一、先看效果二、创建全局颜色文件2.1 /src/styles 下新建 element-plus.sc…

gitlab-Runner搭建

root wget https://packages.gitlab.com/runner/gitlab-runner/packages/fedora/29/gitlab-runner-12.6.0-1.x86_64.rpm/download.rpm rpm -ivh download.rpm ---- 安装 rpm -Uvh download.rpm -----更新升级 然后运行&#xff1a; gitlab-runner register --url https://git…

虚拟展览馆有哪些优势?如何打造自己的虚拟展览馆

引言&#xff1a; 随着科技的不断创新与发展&#xff0c;虚拟展览馆作为一种全新的文化体验方式&#xff0c;正逐渐引起人们的关注。虚拟展览馆以其便捷、创新、可定制的特点&#xff0c;为参观者提供了前所未有的沉浸式体验。 一&#xff0e;什么是虚拟展览馆&#xff1f; 虚…

C语言学习系列-->看淡指针(1)

文章目录 一、概述二、指针变量和地址2.1 取地址操作符2.2 指针变量和解引用操作符2.2.1 指针变量2.2.2 拆解指针类型2.2.4 解引用操作符 2.3 指针变量的大小 三、指针变量的意义3.1 指针的解引用指针-整数 四、 const修饰指针五、指针运算5.1 指针- 整数5.2 指针-指针5.3 指针…