基于grpc从零开始搭建一个准生产分布式应用(8) - 01 - 附:GRPC公共库源码

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

common包中的源码,因后续要用所以一次性全建好了。

一、common工程完整结构

二、引入依赖包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>base-grpc-framework-parent</artifactId><groupId>com.zd</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>base-grpc-framework-common</artifactId><dependencies><dependency><groupId>net.devh</groupId><artifactId>grpc-server-spring-boot-starter</artifactId><scope>compile</scope></dependency><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java-util</artifactId><scope>compile</scope></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><scope>compile</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><scope>compile</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>compile</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><scope>compile</scope></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><scope>compile</scope></dependency></dependencies></project>

三、源码-常量

package com.zd.baseframework.common.constants;/*** @Title: com.zd.baseframework.common.constants.ResponseConst* @Description 系统常量类,定义一些返回码等,这里不建议定义成(int, string)枚举,因为1个错误码可能对应多个描述字段,分开来定义更灵活,* 同时定义在一个类里面又达到了一种封装效果* @author liudong* @date 2022/6/15 8:48 PM*/
public interface ResponseConst {int SUCCESS = 0;int FAIL = 1;interface Msg{String SYS_ERROR = "系统异常 ";String SUCCESS = "请求成功";String FAIL = "请求失败";}}
package com.zd.baseframework.common.enumeration;/*** @author liudong* @Title: AppEnum* @Description 和系统相关的一些枚举值* @date 2022/2/6 12:27 PM*/
public interface AppEnum {enum AppType implements AppEnum {X_APP, DOMAIN, PLUGIN,;}enum Protocol implements AppEnum {HTTP("http"), HTTPS("https"), GRPC("grpc"),;private final String value;Protocol(String value) {this.value = value;}@Overridepublic String toString() {return this.value;}}
}

四、源码-对象基础类

Dao实体基础类

package com.zd.baseframework.common.entity.dao;import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.util.Date;/*** @author liudong* @Title: BaseEntity* @Description 此基类主要用于mybatis的实体定义继承用,这里固定了三个参数* id:数据库代理主键* ctime:创建时间* utime:更新时间* @date 2022/1/23 6:55 PM*/
@Data
@EqualsAndHashCode(callSuper = false, of = {"id"})
public abstract class BaseEntity<T extends Model<T>> extends Model<T> {@TableId(value = "id", type = IdType.ASSIGN_ID)private Long id;@TableField(value = "ctime", fill = FieldFill.INSERT, insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date ctime;@TableField(value = "utime", fill = FieldFill.INSERT_UPDATE, insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date utime;
}
package com.zd.baseframework.common.entity.dao;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;@Slf4j
@Component
public class BaseMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {// 设置创建与更新时间Date nowTime = new Date();if (metaObject.hasGetter("ctime")) {// 记录创建信息this.setFieldValByName("ctime", nowTime, metaObject);}if (metaObject.hasGetter("utime")) {// 记录更新时间this.setFieldValByName("utime", nowTime, metaObject);}}@Overridepublic void updateFill(MetaObject metaObject) {if (metaObject.hasGetter("utime")) {Date nowTime = new Date();// 记录更新信息this.setFieldValByName("utime", nowTime, metaObject);}}
}

Http实体基础类

package com.zd.baseframework.common.entity.http;import com.zd.baseframework.common.constants.ResponseConst;
import lombok.Data;/*** @author liudong* @Title: com.zd.baseframework.common.entity.http.ResponseEntity* @Description 用于controller的正常返回* @date 2022/1/23 7:00 PM*/
@Data
public class BaseResponse<T> {/*响应状态码@see ResponseConstants*/private Integer status;/*响应概要信息*/private String message;/*响应数据*/private T data;public BaseResponse() {}public BaseResponse(Integer status, String message) {this.status = status;this.data = null;this.message = message;}public BaseResponse(Integer status, String message, T data) {this(status, message);this.data = data;}/*响应成功*/public static <T> BaseResponse<T> success(T o) {return new BaseResponse<>(ResponseConst.SUCCESS, ResponseConst.Msg.SUCCESS, o);}public static <T> BaseResponse<T> success(String msg, T o) {return new BaseResponse<>(ResponseConst.SUCCESS, msg, o);}/*响应失败*/public static <T> BaseResponse<T> error() {return new BaseResponse<>(ResponseConst.FAIL,  ResponseConst.Msg.FAIL);}public static <T> BaseResponse<T> error(String msg) {return new BaseResponse<>(ResponseConst.FAIL, msg);}public static <T> BaseResponse<T> error(Integer status, String msg) {return new BaseResponse<>(status, msg);}
}
package com.zd.baseframework.common.entity.http;import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;/*** @author liudong* @Title: com.zd.baseframework.common.entity.http.FileResponseEntity* @Description 用于controller返回文件上传的返回值* @date 2022/1/23 7:11 PM*/
@Slf4j
public class FileResponse {public static ResponseEntity responseSuccess(File file) {if (file == null) {return null;}HttpHeaders headers = new HttpHeaders();headers.add("Cache-Control", "no-cache, no-store, must-revalidate");headers.add("Content-Disposition", "attachment; filename=" + file.getName());headers.add("Pragma", "no-cache");headers.add("Expires", "0");headers.add("Last-Modified", new Date().toString());headers.add("ETag", String.valueOf(System.currentTimeMillis()));return ResponseEntity.ok().headers(headers).contentLength(file.length()).contentType(MediaType.parseMediaType("application/octet-stream")).body(new FileSystemResource(file));}public static ResponseEntity responseSuccess(String content, String fileName) {if (content == null) {return null;}File file = new File(fileName);try {OutputStream os = new FileOutputStream(file);os.write(content.getBytes());os.close();} catch (IOException e) {log.error("write to file error");}HttpHeaders headers = new HttpHeaders();headers.add("Cache-Control", "no-cache, no-store, must-revalidate");headers.add("Content-Disposition", "attachment; filename=" + file.getName());headers.add("Pragma", "no-cache");headers.add("Expires", "0");headers.add("Last-Modified", new Date().toString());headers.add("ETag", String.valueOf(System.currentTimeMillis()));return ResponseEntity.ok().headers(headers).contentLength(file.length()).contentType(MediaType.parseMediaType("application/octet-stream")).body(new FileSystemResource(file));}}
package com.zd.baseframework.common.entity.http;import com.zd.baseframework.common.constants.ResponseConst;
import lombok.Data;import java.util.List;@Data
public class ListBaseResponse<T> extends BaseResponse<T> {/*数据的总条数*/private Long count;public ListBaseResponse() {super();}public ListBaseResponse(Integer status, String message) {super(status, message);}public ListBaseResponse(Integer status, String msg, T value, Integer count) {super(status, msg, value);this.count = Long.valueOf(count == null ? 0 : count);}public static ListBaseResponse responseListSuccess(String msg, List list) {long size = 0L;if (list != null) {size = list.size();}return new ListBaseResponse(ResponseConst.SUCCESS, msg, list, Math.toIntExact(size));}public static ListBaseResponse responseListSuccess(String msg, List list, Integer count) {return new ListBaseResponse(ResponseConst.SUCCESS, msg, list, count);}
}
package com.zd.baseframework.common.entity.http;import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zd.baseframework.common.constants.ResponseConst;
import lombok.Data;/*** @author liudong* @Title: com.zd.baseframework.common.entity.http.PageResponseEntity* @Description 分页响应对象* @date 2022/1/23 7:30 PM*/
@Data
public class PageBaseResponse<T> extends ListBaseResponse<T> {/*偏移位置,用于内部计算*/private Long offset;/*每页多少条*/private Long pageSize;/*当前第几页*/private Long currentPage;public PageBaseResponse() {super();}public PageBaseResponse(Integer status, String message) {super(status, message);}public PageBaseResponse(Integer status, String msg, T value, Integer count, Integer offset, Integer pageSize, Integer currentPage) {super(status, msg, value, count);this.offset = Long.valueOf(offset);this.pageSize = Long.valueOf(pageSize);this.currentPage = Long.valueOf(currentPage);}/*为了适应IPage,暂定这样,后续有可能优化*/public PageBaseResponse(Integer status, String msg, T value, Long count, Long offset, Long pageSize, Long currentPage) {super(status, msg, value, Math.toIntExact(count));this.offset = Long.valueOf(offset);this.pageSize = Long.valueOf(pageSize);this.currentPage = Long.valueOf(currentPage);}public static <T> PageBaseResponse<T> responseListSuccess(String msg, IPage pageEntity) {return new PageBaseResponse(ResponseConst.SUCCESS, msg, pageEntity.getRecords(),Math.toIntExact(pageEntity.getTotal()),Math.toIntExact(pageEntity.offset()),Math.toIntExact(pageEntity.getSize()),Math.toIntExact(pageEntity.getCurrent()));}}

MapStruct工具类

可查看​​基于grpc从零开始搭建一个准生产分布式应用(5) - MapStruct传输对象转换​​附录部分

Model实体基础类

@Data
public abstract class BaseModel {private Long id;private Date ctime;private Date utime;
}
package com.zd.baseframework.common.entity.model;import lombok.Data;import java.util.List;@Data
public class WrapBoForDto<T> {private Integer count;private Integer offset;private Integer pageSize;private Integer currentPage;private List<T> data;
}

五、源码-异常

package com.zd.baseframework.common.exceptions;/*** @author liudong* @Title: AppException* @Description 基础异常类,用于处理普通业务上的异常,直接抛送即可,定义不同的异常类主要是用于区别异常的类型* @date 2022/1/17 4:52 PM*/
//TODO  异常传导链断了,需要修复
public class AppException extends RuntimeException {private Integer status;public AppException() {super();}public AppException(String message) {super(message);}public AppException(String s, Throwable throwable) {super(s, throwable);}public AppException(Throwable throwable) {super(throwable);}public AppException(Integer status, String message) {super(message);this.status = status;}public Integer getStatus() {return this.status;}}

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

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

相关文章

【linux】cat的基本使用

cat是一个常用的命令&#xff0c;用来显示文本的内容&#xff0c;合并和创建文本文件 类似命令还有显示文件开头的内容&#xff1a; 【linux】head的用法 输出文件开头的内容-CSDN博客 显示文件末尾的内容&#xff1a; 【linux】tail的基本使用-CSDN博客 当我们想到了想要…

Zookeeper-Zookeeper选举源码

看源码方法&#xff1a; 1、先使用&#xff1a;先看官方文档快速掌握框架的基本使用 2、抓主线&#xff1a;找一个demo入手&#xff0c;顺藤摸瓜快速静态看一遍框架的主线源码&#xff0c;画出源码主流程图&#xff0c;切勿一开始就陷入源码的细枝末节&#xff0c;否则会把自…

Primavera Unifier 项目控制延伸:Phase Gate理论:3/3

继续上一篇阶段Gate的具体内容 https://campin.blog.csdn.net/article/details/127827681https://campin.blog.csdn.net/article/details/127827681 阶段 3 研发 前述阶段的计划和安排都要在研发阶段执行起来&#xff0c;同时&#xff0c;最重要的产品设计和开发部分也需要在…

系统学习Python——装饰器:函数装饰器-[对方法进行装饰:基础知识]

分类目录&#xff1a;《系统学习Python》总目录 我们在前面的文章中编写了第一个基于类的tracer函数装饰器的时候&#xff0c;我们简单地假设它也应该适用于任何方法一一一被装饰的方法应该同样地工作&#xff0c;并且自带的self实例参数应该直接包含在*args的前面。但这一假设…

计算机基础面试题 |04.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

python打开文件的方式比较

open(addr,w) 打开之后文件无论以前有什么&#xff0c;打开后都要清空 /// open(addr,r) 文件打开后&#xff0c;不删除以前内容

多人协同开发git flow,创建初始化项目版本

文章目录 多人协同开发git flow&#xff0c;创建初始化项目版本1.gitee创建组织模拟多人协同开发2.git tag 打标签3.git push origin --tags 多人协同开发git flow&#xff0c;创建初始化项目版本 1.gitee创建组织模拟多人协同开发 组织中新建仓库 推送代码到我们组织的仓库 2…

STM32与TB6612电机驱动器的基础入门教程

TB6612是一款常用的双路直流电机驱动芯片&#xff0c;适用于小型机器人以及其他需要控制电机方向和转速的应用。在STM32微控制器的配合下&#xff0c;可以实现对TB6612电机驱动器的控制&#xff0c;进而实现电机的控制。本文将带领读者一步步了解如何搭建基于STM32与TB6612的电…

我从来不理解JavaScript闭包,但我用了它好多年

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 你是否学习了很久JavaScript但还没有搞懂闭包呢&#xff1f;今天就来聊一下…

SpringBoot解决前后端分离跨域问题:状态码403拒绝访问

最近在写和同学一起做一个前后端分离的项目&#xff0c;今日开始对接口准备进行 登录注册 的时候发现前端在发起请求后&#xff0c;抓包发现后端返回了一个403的错误&#xff0c;解决了很久发现是【跨域问题】&#xff0c;第一次遇到&#xff0c;便作此记录✍ 异常描述 在后端…

Java---网络编程

文章目录 1. 网络编程概述2. InetAddress3. 端口和协议4. Java网络API5. URL6. URLConnection类 1. 网络编程概述 1. 计算机网络&#xff1a;是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统、网络管理软…

2024年Mac专用投屏工具AirServer 7 .27 for Mac中文版

AirServer 7 .27 for Mac中文免费激活版是一款Mac专用投屏工具&#xff0c;能够通过本地网络将音频、照片、视频以及支持AirPlay功能的第三方App&#xff0c;从 iOS 设备无线传送到 Mac 电脑的屏幕上&#xff0c;把Mac变成一个AirPlay终端的实用工具。 目前最新的AirServer 7.2…

Matlab技巧[绘画逻辑分析仪产生的数据]

绘画逻辑分析仪产生的数据 逻分上抓到了ADC数字信号,一共是10Bit,12MHZ的波形: 这里用并口协议已经解析出数据: 导出csv表格数据(这个数据为补码,所以要做数据转换): 现在要把这个数据绘制成波形,用Python和表格直接绘制速度太慢了,转了一圈发现MATLAB很好用,操作方法如下:…

逗号表达式与赋值表达式

逗号表达式和赋值表达式是C语言中常用的表达式类型。它们可以用于各种目的&#xff0c;包括计算和评估表达式、初始化变量、为函数调用提供参数以及将值分配给变量。 逗号表达式 逗号表达式允许在单个语句中计算和评估多个表达式。逗号分隔每个表达式&#xff0c;并且表达式从…

Spring Cloud Gateway + Nacos 灰度发布

前言 本文将会使用 SpringCloud Gateway 网关组件配合 Nacos 实现灰度发布&#xff08;金丝雀发布&#xff09; 环境搭建 创建子模块服务提供者 provider&#xff0c;网关模块 gateway 父项目 pom.xml 配置 <?xml version"1.0" encoding"UTF-8"?…

阿里云服务器开放端口Oracle 1521方法教程

阿里云服务器ECS端口是在安全组设置的&#xff0c;Oracle数据库1521端口号开放是在安全组中添加规则来实现的&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器开放Oracle 1521端口方法教程&#xff1a; 阿里云服务器开放Oracle 1521端口 在阿里云服务器ECS…

微信小程序自定义步骤条效果

微信小程序自定义一个步骤条组件&#xff0c;自定义文字在下面&#xff0c;已完成和未完成和当前进度都不一样的样式&#xff0c;可点击上一步和下一步切换流程状态&#xff0c;效果如下。 这是视频效果&#xff1a; 前端实现步骤条效果 下面我们一步步实现编码&#xff0c;自定…

华为鸿蒙运行Hello World

前言&#xff1a; 从11月中旬开始通过B站帝心接触鸿蒙&#xff0c;至今一个半月左右不到&#xff0c;从小白到入坑&#xff0c;再到看官网案例&#xff0c;分析案例&#xff0c;了解技术点&#xff0c;还需要理清思路&#xff0c;再写博客&#xff0c;在决定写 &#xff1c;Har…

仓库管理系统

基于SSM框架的仓库管理系统

.net8 AOT编绎-跨平台调用C#类库的新方法-函数导出

VB.NET AOT无法编绎DLL,微软的无能&#xff0c;正是你的机会 .net8 AOT编绎-跨平台调用C#类库的新方法-函数导出 1&#xff0c;C#命令行创建工程&#xff1a;dotnet new classlib -o CSharpDllExport 2&#xff0c;编写一个静态方法&#xff0c;并且为它打上UnmanagedCallersO…