Git Product home page Git Product logo

starlight's Introduction

GitHub license GitHub stars GitHub issues Codecov branch

GroupId ArtifactId Snapshot Version Stable Version
com.baidu.cloud starlight-all Sonatype Nexus (Snapshots) Maven Central
com.baidu.cloud spring-cloud-starter-baidu-starlight Sonatype Nexus (Snapshots) Maven Central

Starlight: Lightweight Java RPC Framework

Starlight 是一套面向云原生的微服务通信框架,兼容Spring生态,基于此可快速构建高效、稳定、可控、可观测的微服务应用,获得研发效率提升、业务稳定性增强等舒适体验。 核心特性如下:

  • 多种协议支持:Starlight单端口支持brpc、Spring MVC REST协议,提供超丰富的使用场景
  • 高性能远程通信:Starlight基于多路复用的NIO框架封装底层通信能力,提供高性能高并发网络通信能力
  • 易于使用:无需处理protobuf编译过程,通过原生Java接口和POJO对象加上类级别的注解,类似Java RMI和Spring MVC使用体验,即可实现brpc二进制协议的Server和Client;支持无损升级、异常实例摘除;规范化的日志可以秒级定位超时问题、序列化失败问题

详细使用和设计文档参见Github Wiki

JDK Requirements

minimum JDK 8

License

baidu/starlight is licensed under the Apache License 2.0

微信交流群

添加管理员olivaw2077帮忙加群,备注starlight

starlight's People

Contributors

actions-user avatar dependabot[bot] avatar loongs-zhang avatar reason94 avatar tullyliu 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

starlight's Issues

brpc耗时操作怎么使用?

在brpc-java-core-example中执行benchmark的test代码时,将om.baidu.brpc.example.standard.EchoServiceImpl中增加了一段Thread.sleep(100),同时,调大了RpcServerTest中workthreadnum到500,但用SyncBenchmarkTest执行时,qps不到200,用异步client的benchmark,就大量超时。
业务代码是在work threadpool中执行的,有500个线程,100ms的耗时,理论上应该qps在5000左右,为什么实际只有200?有谁可以帮解答下

brpc-java 等于0的字段和数组值不正确

C++ server是brpc的,比如现在server吐了两个字段,int kvalue = 0, repeated int list = [1,2]
对于 Java client 走grpc协议,能正确拿到 kvalue = 0, Listlist = [1,2]
对于 Java client 用brpc-java客户端,拿到的 kvalue = null, List list = []

弱弱问下是不是我使用方式不对,使用的方式和demo是一致的。
brpc-java版本 2.5.8
jprotobuf版本 2.2.8

server shutdown gracefully

server send to shutdown event to client when server shutdown, and client mark the instance for this channel to be unavailable on load balance.

Brpc创建bean失败

springboot 项目集成brpc,服务间调用,注入brpc接口;启动的时候经常会报bean创建失败,重启有可能解决该问题,但是比较困难

brpc 2.5.9版本

代码
@slf4j
@service
public class UserRemoteServiceImpl implements UserRemoteService {
@RpcProxy
InsideUserInfoApiService userInfoService;

}

错误日志:
2020-03-28 10:44:10,341 [main] [SpringApplication.java:842] [ERROR SpringApplication] - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRemoteServiceImpl': Autowiring of methods failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.xxxx.userservice.interfaces.InsideUserInfoApiService com.xxxx.course.service.remote.impl.UserRemoteServiceImpl.userInfoService; nested exception is java.lang.RuntimeException: Error creating bean with name 'InsideUserInfoApiService': Invocation of init method failed; nested exception is java.lang.ExceptionInInitializerError
at com.baidu.brpc.spring.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:233)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1350)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:580)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:503)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243)
at com.xxxx.course.Application.main(Application.java:26)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.xxxx.userservice.interfaces.InsideUserInfoApiService com.xxxx.course.service.remote.impl.UserRemoteServiceImpl.userInfoService; nested exception is java.lang.RuntimeException: Error creating bean with name 'InsideUserInfoApiService': Invocation of init method failed; nested exception is java.lang.ExceptionInInitializerError
at com.baidu.brpc.spring.annotation.CommonAnnotationBeanPostProcessor$AutowiredFieldElement.inject(CommonAnnotationBeanPostProcessor.java:351)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)
at com.baidu.brpc.spring.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:231)
... 17 common frames omitted
Caused by: java.lang.RuntimeException: Error creating bean with name 'InsideUserInfoApiService': Invocation of init method failed; nested exception is java.lang.ExceptionInInitializerError
at com.baidu.brpc.spring.boot.autoconfigure.SpringBootAnnotationResolver.annotationAtField(SpringBootAnnotationResolver.java:125)
at com.baidu.brpc.spring.annotation.CommonAnnotationBeanPostProcessor$AutowiredFieldElement.inject(CommonAnnotationBeanPostProcessor.java:345)
... 19 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'InsideUserInfoApiService': Invocation of init method failed; nested exception is java.lang.ExceptionInInitializerError
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1708)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:581)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:503)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204)
at com.baidu.brpc.spring.boot.autoconfigure.SpringBootAnnotationResolver.createRpcProxyFactoryBean(SpringBootAnnotationResolver.java:376)
at com.baidu.brpc.spring.boot.autoconfigure.SpringBootAnnotationResolver.parseRpcProxyAnnotation(SpringBootAnnotationResolver.java:316)
at com.baidu.brpc.spring.boot.autoconfigure.SpringBootAnnotationResolver.annotationAtField(SpringBootAnnotationResolver.java:123)
... 20 common frames omitted
Caused by: java.lang.ExceptionInInitializerError: null
at com.baidu.brpc.client.BrpcProxy.getProxy(BrpcProxy.java:143)
at com.baidu.brpc.spring.RpcProxyFactoryBean.afterPropertiesSet(RpcProxyFactoryBean.java:141)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1767)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1704)
... 29 common frames omitted
Caused by: java.lang.IllegalArgumentException: null
at org.objectweb.asm.ClassVisitor.(Unknown Source)
at net.sf.cglib.core.DebuggingClassWriter.(DebuggingClassWriter.java:49)
at net.sf.cglib.core.DefaultGeneratorStrategy.getClassVisitor(DefaultGeneratorStrategy.java:30)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)
at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:329)
at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93)
at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91)
at net.sf.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at net.sf.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61)
at net.sf.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)
at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291)
at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:221)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:174)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:153)
at net.sf.cglib.proxy.Enhancer.(Enhancer.java:73)
... 33 common frames omitted

Memory leak in HTTP protocols

When BrpcHttpObjectDecoder.decode() is called, a BrpcHttpObjectAggregator instance is created and used to aggregate tcp packets into complete HTTP messages. decode() returns null if there is not enough data in buffer, however BrpcHttpObjectAggregator retains ByteBuf even if there is not enough data to form a complete HTTP message.

This affects all HTTP protocol implementations using BrpcHttpObjectDecoder on both client and server sides.

what's the meaning of rpcFuture is null, server return to slow, logId=781080158

what's the meaning of rpcFuture is null, server return to slow, logId=781080158

does this mean the server return is too slow?

looks like this has something to do with the FastFutureStore. My understanding is the the client side clear the fastFutureStore. if the server return too slow , will cause no future can be found?

ServiceManager find service bug

image

When using the http json protocol, it doesn't work. Because the service provider's serviceMap key is the service's full path class name and method name, httpRequest only contains the service class name and method name, which causes RpcMethodInfo not found on the service provider side.

打包3.0.0报错

mvn clean install -DskipTests

[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.baidu:brpc-spring-boot-examples-server:jar:3.0.0
[WARNING] 'build.plugins.plugin.version' for org.springframework.boot:spring-boot-maven-plugin is missing. @ line 100, column 21
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.baidu:brpc-spring-boot-examples-client:jar:3.0.0
[WARNING] 'build.plugins.plugin.version' for org.springframework.boot:spring-boot-maven-plugin is missing. @ line 118, column 21
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.baidu:spring-cloud-brpc-examples-server:jar:3.0.0
[WARNING] 'build.plugins.plugin.version' for org.springframework.boot:spring-boot-maven-plugin is missing. @ line 112, column 21
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.baidu:spring-cloud-brpc-examples-client:jar:3.0.0
[WARNING] 'build.plugins.plugin.version' for org.springframework.boot:spring-boot-maven-plugin is missing. @ line 123, column 21
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] brpc-java-parent [pom]
[INFO] brpc-java-communication [jar]
[INFO] brpc-java [jar]
[INFO] brpc-java-naming-zookeeper [jar]
[INFO] brpc-java-naming-consul [jar]
[INFO] brpc-spring [jar]
[INFO] brpc-spring-boot-starter [jar]
[INFO] spring-cloud-brpc [jar]
[INFO] brpc-java-examples [pom]
[INFO] brpc-java-core-examples [jar]
[INFO] brpc-spring-boot-examples [pom]
[INFO] brpc-spring-boot-examples-api [jar]
[INFO] brpc-spring-boot-examples-server [jar]
[INFO] brpc-spring-boot-examples-client [jar]
[INFO] spring-cloud-brpc-examples [pom]
[INFO] spring-cloud-brpc-examples-api [jar]
[INFO] spring-cloud-brpc-examples-server [jar]
[INFO] spring-cloud-brpc-examples-client [jar]
[INFO]
[INFO] ---------------------< com.baidu:brpc-java-parent >---------------------
[INFO] Building brpc-java-parent 3.0.0 [1/18]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ brpc-java-parent ---
[INFO] Deleting /Users/yiz96/dev/brpc-java/target
[INFO]
[INFO] --- maven-enforcer-plugin:1.0:enforce (enforce-maven) @ brpc-java-parent ---
[INFO]
[INFO] --- protoc-jar-maven-plugin:3.11.1:run (generate-sources) @ brpc-java-parent ---
[INFO] Skipping 'pom' packaged project
[INFO]
[INFO] --- jprotobuf-precompile-plugin:1.2.15:precompile (default) @ brpc-java-parent ---
[WARNING]
java.lang.reflect.InvocationTargetException
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:567)
at com.baidu.jprotobuf.mojo.PreCompileMojo$1.run (PreCompileMojo.java:321)
at java.lang.Thread.run (Thread.java:830)
Caused by: jodd.io.findfile.FindFileException: Scan entry error: EntryData{com.baidu.bjf.remoting.protobuf.descriptor.DescriptorProtoPOJO'}; <--- java.lang.IllegalStateException: Compilation failed. class: com.baidu.bjf.remoting.protobuf.descriptor.DescriptorProtoPOJO$$JProtoBufClass, diagnostics: [错误: 不再支持源选项 6。请使用 7 或更高版本。, 错误: 不再支持目标选项 6。请使用 7 或更高版本。]
at jodd.io.findfile.ClassFinder.scanEntry (ClassFinder.java:377)
at jodd.io.findfile.ClassFinder.scanJarFile (ClassFinder.java:268)
at jodd.io.findfile.ClassFinder.scanPath (ClassFinder.java:237)
at jodd.io.findfile.ClassFinder.scanPaths (ClassFinder.java:178)
at jodd.io.findfile.ClassScanner.scan (ClassScanner.java:35)
at jodd.io.findfile.ClassScanner.scanDefaultClasspath (ClassScanner.java:28)
at com.baidu.jprotobuf.mojo.JprotobufPreCompileMain.main (JprotobufPreCompileMain.java:121)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:567)
at com.baidu.jprotobuf.mojo.PreCompileMojo$1.run (PreCompileMojo.java:321)
at java.lang.Thread.run (Thread.java:830)
Caused by: java.lang.Exception: Compilation failed. class: com.baidu.bjf.remoting.protobuf.descriptor.DescriptorProtoPOJO$$JProtoBufClass, diagnostics: [错误: 不再支持源选项 6。请使用 7 或更高版本。, 错误: 不再支持目标选项 6。请使用 7 或更高版本。]
at com.baidu.jprotobuf.mojo.JprotobufPreCompileMain$1.onEntry (JprotobufPreCompileMain.java:116)
at jodd.io.findfile.ClassFinder.scanEntry (ClassFinder.java:375)
at jodd.io.findfile.ClassFinder.scanJarFile (ClassFinder.java:268)
at jodd.io.findfile.ClassFinder.scanPath (ClassFinder.java:237)
at jodd.io.findfile.ClassFinder.scanPaths (ClassFinder.java:178)
at jodd.io.findfile.ClassScanner.scan (ClassScanner.java:35)
at jodd.io.findfile.ClassScanner.scanDefaultClasspath (ClassScanner.java:28)
at com.baidu.jprotobuf.mojo.JprotobufPreCompileMain.main (JprotobufPreCompileMain.java:121)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:567)
at com.baidu.jprotobuf.mojo.PreCompileMojo$1.run (PreCompileMojo.java:321)
at java.lang.Thread.run (Thread.java:830)
Caused by: java.lang.IllegalStateException: Compilation failed. class: com.baidu.bjf.remoting.protobuf.descriptor.DescriptorProtoPOJO$$JProtoBufClass, diagnostics: [错误: 不再支持源选项 6。请使用 7 或更高版本。, 错误: 不再支持目标选项 6。请使用 7 或更高版本。]
at com.baidu.bjf.remoting.protobuf.utils.compiler.JdkCompiler.doCompile (JdkCompiler.java:174)
at com.baidu.bjf.remoting.protobuf.utils.compiler.AbstractCompiler.compile (AbstractCompiler.java:43)
at com.baidu.bjf.remoting.protobuf.ProtobufProxy.doCreate (ProtobufProxy.java:392)
at com.baidu.bjf.remoting.protobuf.ProtobufProxy.create (ProtobufProxy.java:274)
at com.baidu.bjf.remoting.protobuf.ProtobufProxy.create (ProtobufProxy.java:255)
at com.baidu.jprotobuf.mojo.JprotobufPreCompileMain$1.onEntry (JprotobufPreCompileMain.java:110)
at jodd.io.findfile.ClassFinder.scanEntry (ClassFinder.java:375)
at jodd.io.findfile.ClassFinder.scanJarFile (ClassFinder.java:268)
at jodd.io.findfile.ClassFinder.scanPath (ClassFinder.java:237)
at jodd.io.findfile.ClassFinder.scanPaths (ClassFinder.java:178)
at jodd.io.findfile.ClassScanner.scan (ClassScanner.java:35)
at jodd.io.findfile.ClassScanner.scanDefaultClasspath (ClassScanner.java:28)
at com.baidu.jprotobuf.mojo.JprotobufPreCompileMain.main (JprotobufPreCompileMain.java:121)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:567)
at com.baidu.jprotobuf.mojo.PreCompileMojo$1.run (PreCompileMojo.java:321)
at java.lang.Thread.run (Thread.java:830)
[INFO] JProtobuf pre compile done time took: 278ms
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for brpc-java-parent 3.0.0:
[INFO]
[INFO] brpc-java-parent ................................... FAILURE [ 0.625 s]
[INFO] brpc-java-communication ............................ SKIPPED
[INFO] brpc-java .......................................... SKIPPED
[INFO] brpc-java-naming-zookeeper ......................... SKIPPED
[INFO] brpc-java-naming-consul ............................ SKIPPED
[INFO] brpc-spring ........................................ SKIPPED
[INFO] brpc-spring-boot-starter ........................... SKIPPED
[INFO] spring-cloud-brpc .................................. SKIPPED
[INFO] brpc-java-examples ................................. SKIPPED
[INFO] brpc-java-core-examples ............................ SKIPPED
[INFO] brpc-spring-boot-examples .......................... SKIPPED
[INFO] brpc-spring-boot-examples-api ...................... SKIPPED
[INFO] brpc-spring-boot-examples-server ................... SKIPPED
[INFO] brpc-spring-boot-examples-client ................... SKIPPED
[INFO] spring-cloud-brpc-examples ......................... SKIPPED
[INFO] spring-cloud-brpc-examples-api ..................... SKIPPED
[INFO] spring-cloud-brpc-examples-server .................. SKIPPED
[INFO] spring-cloud-brpc-examples-client .................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.875 s
[INFO] Finished at: 2020-04-17T15:14:49+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.baidu:jprotobuf-precompile-plugin:1.2.15:precompile (default) on project brpc-java-parent: An exception occured while executing the Java class. null: InvocationTargetException: Scan entry error: EntryData{com.baidu.bjf.remoting.protobuf.descriptor.DescriptorProtoPOJO'}; <--- java.lang.IllegalStateException: Compilation failed. class: com.baidu.bjf.remoting.protobuf.descriptor.DescriptorProtoPOJO$$JProtoBufClass, diagnostics: [错误: 不再支持源选项 6。请使用误: 不再支持目标选项 6。请使用 7 或更高版本。] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

rpc client could work inproperly in multi thread condition

loadAllExtensions function in the ExtensionLoaderManager might cause problem. e.g.
ThreadA, is loadAllExtensions and loadProtocol , to generate the protocolMap.
But ThreadB, might skip it and execute getProtocol, which will use a empty may and throw exception.

no available instance

与spring集成时,调用的是c++的服务;注册中心是consul
application.yml:
brpc:
global:
naming:
namingServiceUrl: consul://172.xx.xx.xx:8500
ignoreFailOfNamingService: false
client:
maxTryTimes: 3
workThreadNum: 1
ioThreadNum: 1

api接口:
public interface WeixinService {
@BrpcMeta(serviceName = "service.comm.project.weixin.WeixinService", methodName = "getOpenid")
OpenidResponse getOpenid(OpenidRequest request);
}

proto文件:

syntax = "proto3";

package service.comm.project.weixin;

option cc_generic_services = true;
option java_generic_services = true;
option py_generic_services = true;
message openidRequest {
    string appid = 1;
}
message openidResponse {
    int32 retcode = 1;
}
service WeixinService {
    rpc getOpenid(openidRequest) returns (openidResponse);
};

consul:
image

其他的配置没有了,写法参考的是brpc-spring-boot-examples-client,基本一样的结构。

报错:
image

channel pool 发送数据的问题

我初略看了一下你们这个源码。发现你们是从channel pool中获取一个channel,然后注册一个定时器timeout,然后做序列化,然后同步阻塞发送数据直到数据发送出去,然后回收连接。
我觉得可以换一个过程,可以省掉连接池,和定时器,不知道是否会对性能有提升。
先序列化 -> 在获取channel -> 发送数据(不需要等待数据发送出去,把数据交给netty排队)->设置定时器(使用socketChannel.eventLoop()的定时功能,把定时操作放在selector上)。
首先我觉得这个过程可以减少对每次发送对channel的占用时间,使用更少的channel就可以有相同的并发量,然后省掉了定时器线程

运行异常

把例子下载下来运行不了,brpc-spring-boot-examples-server maven打包是可以成功,运行的时候一直提示

ERROR org.springframework.boot.SpringApplication - Application run failed java.lang.ExceptionInInitializerError: null at com.baidu.bjf.remoting.protobuf.ProtobufProxy.doCreate(ProtobufProxy.java:354) at com.baidu.bjf.remoting.protobuf.ProtobufProxy.create(ProtobufProxy.java:253) at com.baidu.bjf.remoting.protobuf.ProtobufProxy.create(ProtobufProxy.java:175) at com.baidu.brpc.JprotobufRpcMethodInfo.(JprotobufRpcMethodInfo.java:42) at com.baidu.brpc.server.ServiceManager.registerService(ServiceManager.java:113) at com.baidu.brpc.server.ServiceManager.registerService(ServiceManager.java:76) at com.baidu.brpc.server.RpcServer.registerService(RpcServer.java:304) at com.baidu.brpc.spring.RpcServiceExporter.afterPropertiesSet(RpcServiceExporter.java:102) at com.baidu.brpc.spring.boot.autoconfigure.SpringBootAnnotationResolver.annotationAtTypeAfterStarted(SpringBootAnnotationResolver.java:168) at com.baidu.brpc.spring.annotation.CommonAnnotationBeanPostProcessor.onApplicationEvent(CommonAnnotationBeanPostProcessor.java:473) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359) at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:896) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) at com.baidu.brpc.example.springboot.server.RpcServerTest.main(RpcServerTest.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) Caused by: java.lang.RuntimeException: compiler is null maybe you are on JRE enviroment please change to JDK enviroment. at com.baidu.bjf.remoting.protobuf.utils.compiler.JdkCompiler.(JdkCompiler.java:107) at com.baidu.bjf.remoting.protobuf.utils.compiler.JdkCompiler.(JdkCompiler.java:89) at com.baidu.bjf.remoting.protobuf.utils.JDKCompilerHelper.(JDKCompilerHelper.java:30) ... 29 common frames omitted

打包完成后都运行不了 windows 或者centos都一样 参照各种答案仍然不能运行 现有pom文件如下


4.0.0

<parent>
    <groupId>com.baidu</groupId>
    <artifactId>brpc-spring-boot-examples</artifactId>
    <version>2.5.4</version>
</parent>

<artifactId>brpc-spring-boot-examples-server</artifactId>
<packaging>jar</packaging>

<name>${project.artifactId}</name>
<url>http://maven.apache.org</url>
<description>Java implementation for BRPC</description>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jdk.version>1.8</jdk.version>
</properties>

<dependencyManagement>

    <dependencies>
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
org.projectlombok lombok 1.18.8 provided
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.4.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>com.baidu</groupId>
        <artifactId>brpc-spring-boot-examples-api</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>com.baidu</groupId>
        <artifactId>brpc-spring-boot-starter</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>com.baidu</groupId>
        <artifactId>brpc-java-naming-zookeeper</artifactId>
    </dependency>
    <dependency>
        <groupId>jdk.tools</groupId>
        <artifactId>jdk.tools</artifactId>
        <version>1.8</version>
        <scope>system</scope>
        <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
	 </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>

com.baidu
jprotobuf

<build>
    <finalName>${project.name}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.1.8.RELEASE</version>
            <configuration>
                <mainClass>com.baidu.brpc.example.springboot.server.RpcServerTest</mainClass>
                <fork>true</fork>
    			<executable>D:\Program Files\Java\jdk1.8.0_20\bin\javac.exe</executable>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

POJO类中boolean类型的变量建议不要以isXXX命名

参考阿里巴巴Java手册:

POJO 类中布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。 反例:定义为基本数据类型boolean isSuccess;的属性,它的方法也是isSuccess(),RPC 框架在反向解析的时候,“以为”对应的属性名称是 success,导致属性获取不到,进而抛出异常。

虽然下面的这些Case并不需要序列化,但其属性命名存在一定的不规范,如: fromRpcContext与isFromRpcContext属性,使用lombok生成的method,均为isFromRpcContext(), 容易产生一定的误导,而Setter方法,则均为setFromRpcContext(boolean )

个人建议,如果是类内部属性,不会作为POJO类(即存在Getter, Setter属性)的话,加is, 否则不要加is

https://github.com/baidu/brpc-java/blob/aba698ad4695b350a0fb347da4fe828b5fbb81ea/brpc-java-core/src/main/java/com/baidu/brpc/server/RpcServerOptions.java#L33

https://github.com/baidu/brpc-java/blob/aba698ad4695b350a0fb347da4fe828b5fbb81ea/brpc-java-core/src/main/java/com/baidu/brpc/client/RpcClientOptions.java#L31

https://github.com/baidu/brpc-java/blob/aba698ad4695b350a0fb347da4fe828b5fbb81ea/brpc-java-core/src/main/java/com/baidu/brpc/ChannelInfo.java#L43

java.lang.RuntimeException: protocol not exist, type=1

client样例中的代码是这样给出的:
RpcClient rpcClient = new RpcClient(serviceUrl, clientOption, interceptors);

但实际运行的时候出现了下面的代码在new RpcClient的时候没有走到的情况:
ExtensionLoaderManager.getInstance().loadAllExtensions("UTF-8");

导致出现java.lang.RuntimeException: protocol not exist, type=1的报错(1对应baidustd协议)

双重检查锁定

您好:
我是360代码卫士团队的工作人员,在我们的开源项目检测计划中发现brpc-java中存在双重检查锁定代码质量问题。
com.baidu.brpc.client.loadbalance.FairStrategy.java
image

您采用了双重锁检查来延迟timmer的初始化,但仍有一定的概率得到一个未初始化的timmer对象,对于这种情况的处理,我们建议使用volatile关键字来修饰timer,保证在重排序的情况下仍能得到正确初始化的对象。

非http包进入到http协议解码,不抛出BadSchema,反而bad-request进入到encodeResponse抛出空指针了

java.lang.NullPointerException: null
at com.baidu.brpc.protocol.http.HttpRpcProtocol.encodeResponse(HttpRpcProtocol.java:410) ~[brpc-java-2.5.1.jar:na]
at com.baidu.brpc.server.handler.DecodeWorkTask.run(DecodeWorkTask.java:130) ~[brpc-java-2.5.1.jar:na]
at com.baidu.brpc.utils.ThreadPool.consume(ThreadPool.java:130) [brpc-java-2.5.1.jar:na]
at com.baidu.brpc.utils.ThreadPool.access$000(ThreadPool.java:37) [brpc-java-2.5.1.jar:na]
at com.baidu.brpc.utils.ThreadPool$1.run(ThreadPool.java:78) [brpc-java-2.5.1.jar:na]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-all-4.1.36.Final.jar:4.1.36.Final]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_05]

Fail-fast in unpack will be better?

BaiduRpcProtocol now is below

            int bodySize = fixHeaderBuf.readInt();
            if (in.readableBytes() < FIXED_LEN + bodySize) {
                throw notEnoughDataException;
            }
            // 512M
            if (bodySize > 512 * 1024 * 1024) {
                throw new TooBigDataException("to big body size:" + bodySize);
            }

change sequence like this will be better?

            int bodySize = fixHeaderBuf.readInt();
            // 512M
            if (bodySize > 512 * 1024 * 1024) {
                throw new TooBigDataException("to big body size:" + bodySize);
            }
            if (in.readableBytes() < FIXED_LEN + bodySize) {
                throw notEnoughDataException;
            }

refactor interceptor chain and add load balance interceptor

  1. add interceptor chain to invoke interceptor list.
  2. add load balance interceptor for client, so that user can set custom load balance interceptor, such as Ribbon.
  3. add ServerInvokeInterceptor for server.

the codes is at Branch "loadbalance"

建议XxxPacket均实现同一个空接口Packet

如题,这样,这个方法的定义将可以返回一个Packet接口类型,对开发人员更加友好:
com.baidu.brpc.protocol.Protocol

    /**
     * 客户端/服务端解析请求包成header+body buffer
     * @param in 输入byte buf
     * @return header+body buffer
     * @throws BadSchemaException header格式不对
     * @throws TooBigDataException body太大
     * @throws NotEnoughDataException 可读长度不够,由于粘包拆包问题。
     */
    Object decode(DynamicCompositeByteBuf in)
            throws BadSchemaException, TooBigDataException, NotEnoughDataException;

brpc 2.5.1 Demo cannot run.

I use protobuf-2.5 to generate ECHO.java file,this process is right. But when i open the RpcClientTest.java and RpcServerTest.java etc. There are many errors in these files. So what's problem with them, and what should i do to solve these problems?
image

支持泛化调用么

在代码里没找到关于泛化调用的支持
如果目前不支持的话 有支持计划么

java client 是否支持流式数据传输

我是 brpc 开发了 server 端,然后映射成了 restful 接口。但是最近传输大数据时,会出现超时问题。现在想转换为流式数据传输。server 端是 C++,请问 java 端的 client 是否支持流式数据传输。

The logging messages is too verbose when starting or shutting down.

The following logging messages is too verbose. I just did start a server and then did shutdown it.

2019-08-18 14:33:23,504 [main] INFO  com.baidu.brpc.protocol.ProtocolManager - register protocol:1 success
2019-08-18 14:33:23,807 [main] INFO  com.baidu.brpc.protocol.ProtocolManager - register protocol:29 success
2019-08-18 14:33:23,823 [main] INFO  com.baidu.brpc.protocol.ProtocolManager - register protocol:4 success
2019-08-18 14:33:23,848 [main] INFO  com.baidu.brpc.protocol.ProtocolManager - register protocol:3 success
2019-08-18 14:33:23,852 [main] INFO  com.baidu.brpc.protocol.ProtocolManager - register protocol:31 success
2019-08-18 14:33:23,853 [main] INFO  com.baidu.brpc.protocol.ProtocolManager - register protocol:28 success
2019-08-18 14:33:23,854 [main] INFO  com.baidu.brpc.protocol.ProtocolManager - register protocol:32 success
2019-08-18 14:33:23,855 [main] INFO  com.baidu.brpc.protocol.ProtocolManager - register protocol:33 success
2019-08-18 14:33:23,856 [main] INFO  com.baidu.brpc.protocol.ProtocolManager - register protocol:30 success
2019-08-18 14:33:23,859 [main] INFO  com.baidu.brpc.client.loadbalance.LoadBalanceManager - register load balance factory:RandomLoadBalanceFactory success
2019-08-18 14:33:23,860 [main] INFO  com.baidu.brpc.client.loadbalance.LoadBalanceManager - register load balance factory:RoundRobinLoadBalanceFactory success
2019-08-18 14:33:23,861 [main] INFO  com.baidu.brpc.client.loadbalance.LoadBalanceManager - register load balance factory:WeightLoadBalanceFactory success
2019-08-18 14:33:23,862 [main] INFO  com.baidu.brpc.client.loadbalance.LoadBalanceManager - register load balance factory:FairLoadBalanceFactory success
2019-08-18 14:33:23,870 [main] INFO  com.baidu.brpc.utils.CustomThreadFactory - create thread:server-work-thread-1
2019-08-18 14:33:23,872 [main] INFO  com.baidu.brpc.utils.CustomThreadFactory - create thread:server-work-thread-2
2019-08-18 14:33:23,872 [main] INFO  com.baidu.brpc.utils.CustomThreadFactory - create thread:server-work-thread-3
2019-08-18 14:33:23,872 [main] INFO  com.baidu.brpc.utils.CustomThreadFactory - create thread:server-work-thread-4
2019-08-18 14:33:23,949 [main] INFO  com.baidu.brpc.server.RpcServer - use jdk nio event mode
2019-08-18 14:33:24,031 [main] INFO  com.baidu.brpc.utils.CustomThreadFactory - create thread:timeout-timer-thread-1
2019-08-18 14:33:24,093 [main] INFO  com.baidu.brpc.server.ServiceManager - register service, serviceName=DstStringService, methodName=strPut
2019-08-18 14:33:24,102 [main] INFO  com.baidu.brpc.server.ServiceManager - register service, serviceName=DstStringService, methodName=strGet
2019-08-18 14:33:24,111 [main] INFO  com.baidu.brpc.server.ServiceManager - register service, serviceName=DstSetService, methodName=setPut
2019-08-18 14:33:24,114 [main] INFO  com.baidu.brpc.server.ServiceManager - register service, serviceName=DstSetService, methodName=setGet
2019-08-18 14:33:24,121 [main] INFO  com.baidu.brpc.server.ServiceManager - register service, serviceName=DstListService, methodName=listPut
2019-08-18 14:33:24,137 [main] INFO  com.baidu.brpc.server.ServiceManager - register service, serviceName=DstListService, methodName=listGet
2019-08-18 14:33:24,293 [main] INFO  com.baidu.brpc.utils.CustomThreadFactory - create thread:server-acceptor-thread-1
2019-08-18 14:33:24,314 [main] INFO  com.baidu.brpc.server.RpcServer - server started on port=10011 success
2019-08-18 14:33:25,905 [Thread-0] INFO  com.baidu.brpc.thread.ShutDownManager - Brpc do clean work...
2019-08-18 14:33:28,012 [Thread-1] INFO  com.baidu.brpc.utils.CustomThreadFactory - create thread:server-io-thread-1
2019-08-18 14:33:28,013 [Thread-1] INFO  com.baidu.brpc.utils.CustomThreadFactory - create thread:server-io-thread-2
2019-08-18 14:33:28,013 [Thread-1] INFO  com.baidu.brpc.utils.CustomThreadFactory - create thread:server-io-thread-3
2019-08-18 14:33:28,013 [Thread-1] INFO  com.baidu.brpc.utils.CustomThreadFactory - create thread:server-io-thread-4

What I suggest is only to show a starting logging message with address info in INFO level when starting like:

Succeeded to start rpc server on 127.0.0.1:10001.

Other logging messages should be debug level.

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.