SkillAgentSearch skills...

Stategen

springboot+spring cloud alibaba(nacos,seata,sentinel,dubbo)分布式+微服务+本地服务,全栈架构含有前端(java服务端,H5、iOS、andriod前端),后端骨架代码生成器+前端骨架生成器+后端迭代开发生成器+前端与后端交互(至响应式状态)生成器,内含大名鼎鼎的支付宝dalgen之freemarker开源实现之商用升级版dalgenX,大量前、后端代码通过生成器生成,把前后端分离开发模式"拉"回来,目前前端已支持react(dva+umi+typescript)和flutter(provider),后续加入kotlin、swift。免去前端文档、调试、postman、mockjs...繁琐。开发中迭代生成,不改变原开发流程、生成80%代码,兼容后20%你自己的代码,拒绝挖坑! https://github.com/stategen/stategen

Install / Use

/learn @stategen/Stategen
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

截图

<p float="left"> <img src="https://github.com/stategen/docs/blob/master/javaCodeDemo.png" width="600" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/typescriptCodeDemo.png" width="600" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/flutterCodeDemo.png" width="600" alt="drawing" /> </p> <p float="left"> <img src="https://github.com/stategen/docs/blob/master/category.png" width="400" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/homeApis.png" width="400" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/category_json.png" width="400" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/dva_react_model.png" width="400" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/flutter_goods_provider.png" width="400" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/stategenAppSnapshort.png" width="400" alt="drawing" /> </p> mobile端 <img src="https://github.com/stategen/docs/blob/master/stategenWebSnapShort1.png" width="400" alt="drawing" /> web端 上面2张图,按通常的开发量需要上千行代码,现在只需要开发10多行代码

我非常赞同的

  • 重复可能是软件中一切邪恶的根源。—— Robert C.Martin

StateGen?

  • 轻代码or敏捷开发? NO;
  • 用可视化界面配置生成? NO
  • 改变原开发模式? NO
  • StateGen不是DEMO,而是一个架构,追求的是易于上手、高效开发、容易维护、可拓展、运行稳定,易于排查的架构

Stategen架构的构成

  • springboot

    • 直接支持 jar war打包模式
  • spring cloud alibaba

    • nacos,seata,sentinel,dubbo,mybatis|ibatis开箱即用
    • 分布式 微服务+本地服务
    • 超动态自动装配消息系统 (spring-stream-3,支持 rocketMq,原则上同时支持kafuka和activeMq)
  • 后端骨架生成器

  • 前端骨架生成器

  • 后端可迭代开发生器(dalgen演化而来dalgenX,全网唯一可支持迭代开发??)

  • 前端开发生成器,可把后端所有任意java api转化为前端的交互代码(mvvm,reactive,react(umi,dva,saga),flutter(provider),依据模版种类)

  • 没有限定使用者集成其它技术

StateGen中的开发生成器,和市面上那些谈虎色变的生成器什么区别?

  1. 后端dalgenx生成器:
    a.从大名鼎鼎的支付宝生成器dalgen演化而来,单dalgen可以说把市面上所有的java orm层生成器秒成渣,dalgenX则在此基础上拓展可迭代功能。dalgen只支持ibatis(个人认为:不开源和不支持mybatis使它推广不开来),而dalgenX则可以在ibatis与mybatis之间自由切换.
    b. dalgenX生成器中的sql相当于Batis sql的用来简化开发的语法糖,它生成可见的纯batis sql和相关java,xml代码,代替肉身做一系列复杂的工作包括查找替换。语法糖不参与运行期,不用提心”国产“框架的坑。
    c.dalgenX生成代码时,会解析已有的java代码,自动增量比对生成,代替肉身备份代码比对还原代码。更方便维护pojo等一系列代码,它也有效治好了DDD模型中的失血模式下的失忆的毛病。
  2. 前端生成器只是在原controller层api方法上加了个java标注 @State而已,对后端代码零侵入,零工作量.
    它成立的理论基础是:
    a. 响应式前端,交互和页面是分开的。
    b. 后端任意一个api,它对应的前端代码:入参、出参对象化,序列化,反序列化,网络调用,状态化都是固定,谁肉身来写都相同的,所以可以用生成器覆盖。
    c. 前端开发生成器只是托管intergrade文件夹下的内容,重点是响应式前端前后端交互部分代码,其它代码只是辅助生成,不再覆盖,使用的同学可无限制优化里面的代码,可以换成自己的理想的前端骨架。
  3. 个人觉得几个生成器可以减少80%的工作,这还不算主要的,主要是底层代码规范,上层代码就不会乱

骨架代码生成流程图

  • 虚线为人工参与点

  • 实线为maven或系统自动装配

  • 粗实线为StateGen自动生成的线路

  • 系统骨架和项目骨架生成器运行时都是幂等,在已有的项目上重新运行只会追加,不会覆盖,不用担心手贱的毛病.

  • 图中"trade"指stategen架构中的系统名 app或cms或xxx指项目

  • 骨架代码生成流程图

  • ​ 直观文件夹树型图: 为什么是多层的?这不是技术范畴而是为了规范和原则,业务系统会做大,层越单纯越安全,通过限定每层pom中引用jar包来限定了每层的功能,比如限定dao只能crud不能出现业务,这种方式比写硬邦邦规章制度好。

  • stg.2.3.1.RELEASE版本可选3种文件夹格式: numHeader(默认):1-trade-pojo;numMid:trade-1-pojo; numNone:trade-pojo,在ide中排序后人眼对系统结构顺序一目了然(有序依赖的业务系统在ide内有序排列工作效率会高)

trade (trade相当于微服务中当前服务名、系统名)
├── 1-trade-pojo		//失血或贫血模式,无复杂业务逻辑,不暴露隐私业务逻辑。
├── 2-trade-facade		//和1-trade-pojo组成对外jar包,越纯洁越好
├── 2-trade-sink-facade		//消息订阅方jar,别人按你的格式发送消息,Provider不需要配置,配置自动装配
├── 3-trade-intergrade		//单纯引用别的系统中的jar,不依赖于本系统中其它jar,方便做jar冲突排查
├── 4-trade-dao			//限定为crud,无业务逻辑
├── 5-trade-service      //业务逻辑实现部分
├── 6-trade-web-base     //业务逻辑实现部分+和共用项目controller,让后面的7遵从每个数据库只有一套curd服务的原则。
├── 7-trade-web-app      //springboot application,引用 6-trade-web-base和实现自身独特业务逻辑
│   ├── app-frontend-flutter
│   ├── app-frontend-h5
│   └── WebRoot           
├── 7-trade-web-cms		//springboot application,引用 6-trade-web-base和实现自身独特业务逻辑
│   ├── cms-frontend-web
│   └── WebRoot
├── 7-trade-web-...		//springboot application,引用 6-trade-web-base和实现自身独特业务逻辑
├── opt
│   └── config
│       └── stategen
└── tables

骨架快速开始

运行环境

服务端/windows(linux类似)

A. java 1.8+
B. maven 3 (3.5.0有bug,请使用3.5.2+) C. mysql5.7
D. gitbash(安装git2.0 自带,目的是可在windows上执行bash脚本)
E. nacos-server-1.3.2 (因为目前架构中用到的spring cloud alibaba denpencies版本为2.2.3,其中限定nacos client为1.3.3,它与nacos1.4.0-server通信有障碍,本架构用于生产,不在尝鲜版上纠缠,等他们稳定了再升级) F. sentinel dashboard-1.8.0 ps:因为在dashboard上操作不能反向持久化到nacos中,开发和生产很不方便,有大神制从原版中修改了代码制了nacos反向持久化版,我稍微忧化可用性和方便性,,https://github.com/stategen/sentinel-dashboard-nacos 它的启动方式是这样的:

 java -Dnacos.server-addr=localhost:8848 -Dserver.port=8880 -Dcsp.sentinel.dashboard.server=localhost:8880 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-nacos-1.8.0.jar

G. seata-server-1.4.0

开发环境安装

因项目依赖jars我已经发布maven中央仓库了,不需要使用的同学再辛苦自行编译,只需要git clone dalgenX,这是一个GMAVEN项目,无需打包

  1. 配置 dalgenX (ps:dalgenX并不依赖于相StateGen架构,它可以配到其它spring项目中单独生成前后端代码),
git clone https://github.com/stategen/dalgenx.git
(把 gen.custom.xml.templete 复制一份为 把 gen.custom.xml)
  1. 设置 DALGENX_HOME 环境变量为 dalgenx所在目录

  2. 将 %DALGENX_HOME% 添加至 PATH 中

  3. Ide中配置(eclipse|myeclipse|idea)xml文件,方便开发时打字提示.

location: {DALGENX_HOME}\gen.schemas-1.0.dtd
key type: system Id
key: https://github.com/stategen/dalgenx/blob/master/gen.schemas-1.0.dtd

用命令初始化系统及项目/范例

ps: 以下gen.sh 必须在gitbash中运行,不能在cmd中运行。linux可以无需考虑。

  1. 帮助
gen.sh -h
  1. 创建系统骨架,注意,骨架|脚手架生成器操作是幂等的,可以多次执行. -e 是当有错误时,输出错误信息.
gen.sh system com.mycompany.biz trade -e  

com.mycompany.biz 为包名
trade 系统名 /数据库名 dubbo 系统名
至些,一个StateGen系统分分中创建完成,接下来添加项目,可以无限添加项目,为啥这样搞?它们遵从同一个数据库只有一套crud服务的原则.减少扯皮,减少在泡在会议室的时间,谁改完了表,都得改想关的影响点,,好在,因为架构上它们在同一个系统中,ide会帮你及时发现兼容bug

  1. 创建app web api 项目 (可选) , (不想参与前端的同学,涉及到前端的命令参数都可以忽略
//创建后端项目时,同时创建前端,前端目前有3个模版 h5,web,flutter 
gen.sh project app h5 –e  //带前端
//也可以:
gen.sh project app –e  //不带前端
//**h5和web对应的前端是nodojs项目,ssr模式,因此打包时,maven插件会编译前端**
//**必须安装nojs和yarn才能编译通过,也可到7-tradeApp的pom.xml中,把编译注释掉**

  
//因为app项目上面已创建,生成器会判断,以下命令只创建了一个flutter前端
gen.sh project app flutter –e  

//或者时入子目录
cd 7-trade-web-app
gen.sh client flutter -e //这样也可以创建flutter前端
  1. 创建cms web 项目 cms指后台管理系统, (可选,也可以以后再创建或不要)
gen.sh project cms web –e 
也可以 
gen.sh project cms –e 
  1. 创建shedule项目,不带前端, (可选,也可以以后再创建或不要)
gen.sh project schedule –e  //无前端,可以跑定时任务

//变为git版本控制, trade 为git 项目,app-frontend-flutter为trade的子项目,(git子项目其实也是一个独立的git项目,我个人觉得git这点比svn理念先进).

sh gitinit.sh //变为git项目
cd app-frontend-flutter
sh git_add_to_parent_as_sub.sh //变为trade 的git子项目
  1. 环境及表

创建trade数据库并运行 运行 trade.sql 也可以建一个空表. 把opt复制到同盘(tomcat所以盘或者你的ide同盘,这样目的是保持开发和运行环境一致。windows下/opt指的容器同盘目录)根目录下,修改stategen.xml中的数据库配置,只需要关注mysql,nacos,相关配置,zookeeper和redis可以不用管 7-xxx下的stategen.xml相关的内容合并到/opt/config/stategen/stategen.xml中 修改gen_config.xml中的开发数据库配置
因为一些文件可以用生成器获取,所以不在版本控制里,先后在 gitbatsh中运行 tablebatch.sh 和 dalbatch.sh ,空表则不需要运行.

sh ./tablebatch.sh 
sh ./dalbatch.sh 

启动TradeAppApplication.java 每个7中都有一个TradeXxxApplication.java

启动成功后控制台可以看到以下信息:

	Application  is running! Access URLs:
	servletWebServerFactory  类型	:UndertowServletWebServerFactory:
	Local访问网址: 		http://localhost:8080/tradeApp
	应用访问网址: 		http://192.168.112.1:8080/tradeApp
	Swagger网址: 		http://192.168.112.1:8080/tradeApp/doc/index.html

ps: 1.StateGen生成的架构的代码,启动时对端口做了占用检查,因此:一个项目启动多个实例也是没问题(只要不启动太快),如8080端口,它的配置是这样的

    <bean class="org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory">
        <property name="contextPath" value="/${spring.application.name}" />
        <!-- 逻辑:如果端口被占用,则往上找直到没有被占用的端口 -->
        <property name="port" value="#{T(util.Net).from(${tradeApp.port:8080})} " />
    </bean>

ps: 2. StateGen默认你的项目会越来越大(谁个系统还没有百把张表或者自定义实现spring系统bean),因此:除了必要的bean是代码创建的外,都是xml配置的,大系统,xml才是王道 .

在nacos上应该可以看到dubbo服务:

nacos_trade截图

在swagger中 调用一下一个AppController.java中的 testSentinel api

    /***测试限流降级分布式事务*/
    @ApiRequestMappingAutoWithMethodName(method = RequestMethod.GET)
    @SentinelResource()
    public User testSentinel(@ApiParam(value="用户ID",defaultValue="1") @RequestParam() String  userId) {
        //MockUtil只能用于测试,不能打包,执行 mvn package 由 插件 forbiddenapis 检测
        MockUtil.throwRandomException(2);
        User user = this.userService.getUserByUserId(userId);
        return user;
    }
    

到Sentinel-dashboard中可以看到

sentinel-trade

设置限流降级,单机阈值设为2,快速在swagger中调用testSentinel,可以看到如下限流返回值

{
  "code": 500,
  "exeptionClass": "FlowException",
  "message": "该阶段不支持该操作(限流),请稍后再试",
  "status": "ERROR",
  "success": false
}

上面的message信息可以配置的:

    <bean class="org.stategen.framework.spring.mvc.SentinelBlockHandler">
        <property name="blockResponseStatus">
            <util:constant static-field="com.mycompany.biz.enums.ResponseStatus.BLOCK" />
        </property>
        <property name="msgFlowException" value="该阶段不支持该操作(限流),请稍后再试"/>
    </bean>
  1. 微服务集群相互调用:

    按上面我们再创建一个系统:verify ,(另一个文件夹),

//创建系统
gen.sh system com.mycompany.verify auth -e
//创建系统中的项目
gen.sh project microServ -e

mavan打包发到公司私有仓库或者安装到本地仓库:

mvn install|deploy

在原来的trade系统中3-trade-intergrade中pom.xml里面,只要引用即可。

<dependency>
    <groupId>com.mycompany.verify</groupId>
    <artifactId>auth-facade</artifactId>
    <!-- verify 系统每次变更,要改 verfy-facade.version版本号-->
    <version>1.0.0</version>
</dependency>

10 . 一个典型Stategen 系统 结构图

Image

迭代开发流程图

  • 虚线为人工代码参与点

  • 实线为maven或系统自动装配

  • 粗实线为dalgenX自动生成和迭代的线路

  • 从流行程上来看,

    • dalgenX没有改变原开发模式
    • 保留之前工作代码成果,新生成代码增量添加
    • 人工编写的代码可以做到仅限业务

迭代开发流程图

演示User需求开发 (一键开发,一键迭代,显式代码,所见即所得)

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `teacher_id` varchar(64) CHARACTER SET ut

Related Skills

View on GitHub
GitHub Stars95
CategoryDevelopment
Updated12d ago
Forks31

Languages

Java

Security Score

95/100

Audited on Mar 18, 2026

No findings