说明sprigrai是sprig/sprigboot的开发范例.基于K8S+Istio实现云原生微服务.sprigrai自带代码生成器,能够生成对表的增删改查的逻辑代码.sprigrai是标准Mave项目,只依赖sprigboot,没有hiberate,struts,ibatis,数据库调优可以使用druid输出慢sql,比分析xml中的语句更直观,sprigrai所有的sql语句都使用Fider封装管理,只要查看Fider的引用即可.实现了什么?不增加学习成本,像单体一样开发分布式微服务.不修改业务代码,可以实现单体,分层,微服务多种部署模式切换.集成seata分布式事务实现.子项目module的前后端可以独立运行,也可以被无感知集成,实现前后端按需打包.实现思路启动加载sprigbea时,先检查本地是否有实现,如果没有就启动GRPC远程调用.开发人员无感知.基于seata分布式事务实现.支持有注解和无注解(开发人员无感知,理论上有不同步风险,个人感觉做好日志,风险不大)混合使用.基于K8S的Service实现服务注册和发现,CofigMap实现配置中心.开发人员无感知.基于Istio实现微服务的发现,监控,熔断,限流.开发人员无感知.
架构设计详细思路:https://www.jiagou.com/post/58-cloud-ative-service-mesh
限制接口和实现的命名强制规范.一个RPC接口只能有一个实现.分布式事务,一定要避免A服务update表t,RPC调用B服务,B服务也update表t.这样A等待B结果,B等待A释放锁,造成死锁.分布式无注解比较方便,理论上有不同步风险,个人感觉做好日志,风险不大Service层不可以使用ServletAPI,例如HttpRequest建议每个前后端module/子项目,都有各自的前缀,方便gix根据路径解析如果module依赖包的特定版本(例如etty,Grpc)和根项目版本冲突,module不能无感知集成,暂时只能独立运行体验单体到分层切换修改sprigrai-system-web依赖sprigrai-system-service,不再依赖sprigrai-system-serviceimpl. sprigrai-system-serviceimpl添加sprigrai-grpc-server依赖,启用org.sprigrai.SystemServiceImplApplicatio的@SprigBootApplicatio注解启动seata-server服务端.seata客户端的配置在项目的resources/file.cof里,默认配置是default.grouplist="127.0.0.1:8091"启动sprigrai-system-serviceimpl启动sprigrai-system-web访问https://127.0.0.1:8080/system/api/checkHealth文档https://gitee.com/chuayog/sprigrai/tree/master/sprigrai-system/sprigrai-system-web/doc
代码生成器https://gitee.com/chuayog/sprigrai/tree/master/sprigrai-gecode
sql脚本https://gitee.com/chuayog/sprigrai/tree/master/sprigrai-system/sprigrai-system-web/sql
测试用例//就极简而言,一个数据库只需要一个Service,就可以管理这个数据库的任意一张表//@Test查询基本类型publicvoidtestObject()throwsExceptio{//Fiderfider=ewFider("selectidfromt_userwhere1=1");Fiderfider=Fider.getSelectFider(User.class,"id").apped("WHERE1=1");fider.apped("adid=:userId").setParam("userId","admi");Strigid=baseDemoService.queryForObject(fider,Strig.class);System.out.pritl(id);}//@Test查询一个对象publicvoidtestObjectUser()throwsExceptio{//Fiderfider=ewFider("select*fromt_userwhereid=:userIdorderbyid");Fiderfider=Fider.getSelectFider(User.class).apped("WHERE id=:userIdorderbyiddesc");fider.setParam("userId","admi");Useru=baseDemoService.queryForObject(fider,User.class);System.out.pritl(u.getName());}//@Test查询分页publicvoidtestMsSql()throwsExceptio{//Fiderfider=ewFider("select*fromt_userorderbyid");Fiderfider=Fider.getSelectFider(User.class).apped("orderbyiddesc");Listlist=baseDemoService.queryForList(fider,User.class,ewPage(2));System.out.pritl(list.size());for(Users:list){System.out.pritl(s.getName());}}//@Test调用数据库存储过程publicvoidtestProc()throwsExceptio{Fiderfider=ewFider();fider.setParam("uitId",0);fider.setProcName("proc_up");MapqueryObjectByProc=(Map)baseDemoService.queryObjectByProc(fider);System.out.pritl(queryObjectByProc.get("#update-cout-10"));}//@Test调用数据库函数publicvoidtestFuctio()throwsExceptio{Fiderfider=ewFider();fider.setFuName("fu_userId");fider.setParam("userId","admi");StriguserName=baseDemoService.queryForObjectByByFuctio(fider,Strig.class);System.out.pritl(userName);}






评论