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

        花了点时间先把程序代码完全写完了,加了这个章节。因为后续章节是连续的,没有一个总纲同学们难免看的云里雾里的。本章先描述下完整的源码如何运行以及工程的结构。此专题大概由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.rhkb.cn/news/84468.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Metamask登录方式集成

Metamask登录 https://www.toptal.com/ethereum/one-click-login-flows-a-metamask-tutorial#how-the-login-flow-works 参考: https://zh.socialgekon.com/one-click-login-with-blockchain 后端需要在用户表中增加address和nonce字段。兼容其他登录方式&#xff0…

【Maven】依赖范围、依赖传递、依赖排除、依赖原则、依赖继承

【Maven】依赖范围、依赖传递、依赖排除、依赖原则、依赖继承 依赖范围 依赖传递 依赖排除 依赖原则 依赖继承 依赖范围 在Maven中,依赖范围(Dependency Scope)用于控制依赖项在编译、测试和运行时的可见性和可用性。通过指定适当的依赖…

Pycharm 双击启动失败?

事故 双击 Pycharm 后,出现加载工程,我不想加载这个工程,就点击了弹出的 cancle 取消按钮。然后再到桌面双击 Pycharm 却发现无法启动了。哪怕以管理员权限运行也没用,就是不出界面。 原因未知 CtrlshiftESC 打开后台&#xff…

恒盛策略:沪指冲高回落跌0.26%,酿酒、汽车等板块走弱,燃气股拉升

10日早盘,两市股指盘中冲高回落,半日成交约4200亿元,北向资金净卖出超20亿元。 到午间收盘,沪指跌0.26%报3235.9点,深成指跌0.54%,创业板指跌0.28%;两市算计成交4202亿元,北向资金净…

plt绘制实测值与预测值的散点图

# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from matplotlib.pyplot import MultipleLocator""" 输出观测值和模型预测值之间的拟合曲线,即拟合模型 决定系数R2,有拟合曲线公式,有1:1线 ""&…

hcip的BGP实验

题目 拓扑图 思路: 1、给各个设备配置IP地址及环回接口 2、配置R2、R3、R4,三个设备的OSPF环境 3、将R1、R2、R3、R4、R5建立BGP对等体关系 4、建临时,将源地址也修改为环回接口 5、宣告时,将BGP路由传递给本地的邻居时修改下…

什么是DNS的缓存?

DNS 缓存是一个临时的数据库,存储在计算机或网络设备(如路由器)上,用于保存最近的 DNS 查询结果。这种缓存机制可以加速后续的相同查询,因为设备可以直接从缓存中提取先前的查询结果,而不需要再次到外部的 …

WordPress博客发布到公网可访问【 windows系统及linux系统操作】

文章目录 1. 免费注册并下载安装cpolar内网穿透1.1 windows系统1.2 linux系统 2. 将内网映射到公网3. 获取所映射的公网地址 要将自己搭建的个人WordPress博客网站发布到公网可访问,比较常规的做法是买服务器、域名,将其部署到服务器上,备案发…

【腾讯云 Cloud Studio 实战训练营】深度体验 | 使用腾讯云 Cloud Studio 快速构建 Vue + Vite 完成律师 H5 页面

【腾讯云 Cloud Studio 实战训练营】深度体验 | 使用腾讯云 Cloud Studio 快速构建 Vue Vite 完成律师 H5 页面 写在前面的话一、腾讯云 Cloud Studio 介绍1.1 Cloud Studio 应用场景1.2 Cloud Studio 开发优势 二、沉浸式体验开发快速构建 H5 页面2.1 注册与登录 Cloud Studi…

linux配置上网 linux adsl拨号上网设置

Linux里面配置ADSL上网是件很麻烦的事。但配置完成之后就能开机自动拨号上网,可谓十分的方便。支持的系统有Redhat,CentOS,SuSE,FreeBSD,Ubuntu等常见的Linux。 工具/原料 ADSL网络,电信,网通,移动等常见宽带。 Linux系统的安装光…

分析为何科研转化率低

最近这两天,[广西审计:高校1.31亿科研经费成果转化率为0] 话题引发热议。据报道,广西壮族自治区审计厅近日公布的《关于2022年度自治区本级预算执行和其他财政收支的审计工作报告》披露了广西在科教振兴资金审计方面 9 所高校开展科研的相关情况。报告发…

网络的管理

一、查看网卡信息 先在虚拟机里看有几个网卡 二、nmcli 1、网卡的物理接口名称 2、网卡的配置信息 三、nmtui 四、下载网站上的文件

[低端局][cx32L003] 移植U8G2

文章目录 一、简介(1)U8g2(2)U8x8 二、配置要求三、移植步骤(1)文件准备和添加(2)实现回调接口(I2C的读写函数)①软件I2C②硬件I2C (3)功能裁剪① u8g2_d_set…

【多维定向滤波器组和表面波】表面变换:用于高效表示多维 s 的多分辨率变换(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

mysql基础之触发器的简单使用

1.建立学生信息表 -- 触发器 -- 建立学生信息表 create table s1(id int unsigned auto_increment,name varchar(30),score tinyint unsigned,dept varchar(50),primary key(id) );2.建立学生补考信息表 -- 建立学生补考信息表 create table s2 like s1;3.建立触发器&#xf…

linux文件I/O之 close()、lseek()、read()、write() 函数用法

1. close() 函数 头文件和函数声明 #include <unistd.h> int close(int fd); 函数功能 关闭一个文件描述符 返回值 成功时返回 0。失败则返回 -1&#xff0c;并设置 errno 为相应的错误标志。 参数 fd&#xff1a;文件描述符 说明 像其它所有系统调用一样&…

二级python和二级c哪个简单,二级c语言和二级python

大家好&#xff0c;小编为大家解答二级c语言和二级office一起报可以吗的问题。很多人还不知道计算机二级c语言和python哪个好考&#xff0c;现在让我们一起来看看吧&#xff01; 介绍Python有很多库和使用Qt编写的接口,这自然创建c调用Python的需求。一路摸索,充满艰辛的添加头…

创建型模式-原型模式

文章目录 一、原型模式1. 概述2. 结构3. 实现4. 案例1.5 使用场景1.6 扩展&#xff08;深克隆&#xff09; 一、原型模式 1. 概述 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 2. 结构 原型模式包含如下角色&#xff1a; …

8月10日上课内容 Tomacat部署及优化

tomcat 开放源代码的web应用服务器。基于java代码开发的。 Tomcat介绍 tomcat就是处理动态请求和基于java代码的页面开发 可以在html当中写入java代码&#xff0c;tomcat可以解析html页面当中的java,执行动态请求&#xff0c;动态页面。缺点是机制有问题:不对tomcat进行优化&…

Hello,SpringBoot!

一、回顾什么是Spring Spring是一个开源框架&#xff0c;2003 年兴起的一个轻量级的Java 开发框架&#xff0c;作者&#xff1a;Rod Johnson Spring是为了解决企业级应用开发的复杂性而创建的&#xff0c;简化开发。 Spring是如何简化Java开发的 为了降低Java开发的复杂性…