基于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.hqwc.cn/news/313315.html

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

相关文章

【Java 数组解析:探索数组的奇妙世界】

数组的引入 我们先通过一段简单的代码引入数组的概念。 import java.util.Scanner; public class TestArray01{public static void main(String[] args){//功能&#xff1a;键盘录入十个学生的成绩&#xff0c;求和&#xff0c;求平均数&#xff1a;//定义一个求和的变量&…

电机(一):直流有刷电机和舵机

声明&#xff1a;以下图片来自于正点原子&#xff0c;仅做学习笔记使用 电机专题&#xff1a; 直流电机&#xff1a;直流有刷BDC&#xff08;内含电刷&#xff09;&#xff0c;直流无刷BLDC&#xff08;大疆的M3508和M2006&#xff09;,无刷电机有以下三种形式&#xff1a;&a…

软件测试卷王在2024年初开卷。。。

前言 转眼就到了2024年了&#xff0c;工作这几年我的薪资也从12k涨到了18k&#xff0c;对于工作只有3年多的我来说&#xff0c;还是比较满意的&#xff0c;毕竟一些工作4、5年的可能还没我高。 我可能就是大家说的卷王&#xff0c;感觉自己年轻&#xff0c;所以从早干到晚&am…

常用的 MySQL 可视化客户端

数据库可视化客户端&#xff08;GUI&#xff09;让用户在和数据库进行交互时&#xff0c;能直观地查看、创建和修改对象&#xff0c;如&#xff1a;表、行和列。让数据库操作变得更方便了。 今天&#xff0c;我们来了解下目前市场上最常用的 MySQL 可视化客户端。 官方&#x…

uni-appcss语法

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

回顾2023在CSDN的足迹与2024展望

目录 一、关于博主 二、2023的历程 1、博客分类 2、年度创作数据 3、解锁勋章 4、主要的方向 二、技术感悟 1、技术深入 2、还是实践 三、展望2024 今天是2024年的第一天&#xff0c;告别2023年&#xff0c;让我们以全新的姿态&#xff0c;去迎接新的一年的挑战。2023年…

主域控活动目录配置工作任务

题目 配置Windows防火墙&#xff0c;仅允许配置的服务通过防火墙&#xff1b;禁止ICMP回显请求。在DCserver上配置如下服务与设置&#xff1a;为ChinaSkills.cn安装和配置活动目录域服务&#xff1b;只有域管理员和IT部门员工可以登陆服务器。创建如下全局AD组与用户&#xff…

Qt重载事件

重载event 事件类型 (EventType) 事件类型是 QEvent 类的一个枚举 &#xff0c;包含了 Qt 能够处理的所有不同类型的事件。这个枚举包括但不限于以下常见类型&#xff1a; QEvent::MouseButtonPress: 鼠标按钮按下事件。QEvent::MouseButtonRelease: 鼠标按钮释放事件。Q…

不同语言告别2023,迎接2024

一、序言 1.一名合格的程序员&#xff0c;始于Hello World&#xff0c;终于Hello World&#xff0c;用不同语言表达2023最后一天。 2.在这一年里&#xff0c;博主新接触了VUE、Python、人工智能、JAVA的框架SprinBoot、微服务等&#xff0c;然后一路来感谢大家的支持&#xf…

【深度解析C++之运算符重载】

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;【深度解析C之this…

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项样题卷①

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第1套&#xff09; 目录 2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第1套&#xff09; 模块一…

【IP-Adapter】进阶 - 同款人物【2】 ☑

测试模型&#xff1a;###最爱的模型\flat2DAnimerge_v30_2.safetensors [b2c93e7a89] 原图&#xff1a; 加入 control1 [IP-Adapter] 加入 control 2 [OpenPose] 通过openpose骨骼图修改人物动作。 加入 control 3 lineart 加入cotrol3 …