Giter Site home page Giter Site logo

springboot-thrift-etcd-ribbon's Introduction

说在前面

项目基于 java8 进行开发, thrift 使用的版本是0.9.3版本, etcd使用的是2.x的版本

springboot-thrift-etcd-ribbon

基于springboot和thrift的简单rpc功能,目标就是简单、轻量

一般比如dubbo使用的zk做服务注册和发现,但是既然为了轻量级目标,就把zk替换成了etcd

路由算法目前选用了ribbon包的开源默认实现

使用方式

项目使用springboot的标准的starter的方式进行, 使用者通过引入etcd-thrift-starter项目,并且通过加入配置文件来制定配置

项目组成

  • autoconfigure项目: 包括了server和client的主要逻辑,服务端的注册、客户端的寻址和路由
  • etcd-thrift-starter项目:以springboot的starter的形式提供了依赖, 主要在pom.xml中加入依赖
  • example-api项目:提供给thrift-server和thrift-client的api,通过thrift的idl生成的jar包
  • example-server项目:thrift-server的实例项目,主要是暴露所提供的服务和注册节点到etcd
  • exapmle-client项目:thrift-client的实例项目,主要是通过etcd获得服务节点,并且完成服务的路由和调用

springboot-thrift-etcd-ribbon's People

Contributors

dragontree101 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

Watchers

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

springboot-thrift-etcd-ribbon's Issues

提示thrift不存在,该怎么解决

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.thrift.tools:maven-thrift-plugin:0.1.11:compile (thrift-sources) on project example-api: thrift did not exit cleanly. Review output for more information.
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
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:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:197)
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)
Caused by: org.apache.maven.plugin.MojoFailureException: thrift did not exit cleanly. Review output for more information.
at org.apache.thrift.maven.AbstractThriftMojo.execute(AbstractThriftMojo.java:177)
at org.apache.thrift.maven.ThriftCompileMojo.execute(ThriftCompileMojo.java:21)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)

io.netty.util.concurrent.BlockingOperationException: DefaultPromise@7ccac308(incomplete)

再次感谢大神分享哈~ 让我能够借鉴来改造公司项目~
报错异常信息如下:

io.netty.util.concurrent.BlockingOperationException: DefaultPromise@7ccac308(incomplete)
	at io.netty.util.concurrent.DefaultPromise.checkDeadLock(DefaultPromise.java:391) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.util.concurrent.DefaultPromise.awaitUninterruptibly(DefaultPromise.java:284) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
	at mousio.client.promises.ResponsePromise.waitForPromiseSuccess(ResponsePromise.java:189) [etcd4j-2.11.0.jar:2.11.0]
	at mousio.etcd4j.promises.EtcdResponsePromise.get(EtcdResponsePromise.java:58) ~[etcd4j-2.11.0.jar:2.11.0]
	at com.dragon.study.springboot.autoconfigure.etcd.EtcdListener.onResponse(EtcdListener.java:71) ~[classes/:na]
	at mousio.client.promises.ResponsePromise.handlePromise(ResponsePromise.java:132) [etcd4j-2.11.0.jar:2.11.0]
	at mousio.client.promises.ResponsePromise$1.operationComplete(ResponsePromise.java:63) [etcd4j-2.11.0.jar:2.11.0]
	at mousio.client.promises.ResponsePromise$1.operationComplete(ResponsePromise.java:60) [etcd4j-2.11.0.jar:2.11.0]
	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:683) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:604) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:564) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.util.concurrent.DefaultPromise.setSuccess(DefaultPromise.java:398) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
	at mousio.etcd4j.transport.EtcdResponseHandler.channelRead0(EtcdResponseHandler.java:140) [etcd4j-2.11.0.jar:2.11.0]
	at mousio.etcd4j.transport.EtcdResponseHandler.channelRead0(EtcdResponseHandler.java:47) [etcd4j-2.11.0.jar:2.11.0]
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:154) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:354) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:145) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) [netty-codec-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:154) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:354) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:145) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:154) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:354) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:145) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:433) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:277) [netty-codec-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:264) [netty-codec-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:243) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:154) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:354) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:145) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:1078) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:117) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:527) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:484) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:398) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:370) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:742) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
	at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:145) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
	at java.lang.Thread.run(Thread.java:745) [na:1.7.0_75]

好像出错在这行代码:EtcdKeysResponse keysResponse = etcdClient.get(listenPath).send().get();

说下我的使用方式:
一个Server项目包含多个接口类(会有几个到十几个Interface),所以我把EtcdRegister实体类的path成员变量由String改成了List,以便能够同时注册多个接口到etcd中

我的疑问如下:

  1. 上面的问题是不是etcdClient不能复用才报错的,如果不能复用,是否需要为每个接口创建一个etcdClient对象

  2. RibbonAlgorithm类能否复用,像我这个场景,那里面创建的线程池、Server源等等一系列东西,岂不是有多份了呀?

原谅我表达的不是很清楚,希望大神能给予解答哈~

缺少类

example.api.Calculator
api.InvalidOperation;
api.SharedStruct;
example.api.Work;

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.