GithubHelp home page GithubHelp logo

dapeng-soa / dapeng-soa Goto Github PK

View Code? Open in Web Editor NEW
112.0 112.0 40.0 10.15 MB

A lightweight, high performance micro-service framework

Home Page: https://dapeng-soa.github.io

License: Apache License 2.0

Java 87.15% CSS 1.08% TypeScript 0.51% JavaScript 1.53% Scala 6.67% Shell 0.37% Thrift 2.64% HTML 0.01% Dockerfile 0.02% ANTLR 0.02%
async dapeng high-performance java metadata microservice netty rpc soa thrift

dapeng-soa's Introduction

dapeng-soa

Language Maven Central GitHub release DockerHub License

Dapeng-soa 是一个轻量级、高性能的微服务框架,构建在Netty以及定制的精简版Thrift之上。 同时,从Thrift IDL文件自动生成的服务元数据信息是本框架的一个重要特性,很多其它重要特性都依赖于服务元数据信息。 最后,作为一站式的微服务解决方案,Dapeng-soa还提供了一系列的脚手架工具以支持用户快速的搭建微服务系统,例如:

  • api网关(dapeng-mesh), 提供基于服务元数据以及流式处理的Json模块用于处理http-json请求跟Thrift协议之间的相互转换。
  • 在线文档以及测试站点(dapeng-api-doc),直接基于服务元数据生成,确保跟代码保持同步。
  • 命令行工具(dapeng-cli),提供命令行或者脚本的方式跟服务集群交互,可用于服务运行时状态监控、数据修复等。
  • 配置部署中心(dapeng-config-server),提供web-gui界面,用于服务配置管理以及服务部署管理。
  • maven/sbt插件 for IDEA, 用于在开发过程中快速启动服务容器
  • 项目模板(目前仅支持sbt:g8 template for sbt projects)
  • Demo(dapeng-demo)

Architecture

dapeng-soa

Features

  • 基于Netty 以及精简版的Thrift
  • 基于Thrift IDL的服务元数据
  • 服务注册以及服务自动发现
  • 支持Java/Scala客户端代码自动生成
  • 支持http-json跟Thrift二进制流的高效相互转换
  • 客户端以及服务端全链路同步/异步调用支持
  • 多维度智能服务路由以及负载均衡策略,可通过http cookie信息路由(Router)
  • 基于共享内存的服务端限流,支持多维度的限流,支持服务或者接口级别的限流(FreqControl)
  • 分布式服务调用日志跟踪

Next

Quick start

Documents

Faqs

dapeng-soa's People

Contributors

alwaysdead avatar barbazoo avatar cjl1001 avatar dependabot[bot] avatar devotedtangliu avatar emuugrass avatar huyongjie avatar jackliang18588733858 avatar jarek-li avatar jlleitschuh avatar leihuazhe avatar struggleyang avatar wangzaixiang avatar zhangever 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

dapeng-soa's Issues

thrift语法不兼容,当include 语句出现在第一行,会出现如下错误

/xm-project-api/src/main/resources/thrifts/project_domain.thrift success
java.io.FileNotFoundException: project_domain.scala.thrift
	at com.twitter.scrooge.frontend.ThriftParser.$anonfun$parseFileUncached$1(ThriftParser.scala:455)
	at scala.Option.getOrElse(Option.scala:121)
	at com.twitter.scrooge.frontend.ThriftParser.parseFileUncached(ThriftParser.scala:455)
	at com.twitter.scrooge.frontend.ThriftParser.parseFile(ThriftParser.scala:449)
	at com.twitter.scrooge.frontend.ThriftParser.$anonfun$include$5(ThriftParser.scala:398)
	at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:137)
	at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:136)
	at scala.util.parsing.combinator.Parsers$Parser.$anonfun$map$1(Parsers.scala:237)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
Error: project_domain.scala.thrift
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.180 s
	at scala.util.parsing.combinator.Parsers.$anonfun$positioned$1(Parsers.scala:865)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.RegexParsers$$anon$3.apply(RegexParsers.scala:135)
	at scala.util.parsing.combinator.Parsers$Parser.$anonfun$map$1(Parsers.scala:237)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.Parsers$Success.flatMapWithNext(Parsers.scala:143)
	at scala.util.parsing.combinator.Parsers$Parser.$anonfun$flatMap$1(Parsers.scala:234)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.Parsers$Parser.$anonfun$append$1(Parsers.scala:249)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.Parsers$Parser.$anonfun$append$1(Parsers.scala:249)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.Parsers.$anonfun$rep1$1(Parsers.scala:727)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.Parsers$Parser.$anonfun$append$1(Parsers.scala:249)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.Parsers$Parser.$anonfun$flatMap$1(Parsers.scala:234)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.Parsers$Parser.$anonfun$flatMap$1(Parsers.scala:234)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.Parsers$Parser.$anonfun$map$1(Parsers.scala:237)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.Parsers$Parser.$anonfun$flatMap$1(Parsers.scala:234)
	at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
	at scala.util.parsing.combinator.Parsers$$anon$2.$anonfun$apply$2(Parsers.scala:882)
	at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58)
	at scala.util.parsing.combinator.Parsers$$anon$2.apply(Parsers.scala:882)
	at scala.util.parsing.combinator.RegexParsers.parse(RegexParsers.scala:160)
	at scala.util.parsing.combinator.RegexParsers.parse$(RegexParsers.scala:159)
	at com.twitter.scrooge.frontend.ThriftParser.parse(ThriftParser.scala:26)
	at scala.util.parsing.combinator.RegexParsers.parseAll(RegexParsers.scala:176)
	at scala.util.parsing.combinator.RegexParsers.parseAll$(RegexParsers.scala:175)
	at com.twitter.scrooge.frontend.ThriftParser.parseAll(ThriftParser.scala:26)
	at com.twitter.scrooge.frontend.ThriftParser.parse(ThriftParser.scala:438)
	at com.github.dapeng.code.parser.ThriftCodeParser.generateDoc(ThriftCodeParser.scala:89)
	at com.github.dapeng.code.parser.ThriftCodeParser.$anonfun$toServices$1(ThriftCodeParser.scala:454)
	at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:32)
	at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:29)
	at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:191)
	at com.github.dapeng.code.parser.ThriftCodeParser.toServices(ThriftCodeParser.scala:453)
	at com.github.dapeng.code.Scrooge$.main(Scrooge.scala:141)
	at com.github.dapeng.code.Scrooge.main(Scrooge.scala)
	at com.github.dapeng.maven.plugin.GenerateFilePlugin.execute(GenerateFilePlugin.java:58)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:133)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:108)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:76)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:116)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:361)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:213)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:157)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
	at org.codehaus.classworlds.Launcher.main(Launcher.java:46)

Exception "Service not found" occurs at some condition

When a new service on line for the first time, if the client side starts up before service side registered, then the client side will get a "Service not found/服务xxx无可用实例" exception forever

Before this bug got fixed, clients have to restarted to work around this issue.

序例化导致数值错误

BUG位置

Double.parseDouble(new String(input.sliceCharArray(start, input.cursor())))

//com.github.dapeng.json.JsonParser.java
void number() throws TException {
        int start = input.cursor();

        ch('-');
        _int();
        frac();
        exp();
        callback.onNumber(Double.parseDouble(new String(input.sliceCharArray(start, input.cursor()))));
        ws();
    }

BUG说明

  • Double.parseDouble 会导致精度失真,故会导致数据错乱.
  • (long)Double.parseDouble("507219153393029100") = 507219153393029120
  • Long.valueOf("507219153393029100") = 507219153393029100

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.