基于Springboot的Rpc服务端开发脚手架(base-grpc-framework)

Posted 生而为人我很遗憾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Springboot的Rpc服务端开发脚手架(base-grpc-framework)相关的知识,希望对你有一定的参考价值。

      经过一段时间的线上环境打磨和验证,重新优化了grpc专题中的框架,优化和扩展了很多功能。如果读者之前未关注过,建议先了解此系列中的:​​快速开始​​​ 和 ​​开始准备​​ 这两小章。

一、概述

base-grpc-framework是笔者自行开发和封装的一个server脚手架,可直接用于单机和分布式服务端开发。主要集成了Springboot、Google-grpc、Mapstrut、Mybatis、hutool(开源工具包)等开源框架,并基于上述基础封装了最最基本的服务能力,并对每种能力都提供了抽象实现和配置。使用者可通过修改相关配置就可直接开发业务代码,主要能力包括如下:

  • Tracklog:跟踪日志,为每请求生成唯一trackid,并贯穿请求到返回全链路;
  • Interceptor:拦截器,提供了三个抽象的拦截器grpc-client、grpc-server、mvc,同时支持mvcExceptionAdvice;
  • ModelBeanConvent:对象复制,只需一个接口声明就可实现bean对象的相互转换,包括proto与java对象间的转换;
  • DataTool:数据操作,基于mybatis plug,主要扩展了插入和分页查询功能;

项目基于maven构建,脚手架中提供了一种默认的项目模块组织以及maven组织模式,更方便打包部署和多人协同开发。注:针对单机和分布式系统需自行删减相关模块。

二、模块介绍

  • pom.xml:项目主maven文件,主要定义公共的配置以及版本控制;
  • base-grpc-framework-common:项目工具包;
  • base-grpc-framework-api:项目接口定义;
  • base-grpc-framework-core:接口业务实现,提供了一些示例demo;
  • base-grpc-framework-dao:数据库存储实现;
  • base-grpc-framework-application:项目启动包装应用;

三、Quick Start

建议开发环境:JDK 1.8.0_144、Maven 3、Git;代码可从​​github源码​​​下载。

3.1、运行示例代码

1、创建mysql数据库,默认数据库连接为jdbc:mysql://127.0.0.1:3306/badCase, username: root, password: 12345678
2、初始化mysql表,示例中的初始化.sql文件位于 base-grpc-framework-dao/src/main/java/resources/ddl/init.sql中;

3、运行 base-grpc-framework-application 模块中的BaseFrameworkApplication.java类,需配置启动参数为active profiles=dev;

最后在浏览器中输入:​​http://localhost:18080/swagger-ui.html​​ 就可以看到示例了。

3.2、开发自己的业务代码

3.2.1、修改配置

下列配置可配置到公司专用的配置数据库里。如果公司没有专用的配置库,建议用nacos来实现。下面文件是完整的配置,多数比较简单,读者可根据实际情况自行修改;

# 服务配置 http配置和GRPC接口配置
server:
port: 18080
compression:
enabled: true
mime-types: application/json,application/octet-stream

grpc:
server:
port: 9898 #发布远程访问地址
in-process-name: native #发布本地访问地址
client:
inProcess: #自定义的客户端名称
address: in-process:native #配置内部访问服务名称
enableKeepAlive: true
keepAliveWithoutCalls: true

logging:
config: classpath:log4j2.xml
level:
root: INFO
org.springframework.web: ERROR

app-properties:
token-key: token
http-api-path: /api/**

# spring配置
spring:
application:
name: GrpcFramework-Server-APP
aop:
auto: true
proxy-target-class: true
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/badCase?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 12345678
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
validation-query: SELECT 1 FROM DUAL
max-pool-prepared-statement-per-connection-size: 5
test-while-idle: true
test-on-borrow: false
test-on-return: false
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 100000
filters: stat

# mybatis-plug 配置
mybatis-plus:
mapper-locations: classpath:/mybatis/*Mapper.xml
configuration:
map-underscore-to-camel-case: true #开启驼峰命名规则映射
default-statement-timeout: 20000 #超时查询
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql日志

# swagger 自定义配置,为了扩展base-package功能
swagger-config:
enabled: true #正式环境需要设置为false
title: GrpcFramework-API
description: GrpcFramework-Server-Restful-API
version: V1.0
base-package: com.zd.baseframework.core.restful #多个base包可用逗号分隔
authorization-key-name: token

3.2.2、配置启动类

启动类源码如下,主要是把业务代码的配置添加到@SpringBootApplication、@MapperScan这两个注解中的值中(示例中SpringBootApplication中的值不要删除)

com.zd.baseframework.BaseFrameworkApplication
@SpringBootApplication(scanBasePackages = "com.zd.baseframework", "cn.hutool.extra.spring")
@MapperScan("com.zd.baseframework")
@EnableConfigurationProperties
@EnableScheduling
@EnableAsync
public class BaseFrameworkApplication

public static void main(String []args)
TimeZone.setDefault(TimeZone.getTimeZone("CTT"));
SpringApplication.run(BaseFrameworkApplication.class, args);


3.2.3、修改拦截器(可选)

下面的拦截器不一定都需要,可按需扩展,也可直接采用笔者示例中的默认实现。

http-token拦截器,拦截器注册类com.zd.baseframework.core.grpc.interceptor.GloablInterceptorRegister

com.zd.baseframework.core.grpc.interceptor.GrpcTokenInterceptor.java

http-exception切面

com.zd.baseframework.core.restful.advice.HttpExceptionAdvice.java

grpc-token拦截器,拦截器注册类com.zd.baseframework.core.restful.interceptor.InterceptorRegister

com.zd.baseframework.core.restful.interceptor.TokenInterceptor



以上是关于基于Springboot的Rpc服务端开发脚手架(base-grpc-framework)的主要内容,如果未能解决你的问题,请参考以下文章

tyboot -基于 Spring Boot 的快速开发脚手架

基于Netty和SpringBoot实现一个轻量级RPC框架-Client篇

「架构师必备」基于SpringCloud的SaaS型微服务脚手架

「架构师必备」基于SpringCloud的SaaS型微服务脚手架

SpringBoot+Vue+AntDesign前后端分离项目脚手架

TIMO后台管理系统-基于SpringBoot开发