dubbx是java 轻量级框架的框架么

congcong68
阅读(435503)
& 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的。现在核心业务抽取出来,作为独立的服务,使前端应用能更快速和稳定的响应。
第一:介绍Dubbo背景
大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡。
(1)&当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。
此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。
并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。
(2)&当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。
(3)&接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?
为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。
其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。
第二:Dubbo的简介
Dubbo是一个分布式服务框架,解决了上面的所面对的问题,Dubbo的架构如图所示:
节点角色说明:
Provider:&暴露服务的服务提供方。
Consumer:&调用远程服务的服务消费方。
Registry:&服务注册与发现的注册中心。
Monitor:&统计服务的调用次调和调用时间的监控中心。
Container:&服务运行容器。
调用关系说明:
0.&服务容器负责启动,加载,运行服务提供者。
1.&服务提供者在启动时,向注册中心注册自己提供的服务。
2.&服务消费者在启动时,向注册中心订阅自己所需的服务。
3.&注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4.&服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5.&服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
&Dubbo提供了很多协议,Dubbo协议、RMI协议、Hessian协议,我们查看Dubbo源代码,有各种协议的实现,如图所示:
我们之前没用Dubbo之前时,大部分都使用Hessian来使用我们服务的暴露和调用,利用HessianProxyFactory调用远程接口。
上面是参考了Dubbo官方网介绍,接下来我们来介绍SpringMVC、Dubbo、Zookeeper整合使用。
第三:Dubbo与Zookeeper、SpringMVC整合使用
&&第一步:在Linux上安装Zookeeper
& & & &Zookeeper作为Dubbo服务的注册中心,Dubbo原先基于数据库的注册中心,没采用Zookeeper,Zookeeper一个分布式的服务框架,是树型的目录服务的数据存储,能做到集群管理数据&,这里能很好的作为Dubbo服务的注册中心,Dubbo能与Zookeeper做到集群部署,当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,当提供者重启时,能自动恢复注册数据,以及订阅请求。我们先在linux上安装Zookeeper,我们安装最简单的单点,集群比较麻烦。
& & (1)下载Zookeeper-3.4.6.tar.gz&&地址
& & (2) 我们放到Linux下的一个文件夹,然后解压:&
& & & #tar&zxvf&zookeeper-3.4.6.tar.gz
& (3)然后在对应的zookeeper-3.4.6/conf&下有一个文件zoo_sample.cfg的这个文件里面配置了监听客户端连接的端口等一些信息,Zookeeper&在启动时会找zoo.cfg这个文件作为默认配置文件,所以我们复制一个名称为zoo.cfg的文件,如图所示:
& &我们查看一下这个文件的里面的一些配置信息,如图所示:
&clientPort:监听客户端连接的端口。
&tickTime:基本事件单元,以毫秒为单位。它用来控制心跳和超时,默认情况下最小的会话超时时间为两倍的&tickTime。
&我们可以对配置文件的端口等或者进行高级配置和集群配置例如:maxClientCnxns:限制连接到&ZooKeeper&的客户端的数量等
&(4)启动Zookeeper&的服务,如图所示:
&到这边Zookeeper的安装和配置完成
&&第二步:配置dubbo-admin的管理页面,方便我们管理页面
& & (1)下载dubbo-admin-2.4.1.war包,在Linux的tomcat部署,先把dubbo-admin-2.4.1放在tomcat的webapps/ROOT下,然后进行解压:
& & & & #jar&-xvf&dubbo-admin-2.4.1.war
& & (2)然后到webapps/ROOT/WEB-INF下,有一个dubbo.properties文件,里面指向Zookeeper&,使用的是Zookeeper&的注册中心,如图所示:
&&&(3)然后启动tomcat服务,用户名和密码:root,并访问服务,显示登陆页面,说明dubbo-admin部署成功,如图所示:
&&第三步:SpringMVC与Dubbo的整合,这边使用的Maven的管理项目
&&& 第一:我们先开发服务注册的,就是提供服务,项目结构如图所示:
& &&(1)test-maven-api项目加入了一个服务接口,代码如下:
public interface TestRegistryService {
public String hello(String name);
}& (2)test-maven-console在pom.xml加入Dubbo和Zookeeper的jar包、引用test-maven-api的jar包,代码如下:
&dependency&
&groupId&cn.test&/groupId&
&artifactId&test-maven-api&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&/dependency&
&dependency&
&groupId&com.alibaba&/groupId&
&artifactId&dubbo&/artifactId&
&version&2.5.3&/version&
&/dependency&
&dependency&
&groupId&org.apache.zookeeper&/groupId&
&artifactId&zookeeper&/artifactId&
&version&3.4.6&/version&
&/dependency&
&dependency&
&groupId&com.github.sgroschupf&/groupId&
&artifactId&zkclient&/artifactId&
&version&0.1&/version&
&/dependency&(3)test-maven-console实现具体的服务,代码如下:
@Service(&testRegistryService&)
public class TestRegistryServiceImpl implements TestRegistryService {
public String hello(String name) {
return &hello&+
(4)我们服务以及实现好了,这时要暴露服务,代码如下:
&&&?xml version=&1.0& encoding=&UTF-8&?&
&beans xmlns=&http://www.springframework.org/schema/beans&
xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xmlns:jee=&http://www.springframework.org/schema/jee&
xmlns:tx=&http://www.springframework.org/schema/tx&
&span style=&color:#cc0000;&&xmlns:dubbo=&/schema/dubbo&&/span&
xmlns:context=&http://www.springframework.org/schema/context&
xsi:schemaLocation=&http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
&span style=&color:#990000;&&/schema/dubbo /schema/dubbo/dubbo.xsd&/span&
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd&
default-lazy-init=&false& &
&!-- 提供方应用名称信息,这个相当于起一个名字,我们dubbo管理页面比较清晰是哪个应用暴露出来的 --&
&dubbo:application name=&dubbo_provider&&&/dubbo:application&
&!-- 使用zookeeper注册中心暴露服务地址 --&
&dubbo:registry address=&zookeeper://127.0.0.1:2181& check=&false& subscribe=&false& register=&&&&/dubbo:registry&
&!-- 要暴露的服务接口 --&
&dubbo:service interface=&cn.test.dubbo.registry.service.TestRegistryService& ref=&testRegistryService& /&
&/beans&&&
&&&dubbo:registry&标签一些属性的说明:
&&&&&&1)register是否向此注册中心注册服务,如果设为false,将只订阅,不注册。
& & &&2)check注册中心不存在时,是否报错。
& & &&3)subscribe是否向此注册中心订阅服务,如果设为false,将只注册,不订阅。
& & &&4)timeout注册中心请求超时时间(毫秒)。
& & &&5)address可以Zookeeper集群配置,地址可以多个以逗号隔开等。
& dubbo:service标签的一些属性说明:
&&&&&1)interface服务接口的路径
& & &2)ref引用对应的实现类的Bean的ID
& & &3)registry向指定注册中心注册,在多个注册中心时使用,值为&dubbo:registry&的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A
& & &4)register&默认true&,该协议的服务是否注册到注册中心。
& (5)启动项目,然后我们在Dubbo管理页面上显示,已经暴露的服务,但显示还没有消费者,因为我们还没实现消费者服务,如图所示:
& &第二:我们在开发服务消费者,就是调用服务,我们在新建一个新的消费者项目结构如图所示:
& &(1)test-maven-server-console的pom.xml引入Dubbo和Zookeeper的jar包、test-maven-api的jar包,因为引入test-maven-api的jar包,我们在项目中调用像在本地调用一样。代码如下:
&dependency&
&groupId&cn.test&/groupId&
&artifactId&test-maven-api&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&/dependency&
&dependency&
&groupId&com.alibaba&/groupId&
&artifactId&dubbo&/artifactId&
&version&2.5.3&/version&
&/dependency&
&dependency&
&groupId&org.apache.zookeeper&/groupId&
&artifactId&zookeeper&/artifactId&
&version&3.4.6&/version&
&/dependency&
&dependency&
&groupId&com.github.sgroschupf&/groupId&
&artifactId&zkclient&/artifactId&
&version&0.1&/version&
&/dependency&
&&(2)test-maven-server-console项目的具体实现,代码如下:
& & &@Controller
public class IndexController {
@Autowired
private TestRegistryService testRegistryS
@RequestMapping(&/hello&)
public String index(Model model){
String name=testRegistryService.hello(&zz&);
System.out.println(&xx==&+name);
return &&;
& (3)我们要引用的地址,代码如下:
& &&?xml version=&1.0& encoding=&UTF-8&?&
&beans xmlns=&http://www.springframework.org/schema/beans&
xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xmlns:jee=&http://www.springframework.org/schema/jee&
xmlns:tx=&http://www.springframework.org/schema/tx&
&span style=&background-color: rgb(255, 255, 255);&&&span style=&color:#990000;&&xmlns:dubbo=&/schema/dubbo&&/span&&/span&
xmlns:context=&http://www.springframework.org/schema/context&
xsi:schemaLocation=&http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
&span style=&color:#990000;&&/schema/dubbo /schema/dubbo/dubbo.xsd&/span&
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd&
default-lazy-init=&false& &
&dubbo:application name=&dubbo_consumer&&&/dubbo:application&
&!-- 使用zookeeper注册中心暴露服务地址 --&
&dubbo:registry address=&zookeeper://192.168.74.129:2181& check=&false&&&/dubbo:registry&
&!-- 要引用的服务 --&
&dubbo:reference interface=&cn.test.dubbo.registry.service.TestRegistryService& id=&testRegistryService&&&/dubbo:reference&
&&&dubbo:reference&的一些属性的说明:
&&&&&&1)interface调用的服务接口
&&&&&&2)check&启动时检查提供者是否存在,true报错,false忽略
&&&&&&3)registry&从指定注册中心注册获取服务列表,在多个注册中心时使用,值为&dubbo:registry&的id属性,多个注册中心ID用逗号分隔
& &&&&4)loadbalance&负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用
(4)项目启动,Dubbo管理页面,能看到消费者,如图所示:
(5)然后访问消费者项目,Controller层能像调用本地一样调用服务的具体实现,如图所示:
Dubbo提供了多种容错方案,包括负载均衡这些,如图所示:
阅读排行榜> dubbxo开发中遇到的错误总结
dubbxo开发中遇到的错误总结
1. object is not an instance of declaring class
错误日日志
10:55:59,612 [RMI TCP Connection(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x154ff32b10a0058 after 0ms
[01/06/16 10:56:05:005 CST] http-nio-8090-exec-6 DEBUG core.SynchronousDispatcher: PathInfo: /tianji/items/pulloffshelf
10:56:05,589 [http-nio-8090-exec-6] WARN
cn.company.test.exceptions.RestExceptionMapper - [runtime exception] : %s
10:56:05,589 [http-nio-8090-exec-6] pany.test.exceptions.RestExceptionMapper - [runtime exception] :
org.jboss.resteasy.spi.InternalServerErrorException: Bad arguments passed to org.jboss.resteasy.spi.metadata.ResourceMethod@6b9e0ff4
( cn.company.goods.pojos.pany.goods.pojos.PullOffShelves@2e1cb83d )
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:177) ~[resteasy-jaxrs-3.0.7.Final.jar:?]
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:288) ~[resteasy-jaxrs-3.0.7.Final.jar:?]
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:242) ~[resteasy-jaxrs-3.0.7.Final.jar:?]
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:229) ~[resteasy-jaxrs-3.0.7.Final.jar:?]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356) [resteasy-jaxrs-3.0.7.Final.jar:?]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179) [resteasy-jaxrs-3.0.7.Final.jar:?]
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) [resteasy-jaxrs-3.0.7.Final.jar:?]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) [resteasy-jaxrs-3.0.7.Final.jar:?]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) [resteasy-jaxrs-3.0.7.Final.jar:?]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [servlet-api.jar:?]
at com.alibaba.dubbo.rpc.protocol.rest.DubboHttpServer$RestHandler.handle(DubboHttpServer.java:86) [dubbo-2.8.4.jar:2.8.4]
at com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet.service(DispatcherServlet.java:64) [dubbo-2.8.4.jar:2.8.4]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [servlet-api.jar:?]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) [catalina.jar:8.0.35]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.35]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.35]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.35]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.35]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) [catalina.jar:8.0.35]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [catalina.jar:8.0.35]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) [catalina.jar:8.0.35]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) [catalina.jar:8.0.35]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.35]
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) [catalina.jar:8.0.35]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.35]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) [catalina.jar:8.0.35]
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099) [tomcat-coyote.jar:8.0.35]
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) [tomcat-coyote.jar:8.0.35]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) [tomcat-coyote.jar:8.0.35]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) [tomcat-coyote.jar:8.0.35]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_91]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_91]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.35]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_91]
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_91]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_91]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_91]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137) ~[resteasy-jaxrs-3.0.7.Final.jar:?]
... 33 more
10:56:12,950 [RMI TCP Connection(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x154ff32b10a0058 after 0ms
通篇错误最明显的两个地方:
org.jboss.resteasy.spi.InternalServerErrorException: Bad arguments passed to org.jboss.resteasy.spi.metadata.ResourceMethod@6b9e0ff4 ( cn.company.goods.pojos.pany.goods.pojos.PullOffShelves@2e1cb83d和Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class。
在dubbox的service(itemServiceImpl)中实现了两个接口(itemervice,itemPullOffShelfService),dubbox暴露给zk的服务(dubbo:service)有两个,但是实现的bean有一个(ref),zk虽然注册了服务,但是rest(暂且当作消费方)调用接口的时候,不知道调用的是哪一个资源接口。
如果是其它方式引发的错误,此处的解决方法不可用。
将两个接口合并到同一个接口或者分别实现两个接口。问题即可解决。
2. Could not find message body reader for type
[02/06/16 04:34:38:038 CST] http-nio-8080-exec-5
INFO support.LoggingFilter:
[DUBBO] The contents of request body is:
, dubbo version: 2.8.4, current host: 127.0.0.1
[02/06/16 04:34:38:038 CST] http-nio-8080-exec-5
WARN core.ExceptionHandler: failed to execute
javax.ws.rs.NotSupportedException: Could not find message body reader for type: mon.query.BaseSearch of content type: */*
at org.jboss.resteasy.core.interception.ServerReaderInterceptorContext.throwReaderNotFound(ServerReaderInterceptorContext.java:52)
at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.getReader(AbstractReaderInterceptorContext.java:73)
at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:50)
at com.alibaba.dubbo.rpc.protocol.rest.support.LoggingFilter.aroundReadFrom(LoggingFilter.java:75)
at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:53)
at org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor.aroundReadFrom(GZIPDecodingInterceptor.java:59)
at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:53)
at org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:150)
at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:89)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:112)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:288)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:242)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:229)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at com.alibaba.dubbo.rpc.protocol.rest.DubboHttpServer$RestHandler.handle(DubboHttpServer.java:86)
at com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet.service(DispatcherServlet.java:64)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
[02/06/16 04:34:38:038 CST] http-nio-8080-exec-5
INFO support.LoggingFilter:
[DUBBO] The HTTP headers are:
, dubbo version: 2.8.4, current host: 127.0.0.1
这是由于在接口实现中没有添加相应的注解:@QueryParam,@BeanParam,@Component,@Consumes,@Produces等注解。最与该错误重要便是前两个。
我的错误指出来了,是不能找到消息体类型,这说明传入的参数出错,或者接口获取参数出错。仔细检查发现,在接口中将request参数转化为一个对象,但没有指出该对象就是@BeanParam.
错误代码:
@Component(&loginRegisterService&)
@Path(&statistics&)
@Produces({ContentType.APPLICATION_JSON_UTF_8})
public class LoginRegisterServiceImpl implements LoginRegisterService {
Log logger = LogFactory.getLog(LoginRegisterServiceImpl.class);
private LoginRegisterStR
* 根据查询条件查询登录注册访问统计数据
* @param search
@Path(&login_reg&)
public List&LoginRegisterSt& getLoginRegSt(final BaseSearch search) {
this.getDebugInfo();
return login.getLoginRegsiterSt(search);
接口中添加相应的注解。
改正后的代码:
@Component(&loginRegisterService&)
@Path(&statistics&)
@Produces({ContentType.APPLICATION_JSON_UTF_8})
public class LoginRegisterServiceImpl implements LoginRegisterService {
Log logger = LogFactory.getLog(LoginRegisterServiceImpl.class);
private LoginRegisterStR
* 根据查询条件查询登录注册访问统计数据
* @param search
@Path(&login_reg&)
public List&LoginRegisterSt& getLoginRegSt(@BeanParam final BaseSearch search) {
this.getDebugInfo();
return login.getLoginRegsiterSt(search);
3.java.io.EOFException: No content to map to Object due to end of input
当请求一个rest服务api时,服务器报错:
java.io.EOFException: No content to map to Object due to end of input
对于service的实现,接收参数没有注解为javax.ws.rs.*&类型之一,*包括:BeanParam和QueryParam,至于注解哪一种,需要根据情况而定,如果参数是Bean,用前者,是单个接收参数,用后者。
注意:这种错误出现时整个service没有注解,如果一个service中单个方法没有注解,则会出现的情况。
加入上述相应的注解。
* 订单复购率订单数统计数据
* @param search
@Path(&reorder&)
public List&Map&String, Object&& getReOrder(@BeanParam final BaseSearch search) {
4.Due to limitations of the BasicDBObject, you can’t add a second ‘$and’
首先这是一个mongodb的错误,暂且放到这里面。
java.lang.RuntimeException: org.springframework.data.mongodb.InvalidMongoDbApiUsageException: Due to limitations of the com.mongodb.BasicDBObject, you can't add a second '$and' expression specified as '$and : [ { &time& : { &$gte& : null }}]'. Criteria already contains '$and : [ { &appid& : { &$regex& : &fgdarr561puu& , &$options& : &i&}}]'.
在一个Criteria实例中只能使用一次andOperator方法,而我这里使用了两次,因为appid和mobile都不为空。
if (share.getAppid() != null && StringUtils.isNotEmpty(share.getAppid())) {
criteria.andOperator(Criteria.where(&appid&).regex(share.getAppid(), &i&));
if (share.getMobile() != null) {
criteria.andOperator(Criteria.where(&mobile&).regex(share.getMobile(), &i&));
如果要使用过个字段的操作,请看的解决方法:
Using Spring data and Mongodb, below is a function to find data within a date range.
public List&RequestAudit& findByIpAndDate(String ip, Date startDate, Date endDate) {
Query query = new Query(
Criteria.where(&ip&).is(ip)
.andOperator(Criteria.where(&createdDate&).gte(startDate))
.andOperator(Criteria.where(&createdDate&).lt(endDate))
return mongoOperation.find(query, RequestAudit.class);
It hits following error message :
org.springframework.data.mongodb.InvalidMongoDbApiUsageException:
Due to limitations of the com.mongodb.BasicDBObject, you can't add a second '$and'
expression specified as '$and : [ { &createdDate& : { &$lt& : { &$date& : &T16:00:00.000Z&}}}]'.
Criteria already contains '$and : [ { &createdDate& : { &$gte& : { &$date& : &T16:00:00.000Z&}}}]'
### Solution
Adding multiple “$and” operators on the same field “createdDate” will make Spring interprets it into a wrong mongodb query. To fix it, change the query to follow :
Query query = new Query(
Criteria.where(&ip&).is(ip)
.andOperator(
Criteria.where(&createdDate&).lt(endDate),
Criteria.where(&createdDate&).gte(startDate)
For multiple criteria on the same field, uses a “comma” to combine them.
如果你的需要和mkyong的一样,可以使使用合并字段到andOperator()方法中,当然你可以使用and()方法,由于我这里要对参数过滤,选择使用and()操作。扩展:类似的错误经常在我们判断的时间字段上,比如我们需要做开始时间和结束时间范围内的操作,此时我们是不是要判断开始时间和结束时间,如下:。
if (share.getStart() != null && share.getStart() != 0) {
criteria.and(&time&).lt(share.getEnd());
if (share.getEnd() != null && share.getEnd() != 0) {
criteria.and(&time&).gte(share.getStart());
这段代码也会报错,Criteria不允许同一字段多次出现在操作(and,andOperator,etc)中。修改上述逻辑:
if (share.getStart() != null && share.getStart() != 0 && share.getEnd() != null && share.getEnd() != 0) {
criteria.and(&time&).gte(share.getStart()).lt(share.getEnd());
} else if (share.getStart() != null && share.getStart() != 0 && (share.getEnd() == null || share.getEnd() == 0)) {
criteria.and(&time&).lt(share.getEnd());
} else if ((share.getStart() == null || share.getStart() == 0) && share.getEnd() != null && share.getEnd() != 0) {
criteria.and(&time&).gte(share.getStart());
6. java.net.SocketTimeoutException: connect timed out
com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=10.132.0.169:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: connect timed out}}]
出现这类情况,大概有以下几种情况:
mongo地址开启了bind_ip
操作系统开启了防火墙,shell可以连接,但是java程序不能连接
程序连接配置错误,比如ip,port
程序本身写法错误
如果开启了bind_ip,请加入你的服务器ip地址到该配置,或者,如果没有必要的时候,配置成0.0.0.0,这样任意机器均可访问
具体请看这里:
配置mongo的连接,仔细检查ip、port的配置,有时候会把169写成196类似的错误
程序错误,请修改bug在连接
7.Unable to create a Configuration, because no Bean Validation provider could be found.
13:54:30,369 [ConsumeMessageThread_1] WARN
cn.joyven.kuaidi.mq.consumer.ImportShipHandler - Failed to invoke the method ship in the service cn.joyven.test.api.OrderService. Tried 3 times of the providers [192.168.2.245:8091] (1/1) from the registry 127.0.0.1:2181 on the consumer 192.168.2.47 using the dubbo version 2.8.4. Last error is: Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
在stackover上看到了一个解决方案:这里给出一个此类问题的确认方法:在dubbo的xml配置中,直接使url配置直接访问dubbo服务,看是否能够正常使用,如果能够正常使用,则说明就是验证器的问题引起的。一般情况我们是通过zk去注册中心订阅服务的,不需要url配置,但为了定位问题,如下配置(增加url配置):
&dubbo:reference interface=&cn.joyven.test.api.OrderService&
id=&orderService& check=&false& protocol=&dubbo,rest& url=&dubbo://192.168.2.245:8091&/&
gradle项目:在gradle.build中增加
compile 'org.hibernate:hibernate-validator:5.2.0.Final'
maven项目:在pom.xml中增加
&dependency&
&groupId&org.hibernate&/groupId&
&artifactId&hibernate-validator&/artifactId&
&version&5.2.0.Final&/version&
&/dependency&
1. object is not an instance of declaring class 错误日日志
10:55:59,612 [RMI TCP Connection(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response f
------分隔线----------------------------
相关阅读排行
相关最新文章
Copyright 2012- ( Coin163 ) All Rights Reserved &&

我要回帖

更多关于 轻量级框架是什么意思 的文章

 

随机推荐