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

news2024/11/24 8:44:03

        花了点时间先把程序代码完全写完了,加了这个章节。因为后续章节是连续的,没有一个总纲同学们难免看的云里雾里的。本章先描述下完整的源码如何运行以及工程的结构。此专题大概由30章组成,真正的从0开始,框架是在原生产环境中抽取的,无坑无bug。


配套源码(可用于开发正式应用,需少量修改):​​github源码​​

配套的项目生成工具:​​github源码​​


一、准备工作

必装软件-开发:

  • Intellij IDEA (任意版本,笔者用的是2022.1.2版);
  • JDK 1.8.0_144;
  • Maven 3;
  • Git:建议安装;
  • MySQL:(任意版本,笔者用的是8.0.2);

必装软件-测试:

  • grpcui

二、如何学习

建议读者一步步实操一下,所有章节内容如下:

 

三、QuickStart

3.1、创建数据库

笔者源码中用的数据名为【badCase】,同学可以下载完源码后修改【base-grpc-framework-application】模块下的src/main/resources/application-dev.yml配置文件的下面约17行。

url: jdbc:mysql://127.0.0.1:3306/badCase?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai

3.2、启动工程

双击运行【base-grpc-framework-application】模块下的src/main/java/,配置jvm启动参数为dev

com.zd.baseframework.BaseFrameworkApplication.java

启动后控制台会输出下面的日志

已连接到目标 VM, 地址: ''127.0.0.1:52801',传输: '套接字''

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.2.RELEASE)

2022-06-15 21:20:48 CST [1] INFO com.alibaba.boot.nacos.config.util.NacosConfigPropertiesUtils buildNacosConfigProperties 47 - nacosConfigProperties : NacosConfigProperties{serverAddr='127.0.0.1:8848', contextPath='null', encode='null', endpoint='null', namespace='null', accessKey='null', secretKey='null', ramRoleName='null', autoRefresh=false, dataId='null', dataIds='null', group='DEFAULT_GROUP', type=null, maxRetry='null', configLongPollTimeout='null', configRetryTime='null', enableRemoteSyncConfig=false, extConfig=[], bootstrap=Bootstrap{enable=false, logEnable=false}}
2022-06-15 21:20:48 CST [1] INFO com.alibaba.boot.nacos.config.autoconfigure.NacosConfigApplicationContextInitializer initialize 75 - [Nacos Config Boot] : The preload configuration is not enabled
2022-06-15 21:20:48 CST [1] INFO org.springframework.boot.StartupInfoLogger logStarting 55 - Starting BaseFrameworkApplication on MacBook with PID 28944 (/Users/liudong/personCode/java/base-grpc-framework/base-grpc-framework-application/target/classes started by liudong in /Users/liudong/personCode/java/base-grpc-framework)
2022-06-15 21:20:48 CST [1] INFO org.springframework.boot.SpringApplication logStartupProfileInfo 655 - The following profiles are active: dev
2022-06-15 21:20:49 CST [1] INFO org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker postProcessAfterInitialization 330 - Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2022-06-15 21:20:49 CST [1] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer initialize 92 - Tomcat initialized with port(s): 8080 (http)
2022-06-15 21:20:49 CST [1] INFO org.apache.juli.logging.DirectJDKLog log 173 - Initializing ProtocolHandler ["http-nio-8080"]
2022-06-15 21:20:49 CST [1] INFO org.apache.juli.logging.DirectJDKLog log 173 - Starting service [Tomcat]
2022-06-15 21:20:49 CST [1] INFO org.apache.juli.logging.DirectJDKLog log 173 - Starting Servlet engine: [Apache Tomcat/9.0.29]
2022-06-15 21:20:50 CST [1] INFO org.apache.juli.logging.DirectJDKLog log 173 - Initializing Spring embedded WebApplicationContext
2022-06-15 21:20:50 CST [1] INFO net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration shadedNettyGrpcChannelFactory 152 - Detected grpc-netty-shaded: Creating ShadedNettyChannelFactory + InProcessChannelFactory
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
2022-06-15 21:20:50 CST [1] INFO com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure dataSource 56 - Init DruidDataSource
2022-06-15 21:20:50 CST [1] INFO com.alibaba.druid.pool.DruidDataSource init 994 - {dataSource-1} inited
Parsed mapper file: 'file [/Users/liudong/personCode/java/base-grpc-framework/base-grpc-framework-core/target/classes/mybatis/SystemLogMapper.xml]'
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.4.1 
2022-06-15 21:20:51 CST [1] INFO springfox.documentation.spring.web.PropertySourcedRequestMappingHandlerMapping initHandlerMethods 69 - Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2Controller#getDocumentation(String, HttpServletRequest)]
2022-06-15 21:20:51 CST [1] INFO org.springframework.scheduling.concurrent.ExecutorConfigurationSupport initialize 171 - Initializing ExecutorService 'applicationTaskExecutor'
2022-06-15 21:20:51 CST [1] INFO net.devh.boot.grpc.server.autoconfigure.GrpcServerFactoryAutoConfiguration shadedNettyGrpcServerFactory 74 - Detected grpc-netty-shaded: Creating ShadedNettyGrpcServerFactory
2022-06-15 21:20:51 CST [1] INFO net.devh.boot.grpc.server.autoconfigure.GrpcServerFactoryAutoConfiguration inProcessGrpcServerFactory 157 - 'grpc.server.in-process-name' is set: Creating InProcessGrpcServerFactory
2022-06-15 21:20:51 CST [1] INFO springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper start 160 - Context refreshed
2022-06-15 21:20:51 CST [1] INFO springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper start 163 - Found 1 custom documentation plugin(s)
2022-06-15 21:20:51 CST [1] INFO springfox.documentation.spring.web.scanners.ApiListingReferenceScanner scan 41 - Scanning for api listing references
2022-06-15 21:20:52 CST [1] INFO net.devh.boot.grpc.server.serverfactory.AbstractGrpcServerFactory configureServices 108 - Registered gRPC service: com.zd.baseframework.core.api.sysrecord.ISystemLogService, bean: systemLogServiceApiImpl, class: com.zd.baseframework.core.core.systemlog.api.impl.SystemLogServiceApiImpl
2022-06-15 21:20:52 CST [1] INFO net.devh.boot.grpc.server.serverfactory.AbstractGrpcServerFactory configureServices 108 - Registered gRPC service: grpc.health.v1.Health, bean: grpcHealthService, class: io.grpc.protobuf.services.HealthServiceImpl
2022-06-15 21:20:52 CST [1] INFO net.devh.boot.grpc.server.serverfactory.AbstractGrpcServerFactory configureServices 108 - Registered gRPC service: grpc.reflection.v1alpha.ServerReflection, bean: protoReflectionService, class: io.grpc.protobuf.services.ProtoReflectionService
2022-06-15 21:20:52 CST [1] INFO net.devh.boot.grpc.server.serverfactory.GrpcServerLifecycle createAndStartGrpcServer 116 - gRPC Server started, listening on address: *, port: 9898
2022-06-15 21:20:52 CST [1] INFO net.devh.boot.grpc.server.serverfactory.AbstractGrpcServerFactory configureServices 108 - Registered gRPC service: com.zd.baseframework.core.api.sysrecord.ISystemLogService, bean: systemLogServiceApiImpl, class: com.zd.baseframework.core.core.systemlog.api.impl.SystemLogServiceApiImpl
2022-06-15 21:20:52 CST [1] INFO net.devh.boot.grpc.server.serverfactory.AbstractGrpcServerFactory configureServices 108 - Registered gRPC service: grpc.health.v1.Health, bean: grpcHealthService, class: io.grpc.protobuf.services.HealthServiceImpl
2022-06-15 21:20:52 CST [1] INFO net.devh.boot.grpc.server.serverfactory.AbstractGrpcServerFactory configureServices 108 - Registered gRPC service: grpc.reflection.v1alpha.ServerReflection, bean: protoReflectionService, class: io.grpc.protobuf.services.ProtoReflectionService
2022-06-15 21:20:52 CST [1] INFO net.devh.boot.grpc.server.serverfactory.GrpcServerLifecycle createAndStartGrpcServer 116 - gRPC Server started, listening on address: in-process:native, port: -1
2022-06-15 21:20:52 CST [1] INFO org.apache.juli.logging.DirectJDKLog log 173 - Starting ProtocolHandler ["http-nio-8080"]
2022-06-15 21:20:52 CST [1] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer start 204 - Tomcat started on port(s): 8080 (http) with context path ''
2022-06-15 21:20:52 CST [1] INFO org.springframework.boot.StartupInfoLogger logStarted 61 - Started BaseFrameworkApplication in 3.871 seconds (JVM running for 4.743)

四、测试

4.1、测试http接口

在浏览器中输入:http://localhost:8080/swagger-ui.html ,会看到如下页面,后展开controller,进行测试即可:

   

因截图太大了,笔者把测试用例文字描述一下:

测试增加功能:

curl -X GET "http://localhost:8080/systemlog/v1/create_systemlog?biz_id=bizTest3&code=user&custom_code=userDel&user_id=10000" -H "accept: */*"
{
  "status": 0,
  "message": "请求成功",
  "data": null
}

测试查询功能:

curl -X POST "http://localhost:8080/systemlog/v1/list_systemlog" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"biz_id\": \"bizTest2\"}"
{
  "status": 0,
  "message": "请求成功",
  "data": [
    {
      "id": 1537061877920575500,
      "biz_id": "bizTest2",
      "user_id": 10000,
      "track_uid": "10000",
      "code": "user",
      "custom_code": "userDel",
      "state": 0,
      "utime": "2022-06-15 13:18"
    }
  ]
}

4.2、测试grpc接口

需先安装grpcui工具,然后在命令行输入:grpcui -plaintext 127.0.0.1:9898,会自动弹出浏览器窗口

测试增加功能:

测试查询功能:

五、完整工程结构

5.1、工程划分

  • pom.xml:项目主maven文件,主要定义公共的配置以及版本控制;
  • .gitignore:用git时忽略的提供文件配置;
  • base-grpc-framework-common:项目工具包;
  • base-grpc-framework-api:项目接口定义;
  • base-grpc-framework-core:接口业务实现;
  • base-grpc-framework-dao:数据库存储实现;
  • base-grpc-framework-application:项目启动包装应用;
  • base-grpc-framework-client:web客户端;

5.2、所有源码文件

这些源码在后续章节会依次展开。

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

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

相关文章

【目标检测系列】YOLOV2解读

为更好理解YOLOv2模型,请先移步,了解YOLOv1后才能更好的理解YOLOv2所做的改进。 前情回顾:【目标检测系列】YOLOV1解读_怀逸%的博客-CSDN博客 背景 通用的目标检测应该具备快速、准确且能过识别各种各样的目标的特点。自从引入神经网络以来&a…

at命令 执行一次指定定时任务

简介: at命令 可以设置在一个指定的时间执行一个指定任务,只能执行一次,使用前确认系统开启了atd Service 安装: [rootnode1 ~]# yum -y install at启动: [rootnode1 ~]# systemctl enable atd [rootnode1 ~]# sys…

百望云斩获“2023企业财税服务平台TOP15”奖项

企业服务业务越来越成为企业发展中不可或缺的一部分。 根据权威数据,企业服务的市场规模在过去五年内年均增长率超过15%。这一点,在投融资领域可能表现得更加迅速也更加明显—— 依据IT桔子、烯牛数据的调研:7月份,企服领域投融资…

SonarQube安装与Java、PHP代码质量分析扫描

文章目录 1、下载安装1.1、SonarQube下载1.2、SonarQube安装1.3、SonarQube中文汉化1.4、SonarScanner扫描器 2、扫描项目2.1、java代码扫描2.2、php代码扫描 1、下载安装 SonarQube负责存储代码数据、收集数据、分析代码和生成报告等。 1.1、SonarQube下载 下载地址&#x…

HTML+CSS+JavaScript:渲染电商站购物车页面

一、需求 根据下图渲染购物车页面 二、代码素材 以下是缺失JS部分的代码&#xff0c;感兴趣的小伙伴可以先自己试着写一写 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatib…

木马免杀(篇二)shellcode 学习

木马免杀&#xff08;篇二&#xff09;shellcode 学习 —— shellcode介绍 shellcode 是一段利用软件漏洞进行执行的机器码&#xff0c; 通常用汇编语言编写并被翻译为十六进制操作码&#xff0c;因常被攻击者用于获取系统的命令终端shell 接口&#xff0c;所以被称为 shellc…

NLP语言模型概览

语言模型结构分类 Encoder-Decoder&#xff08;Transformer&#xff09;: Encoder 部分是 Masked Multi-Head Self-Attention&#xff0c;Decoder 部分是 Casual Multi-Head Cross-Attention 和 Casual Multi-Head Self-Attention 兼具。比如T5&#xff0c;BART&#xff0c;MA…

HCIP STP(生成树)

目录 一、STP概述 二、生成树协议原理 三、802.1D生成树 四、STP的配置BPDU 1、配置BPDU的报文格式 2、配置BPDU的工作过程 3、TCN BPDU 4、TCN BPDU的工作过程 五、STP角色选举 1、根网桥选举 2、根端口选举 3、指定端口选举 4、非指定端口选举 六、STP的接口状…

免费思维导图软件有哪些?精选6款免费好用、功能强大的思维导图软件!

相信大家或多或少都听说过思维导图以及它的强大作用&#xff0c;它简单又高效&#xff0c;能够将散点链接成为相关联的、有逻辑的整体&#xff0c;更好地梳理和管理知识。不管你有没有真正体验过思维导图带来的神奇效果&#xff0c;相信你一定也在寻找一款免费好用的思维导图软…

找不到msvcp120dll,无法继续执行代码,怎么解决?

当msvcp120.dll文件丢失或找不到时&#xff0c;会导致无法运行使用C编写的程序。这可能是由于以下原因导致的&#xff1a; 1.删除或移动文件&#xff1a;如果你不小心删除了或移动了msvcp120.dll文件&#xff0c;你将无法找到它并加载它&#xff0c;从而导致程序无法正常运行。…

2023上半年京东奶粉行业品牌销售排行榜(京东数据分析平台)

近年来&#xff0c;受新生儿人口数量下降的影响&#xff0c;婴幼儿奶粉市场的需求量萎缩&#xff0c;市场由增量竞争转为存量竞争。根据鲸参谋电商数据分析平台的数据显示&#xff0c;今年上半年&#xff0c;京东婴幼儿奶粉市场的销量将近4400万&#xff0c;环比下降约19%&…

AtcoderABC224场

A - TiresA - Tires 题目大意 题目要求判断给定字符串S的末尾是以"er"还是"ist"结尾&#xff0c;并输出对应的结果。 思路分析 使用substr函数获取字符串S的末尾2个字符或3个字符。 判断获取到的子字符串是否等于"er"或"ist"&#…

赛事 | 第25届中国机器人及人工智能大赛全国决赛榜单发布

第25届中国机器人及人工智能大赛成功举办 2023年6月13日至14日&#xff0c;第二十五届中国机器人及人工智能大赛于海南科技职业大学成功举办。大赛由中国人工智能学会主办&#xff0c;共有来自清华大学、哈尔滨工业大学、中国科学技术大学、西安交通大学等500多所高校进入全国…

Vue2:路由

Vue2&#xff1a;路由 Date: May 28, 2023 Sum: vue-router基本使用、高级用法 单页面应用程序 概念&#xff1a;SPA【Single Page Application】是指所有的功能都在一个html页面上实现 案例&#xff1a; 单页应用网站&#xff1a; 网易云音乐 https://music.163.com/ 多页…

8.10 用redis实现缓存功能和Spring Cache

什么是缓存? 缓存(Cache), 就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。 通过Redis来缓存数据&#xff0c;减少数据库查询操作; 逻辑 每个分类的菜品保存一份缓存数据 数据库菜品数据有变更时清理缓存数据 如何将商品数据缓存起…

Spring AOP(AOP概念,组成成分,实现,原理)

目录 1. 什么是Spring AOP&#xff1f; 2. 为什么要用AOP&#xff1f; 3. AOP该怎么学习&#xff1f; 3.1 AOP的组成 &#xff08;1&#xff09;切面&#xff08;Aspect&#xff09; &#xff08;2&#xff09;连接点&#xff08;join point&#xff09; &#xff08;3&a…

Qt画波浪球(小费力)

画流动波浪 #ifndef WIDGET3_H #define WIDGET3_H#include <QWidget> #include <QtMath> class widget3 : public QWidget {Q_OBJECT public:explicit widget3(QWidget *parent nullptr);void set_value(int v){valuev;}int get_value(){return value;} protecte…

FineReport 使用汇总(不定期更新)

1&#xff0c;下载地址 免费下载FineReport - FineReport报表官网 这里注意 2&#xff0c;后台统计 sql 还是需要自己写 就会有数据 而直接查询表&#xff0c; 没有数据 不过&#xff0c;可能是我不会用。还需要再研究。

Java ThreadLocal是什么

文章目录 引子&#xff1a;SimpleDateFormat类ThreadLocal是什么ThreadLocal 的另一个用途**总结**ThreadLocal的两大用途ThreadLocal 的源代码ThreadLocalMapThreadLocalMap 的问题ThreadLocal的key为什么设置成弱引用&#xff1f;value为什么不是弱引用&#xff1f;Thread、T…

ubuntu 安装 nvidia 驱动

ubuntu 安装 nvidia 驱动 初环境与设备查询型号查询对应的驱动版本安装驱动验证驱动安装结果 本篇文章将介绍ubuntu 安装 nvidia 驱动 初 希望能写一些简单的教程和案例分享给需要的人 环境与设备 系统&#xff1a;ubuntu 设备&#xff1a;Nvidia GeForce RTX 4090 查询型…