Giter VIP home page Giter VIP logo

yangfuhai / jboot Goto Github PK

View Code? Open in Web Editor NEW
733.0 68.0 251.0 38.35 MB

一个优雅的微服务框架,SpringCloud 之外的另一个选择,已经使用在用户量过亿的商业产品上,有超过1000家公司在使用Jboot做极速开发...

Home Page: https://jboot.io

License: Apache License 2.0

Java 99.57% HTML 0.43%
jfinal undertow jboot motan grpc activemq rabbitmq redismq thrift metrics

jboot's Introduction

Jboot 是一个基于 JFinal、Dubbo、Seata、Sentinel、ShardingSphere、Nacos 等开发的国产框架。

其特点是:

  • 1、基于 JFinal 完整的 MVC + ORM 支持。
  • 2、支持多数据源、分库分表和分布式事务。
  • 3、支持 Dubbo RPC 的完整功能,有超过 1亿+ 用户产品正在使用。
  • 4、完整的单点限流和分布式限流功能
  • 5、支持基基于 Apollo 和 Nacos 的分布式配置中心
  • 6、完整的分布式缓存、分布式session、分布式附件支持
  • 7、内置功能强劲的门户网关
  • 8、完整的单元测试支持
  • 9、完善代码生成工具 和 API 文档生成工具
  • 10、Docker、K8S 友好

开始

maven 依赖

<dependency>
    <groupId>io.jboot</groupId>
    <artifactId>jboot</artifactId>
    <version>4.1.5</version>
</dependency>

Hello World

@RequestMapping("/")
public class Helloworld extends JbootController {

    public void index(){
        renderText("hello world");
    }

    public static void main(String[] args){
        JbootApplication.run(args);
    }
}

帮助文档

广告

微信交流群

JbootAdmin

JbootAdmin 是 Jboot 官方推出的、收费的、企业级快速开发框架,真诚的为各位开发者提供一站式、保姆式的开发服务。 关于 JbootAdmin 的更多的功能请咨询海哥(微信:wx198819880),或请访问以下网址:

http://jboot.io/jbootadmin/feature.html

jboot's People

Contributors

chenchi2038 avatar dependabot[bot] avatar einstein-github avatar flyinke avatar fournny avatar ggymzz avatar hapoy9 avatar icesk avatar jfinal avatar jlleitschuh avatar lsup avatar mx2913 avatar my-fastcms avatar ninemm avatar pkanyue avatar retireworker avatar ruibaby avatar somnuscy avatar whpat126 avatar xhf6731202 avatar xiaohuayi avatar xingcxb avatar xujianxie avatar xzx0617 avatar yangfuhai avatar zazcoder avatar zhangxn8 avatar zhoufengjob avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jboot's Issues

Axios跨域调用 预检使用OPTIONS报错

<dependency>
	<groupId>io.jboot</groupId>
	<artifactId>jboot</artifactId>
	<version>2.0-rc.13</version>
</dependency>

CORSInterceptor Line50

String method = inv.getController().getRequest().getMethod();
 if (METHOD_OPTIONS.equals(method)) {
        inv.getController().renderText("");
        return;
}
doProcessCORS(inv, enableCORS);

支持mqtt吗?

现在很多场景都需要mqtt服务,jboot有没有打算支持mqtt呢?

jboot代码生成器优化建议

jboot为Jfinal对数据库操作做了增强和扩展。通常我们习惯把业务层定义为service,代码生成工具JbootServiceInterfaceGenerator,JbootServiceImplGenerator要能为生成的名类自定义后缀就好啦。

httpPost 方法的参数如果是多层的对象有bug

httpPost 方法的参数如果是json对象,有可能是多层的,那么我看了jboot内部只处理了一层这样参数就出问题了,希望可以提供以字符串为参数,实际上application/json头,后端比如PHP接收到的就是对象

升级到3.1.x之后,Dubbo配置无效

之前是基于jboot.properties中配置Dubbo引用Provider,例如

MongoDB的服务的配置:

group:application.provider.mongodb.group = mongodbApplication
version: application.provider.mongodb.version = 1
在Mall项目中引入MongoDB的Provider
@RPCInject(group = "${application.provider.mongodb.group}", version = "${application.provider.mongodb.version}")
public com.mars.core.provider.EmailServiceProvider emailServiceProvider ;

RPC 相关配置
jboot.rpc.type=dubbo
jboot.rpc.registryType=zookeeper
jboot.rpc.registryAddress=172.17.0.4:2181
jboot.rpc.registryCheck=true
jboot.rpc.requestTimeOut=15000
jboot.rpc.retries=0

错误信息
[ERROR]-[Thread: main]-[io.jboot.aop.JbootAopFactory.doInjectRPC()]: can not inject rpc service in class com.mars.core.provider.email.EmailServiceProvider$$EnhancerByCGLIB$$7e3bd1d6 by config @io.jboot.components.rpc.annotation.RPCInject(registry=[], module=, loadbalance=random, monitor=, check=true, version=${application.version}, actives=0, generic=false, url=, timeout=0, retries=2, async=false, protocol=, application=, id=, tag=, consumer=, group=${application.name})
java.lang.IllegalStateException: Failed to check the status of the service com.mars.api.rpc.core.config.ISysConfigServiceProvider. No provider available for the service play-core-provider-dev/com.mars.api.rpc.core.config.ISysConfigServiceProvider:1 from the url zookeeper://172.16.20.214:2181/org.apache.dubbo.registry.RegistryService?application=tooth_beautiful&application.version=1&dubbo=2.0.2&group=play-core-provider-dev&interface=com.mars.api.rpc.core.config.ISysConfigServiceProvider&methods=findByConfigName,selectConfigListByConfigName,findByConfigNameAndConfigKey,findConfigValueToIntByConfigKey,saveOrUpdateSysConfig,findByConfigKey,findConfigValueByKey,selectByConfigName&pid=8620&qos.enable=false&register.ip=172.16.10.241&release=2.7.5&revision=1&side=consumer&sticky=false&timestamp=1597477784303&version=1 to the consumer 172.16.10.241 use dubbo version 2.7.5
at org.apache.dubbo.config.ReferenceConfig.createProxy(ReferenceConfig.java:355)
at org.apache.dubbo.config.ReferenceConfig.init(ReferenceConfig.java:266)
at org.apache.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:151)
at io.jboot.components.rpc.dubbo.JbootDubborpc.onServiceCreate(JbootDubborpc.java:61)
at io.jboot.components.rpc.JbootrpcBase.serviceObtain(JbootrpcBase.java:45)
at io.jboot.aop.JbootAopFactory.doInjectRPC(JbootAopFactory.java:194)
at io.jboot.aop.JbootAopFactory.doInject(JbootAopFactory.java:126)
at com.jfinal.aop.AopFactory.doGetSingleton(AopFactory.java:93)
at com.jfinal.aop.AopFactory.doGet(AopFactory.java:65)
at com.jfinal.aop.AopFactory.get(AopFactory.java:48)
at com.jfinal.aop.Aop.get(Aop.java:101)
at io.jboot.components.rpc.JbootrpcManager.exportRPCBean(JbootrpcManager.java:114)
at io.jboot.components.rpc.JbootrpcManager.init(JbootrpcManager.java:75)
at io.jboot.core.JbootCoreConfig.onStart(JbootCoreConfig.java:284)
at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:72)
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:111)
at io.undertow.servlet.core.ManagedFilter.createFilter(ManagedFilter.java:80)
at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:591)
at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:556)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:598)
at com.jfinal.server.undertow.UndertowServer.configHttp(UndertowServer.java:288)
at com.jfinal.server.undertow.UndertowServer.doStart(UndertowServer.java:266)
at com.jfinal.server.undertow.UndertowServer.start(UndertowServer.java:159)
at io.jboot.app.JbootApplication.start(JbootApplication.java:42)
at io.jboot.app.JbootApplication.run(JbootApplication.java:34)
at com.mars.core.provider.CoreProviderApplication.main(CoreProviderApplication.java:8)

Jedis插件不支持IPV6地址

io.jboot.support.redis.jedis.JbootJedisImpl第53-55行根据host进行了地址切割,如果是ipv6的地址,就会出现错误。

文档完善!

你好,能不能将安全控制 使用方式 文档等完善,方便开发使用,这样能更好的使用jboot,谢谢开源;

JbootHttpSessionWapper的问题

海哥你好,最近在研究jboot的共享session的实现,发现了以下两个问题:
1.类名中Wapper是不是应改为Wrapper,包装意思?

2.该类的getOrCreatSessionId方法第一行代码String sessionid = ("JSESSIONID");,想请教这是什么意思,这里是不是应该改为从cookie中取值String sessionid = getCookie("JSESSIONID");,要不然所有的sessionid不就“JSESSIONID"?

请更新 Dubbo 坐标

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>dubbo</artifactId>
  <version>2.6.7</version>
</dependency>

<dependency>
  <groupId>org.apache.dubbo</groupId>
  <artifactId>dubbo</artifactId>
  <version>2.7.4.1</version>
</dependency>

数据源跟表的映射问题

在初始化initConfigMappingTables的时候,把所有模块的实体表都放到当前模块的数据源的datasourceConfig里,结果在启动ActiveRecordPlugin的时候当前数据源肯定没有其他模块的表呀。
问题点就在ClassScanner.scanSubClass(Model.class)获取当前模块和依赖的其他模块所有model的子类,然后当前模块都配置了具有哪些表,还加到dataSourceConfig的tableinfo里去,所以
if(configTables != null && configTables.contains(tableInfo.getTableName))){
dataSourceConfig.addTableInfo(tableInfo,true);
continue;
}

dubbo的反序列化漏洞

Apache公布了Dubbo Hession的反序列化漏洞
影响范围:
Apache Dubbo 2.7.x版本:<= 2.7.17
Apache Dubbo 3.0.x版本:<= 3.0.11
Apache Dubbo 3.1.x版本:<= 3.1.0

目前该漏洞已经修复,受影响用户可以升级到Dubbo hessian-lite 版本 >=3.2.13;或升级Apache Dubbo到以下版本:
Apache Dubbo 2.7.x版本:>= 2.7.18
Apache Dubbo 3.0.x版本:>= 3.0.12
Apache Dubbo 3.1.x版本:>= 3.1.1

我查看了最新的1.16.5的pom文件,文件中引用的dubbo版本是2.7.15,能不能升级一下dubbo的依赖解决这个漏洞

限流特性不能正常使用

jboot版本1.4.4
场景一:
1、已配置 jboot.limitation.webPath = /jboot/limitation
2、Action上加@EnableConcurrencyLimit (rate = 2)注解
3、访问/jboot/limitation 返回数据:{"ipRates":{},"userRates":{},"concurrencyRates":{},"requestRates":{}}
4、并发访问action 没有限流效果

场景二:
1、通过/jboot/limitation/set 设置action限流
2、访问 /jboot/limitation 返回数据: {"ipRates":{},"userRates":{},"concurrencyRates":{"/user":{"enable":true,"rate":2.0,"type":"concurrency"}},"requestRates":{}}
3、并发访问action 有限流效果

xxl-job-executor-sample-jboot如何设置jboot参数

public class JbootApp {
public static void main(String[] args) {
//mysql
JbootApplication.setBootArg("jboot.datasource.type", Jboot.configValue("jboot.datasource.type"));
JbootApplication.setBootArg("jboot.datasource.url", Jboot.configValue("jboot.datasource.url"));
....
JbootApplication.run(args);
}
}

执行时出现以下错误:
Exception in thread "main" java.lang.NullPointerException
at io.jboot.app.config.JbootConfigManager.setBootArg(JbootConfigManager.java:351)
at io.jboot.app.JbootApplication.setBootArg(JbootApplication.java:164)
at com.adsage.jobs.JbootApp.main(JbootApp.java:12)

mq 空指针bug

JbootmqBase.java 的构造方法:

public JbootmqBase() {
        String channelString = config.getChannel();
        if (StringUtils.isBlank(channelString)) {
            return;
        }

        this.channels.addAll(StringUtils.splitToSet(channelString, ","));
        this.syncRecevieMessageChannels.addAll(StringUtils.splitToSet(config.getSyncRecevieMessageChannel(), ","));
    }

当只配置了 jboot.mq.channel ,但没有配置 jboot.mq.syncRecevieMessageChannel 时
StringUtils.splitToSet(config.getSyncRecevieMessageChannel() 这一行报空指针

id只能用uuid?不能自增长?

我看了一下源码。发现jboot重写了save方法,然后有做判断id为空时候设置id为uuid。。。是不是只能用uuid做主键了。。。

新增完整执行时间统计的建议

sql输出执行时间是个很不错的功能,弥补性能调优中代码中执行SQL代码段大量存在计算耗时的代码,非常实现。
在web性能调优中,大致需求如下:
1,输出整个页面从用户进入到页面输出的总时间;
2,在Jfinal的应用中,我们还会经常使用Directive自定义指令,还需要知道每个Directive输出耗时,便于知道耗时在哪
3,部分Render也会定义一些function,比如#define paginate,虽然一般耗时短,但也想明明白白知道耗时。
目前我的简单思路是:
1,写一个Handler,把优先级调到最高,这样所有的请求都包含在里面,
Stopwatch watch = Stopwatch.createStarted();
next.handle(target, request, response, isHandled);
long time = watch.elapsed(TimeUnit.MILLISECONDS);
logger.error("spendTime:{},{}", time, target);
2,在JbootDirectiveBase中
@OverRide
public void exec(Env env, Scope scope, Writer writer) {
Stopwatch watch = Stopwatch.createStarted();
scope = new Scope(scope);
scope.getCtrl().setLocalAssignment();
exprList.eval(scope);
onRender(env, scope, writer);
long time = watch.elapsed(TimeUnit.MILLISECONDS);
//需要反射获取子类的@JFinalDirective名称和类名
//logger.error("spendTime:{},{}", time, target);
}
3,写一个public class TimeRender extends TemplateRender
@OverRide
public void render() {
Stopwatch watch = Stopwatch.createStarted();
super.render();
long time = watch.elapsed(TimeUnit.MILLISECONDS);
logger.error("spendTime:{},{}", time, this.getView());
}
海哥看看能否增加.

关于JbootGatewayConfig 方法添加支持需求

JbootGatewayConfig 中,拦截器执行顺序属性,private private GatewayInterceptor[] inters 需添加一个public void setInters(private GatewayInterceptor[] inters)方法,以便于动态调整拦截器的执行顺序与动态的增加与删除拦截器

在jdk9下通过maven构建失败

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project jboot: Compilation failure [ERROR] /Users/leonis/git/jboot/src/main/java/io/jboot/aop/JbootInjectManager.java:[47,44] 对Module的引用不明确 [ERROR] com.google.inject 中的接口 com.google.inject.Module 和 java.lang 中的类 java.lang.Module 都匹配
错误如上
mvn -U clean package install -DskipTests

JbootHttpSessionWapper的问题(续)

海哥你好,基于改过后的代码写了个小测试,代码如下:
public void sessionTest(){
HttpSession session = getSession();
Ret ret = Ret.create("sessionid",session.getId());
if(getSessionAttr("data")!=null){
ret.set("data", getSessionAttr("data"));
}else{
long data = System.currentTimeMillis();
setSessionAttr("data", data);
System.out.println(getSessionAttr("data").toString());
ret.set("data", data);
}
renderJson(ret);
}
用FF隐私浏览窗口首次访问时会在第9行抛出空指针异常。
跟踪进去发现,在首次访问时,凡是用到session.getId()setSessionAttrgetSessionAttr这几个方法的时候,都会访问JbootHttpSessionWapper的getOrCreatSessionId方法,但是又都得不到JSESSIONID值,导致都会重新生成一次sessionid。
这个问题麻烦确认一下。

如何不启动HTTP服务器的情况下使用数据库?

如果不用Jboot.run(args);的话, 调用数据库的Service实例的时候会报错NullPointer.
image
这里的DbKit.getConfig(HoUserSettings.class)返回了null.

每行暂停Debug了一下发现执行到
initUndertowServer:107, UnderTowServer (io.jboot.server.undertow)
这里的时候才不会返回null, 但是这样HTTP服务器已经启动了...

initUndertowServer:107, UnderTowServer (io.jboot.server.undertow)
start:192, UnderTowServer (io.jboot.server.undertow)
startServer:167, Jboot (io.jboot)
start:148, Jboot (io.jboot)
run:91, Jboot (io.jboot)
...

我的应用不需要HTTP服务器, 但是觉得这个数据库管理超级好用!
但是如果为了数据库管理启动一个多余的HTTP服务器的话好浪费性能的w..
可能在不启动HTTP服务器的情况下使用数据库嘛?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.