当前位置: 首页 > 软件库 > Web应用开发 > Web框架 >

springrain

云原生微服务实现
授权协议 Apache
开发语言 Java
所属分类 Web应用开发、 Web框架
软件类型 开源软件
地区 国产
投 递 者 尉迟俊能
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

说明

  • springrain是spring/springboot的开发范例.基于K8S + Istio 实现云原生微服务.
  • springrain自带代码生成器,能够生成对表的增删改查的逻辑代码.
  • springrain是标准Maven项目,只依赖springboot,没有hibernate,struts,ibatis,数据库调优可以使用druid输出慢sql,比分析xml中的语句更直观,springrain所有的sql语句都使用Finder封装管理,只要查看Finder的引用即可.

实现了什么?

  • 不增加学习成本,像单体一样开发分布式微服务.
  • 不修改业务代码,可以实现单体,分层,微服务多种部署模式切换.
  • 集成seata分布式事务实现.
  • 子项目module的前后端可以独立运行,也可以被无感知集成,实现前后端按需打包.

实现思路

  • 启动加载springbean时,先检查本地是否有实现,如果没有就启动GRPC远程调用.开发人员无感知.
  • 基于seata分布式事务实现.支持有注解和无注解(开发人员无感知,理论上有不同步风险,个人感觉做好日志,风险不大)混合使用.
  • 基于K8S的Service实现服务注册和发现,ConfigMap实现配置中心.开发人员无感知.
  • 基于Istio实现微服务的发现,监控,熔断,限流.开发人员无感知.

架构设计详细思路:https://www.jiagou.com/post/58-cloud-native-service-mesh

限制

  • 接口和实现的命名强制规范.
  • 一个RPC接口只能有一个实现.
  • 分布式事务,一定要避免A服务update表t,RPC调用B服务,B服务也update表t.这样A等待B结果,B等待A释放锁,造成死锁.
  • 分布式无注解比较方便,理论上有不同步风险,个人感觉做好日志,风险不大
  • Service层不可以使用Servlet API,例如 HttpRequest
  • 建议每个前后端module/子项目,都有各自的前缀,方便nginx根据路径解析
  • 如果module依赖包的特定版本(例如netty,Grpc)和根项目版本冲突,module不能无感知集成,暂时只能独立运行

体验单体到分层切换

  • 修改springrain-system-web依赖springrain-system-service,不再依赖springrain-system-serviceimpl.
  •  
  • springrain-system-serviceimpl添加springrain-grpc-server依赖,启用org.springrain.SystemServiceImplApplication的@SpringBootApplication注解

  • 启动seata-server服务端.seata客户端的配置在项目的resources/file.conf里,默认配置是 default.grouplist = "127.0.0.1:8091"
  • 启动springrain-system-serviceimpl
  • 启动springrain-system-web
  • 访问http://127.0.0.1:8080/system/api/checkHealth

文档

https://gitee.com/chunanyong/springrain/tree/master/springrain-system/springrain-system-web/doc

代码生成器

https://gitee.com/chunanyong/springrain/tree/master/springrain-gencode

sql脚本

https://gitee.com/chunanyong/springrain/tree/master/springrain-system/springrain-system-web/sql

测试用例

//就极简而言,一个数据库只需要一个Service,就可以管理这个数据库的任意一张表 
//@Test  查询基本类型
public void testObject() throws Exception{
       // Finder finder=new Finder("select id from t_user where 1=1 ");
        Finder finder=Finder.getSelectFinder(User.class,"id").append(" WHERE 1=1 "); 
         finder.append("and id=:userId").setParam("userId", "admin");
        String id = baseDemoService.queryForObject(finder, String.class);
        System.out.println(id);

}

//@Test 查询一个对象
public void testObjectUser() throws Exception{
        //Finder finder=new Finder("select * from t_user where id=:userId order by id"); 
Finder finder=Finder.getSelectFinder(User.class).append(" WHERE  id=:userId order by id desc "); 
        finder.setParam("userId", "admin");
        User u = baseDemoService.queryForObject(finder, User.class);
        System.out.println(u.getName());

}
//@Test 查询分页
public void testMsSql() throws Exception{
        //Finder finder=new Finder("select * from t_user order by id");
        Finder finder=Finder.getSelectFinder(User.class).append(" order by id desc ");
        Listlist = baseDemoService.queryForList(finder, User.class, new Page(2));
        System.out.println(list.size());
        for(User s:list){
         System.out.println(s.getName());
         }
}



//@Test 调用数据库存储过程
public void testProc() throws Exception{
        Finder finder=new Finder();
        finder.setParam("unitId", 0);
        finder.setProcName("proc_up");
        Map queryObjectByProc = (Map) baseDemoService.queryObjectByProc(finder);
        System.out.println(queryObjectByProc.get("#update-count-10"));
        

}

//@Test 调用数据库函数
public void testFunction() throws Exception{
        Finder finder=new Finder();
        finder.setFunName("fun_userId");
        finder.setParam("userId", "admin");
        String userName= baseDemoService.queryForObjectByByFunction(finder,String.class);
        System.out.println(userName);
}
  • #4.0.0之后基于SpringBoot最新版本,启动类修改为SpringBoot的org.springrain.SpringrainApplication类进行启动. 项目名为springrain[春雨]我的个人博客是 http://www.weicms.net QQ群是:238904840 文档 代码生成器 sql脚本 springrain是spring/springboot的极简封装,spr

  • 项目名为springrain[春雨]我的个人博客是 http://www.9iu.org #demo http://springrain.9iu.org #文档 http://git.oschina.net/chunanyong/springrain/raw/master/springrain/doc/springrain.pdf #代码生成器 http://git.oschina.net/chu

  • 项目迁移到: http://git.oschina.net/chunanyong/springrain demo: http://springrain.9iu.org 文档 http://git.oschina.net/chunanyong/springrain/raw/master/springrain/doc/springrain.pdf springrain本身就是一个完整的eclipse项

  • 经过2个月的测试修改,springrain1.1已经稳定,今日发布. 主要改动如下: 1.添加批量更新和保存的方法 2.添加maven分支 3.添加博客管理的demo 4.增加redis做为缓存实现 5.修改页面和代码生成器模版细节. 转载于:https://www.cnblogs.com/shihao/p/3384336.html

  • http://www.9iu.org/2013/12/11/springrain2-basetable.html springrain开源项目 springrain技术详解(1)-shiro基本权限控制 springrain技术详解(2)-权限表结构 springrain技术详解(3)-shiro的filterChainDefinitions springrain技术详解(4)-shiro的缓存

  • // testzorm 使用原生的sql语句,没有对sql语法做限制.语句使用Finder作为载体 // 占位符统一使用?,zorm会根据数据库类型,自动替换占位符,例如postgresql数据库把?替换成$1,$2... // zorm使用 ctx context.Context 参数实现事务传播,ctx从web层传递进来即可,例如gin的c.Request.Context() // zorm的

  • 因为是权限拦截校验,很多方法调用的频率是非常频繁的,为了更好的性能,shiro拥有一套完整的缓存体系,特别是针对web领域,做了部分增强. 先看下缓存在shiro的权限管理器中的配置: 01 <!-- 权限管理器 --> 02 <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

  • http://git.oschina.net/chunanyong/springrain 转载于:https://www.cnblogs.com/woodynd/p/4034151.html

 相关资料
  • 最近刚刚接触微服务相关的知识,想问一下微服务与golang推崇的云原生有什么异同,能否从宏观上对微服务与云原生概念进行一个区分?

  • 本教程是一个关于Python微服务的实战教程,根据测试驱动开发(TDD)的指导思想,开发容器化的Python微服务应用,涉及 TDD、Flask、React、Docker、微服务 等知识点。 在这个课程中,你将学习如何使用Docker快速创建开发环境、管理多个微服务,应用程序在本地运行后,您将学习怎样在生产环境部署应用。我们也会练习TDD(测试驱动开发),在你的项目中测试先行,我们重点将放在服务端

  • 如何将具有approle[in vault]的微服务连接到具有vault后端的Spring Cloud Config Server。 我可以看到使用根令牌的示例,如curl-x GET http://localhost:8888/my-service/default-h“x-config-token:s.tmqara2lasdnhjzqqzy7y8px”。但是我找不到任何使用approle连接sp

  • 基本 Nest 微服务是一种使用与HTTP不同的传输层的应用程序。 安装 首先,我们需要安装所需的软件包: $ npm i --save @nestjs/microservices 概述 通常,Nest支持一系列内置的传输器。它们基于 请求-响应 范式,整个通信逻辑隐藏在抽象层之后。多亏了这一点,您可以轻松地在传输器之间切换,而无需更改任何代码行。我们不支持具有基于日志的持久性的流平台,例如 Ka

  • 我使用spring boot Framework创建了一个REST微服务。 我还创建了一个Eureka服务器作为另一个Spring Boot项目。并且我向Eureka服务器注册了微服务。 和我为Zuul创建了另一个Spring启动项目。这个项目也注册到Eureka服务器。 我的Eureka服务器正在运行2个注册的Spring Boot项目。Eureka服务器UI正常工作。 这里我的困惑是,我是按照

  • 作为spring boot和microservices架构的新手,尝试使用spring boot cloud starter构建一个简单的应用程序。 我使用了来外部化配置文件(. Properties) 我这里有一个spring云配置,它带来了。来自git存储库和另一个微服务(产品微服务)的属性文件试图从spring云配置服务器访问其配置。 一切正常,除了属性抛出(在第二个微服务中) 以下是配置文