之前:
RPC: Remote Produedure Call :一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议
SOA: Service-oriented architecture面向服务的体系结构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。
zooKeeper:引用官方的说法:“Zookeeper是一个高性能,分布式的,开源分布式应用协调服务。它提供了简单原始的功能,分布式应用可以基于它实现更高级 的服务,比如同步,配置管理,集群管理,名空间。
Dubbo是一个来自阿里巴巴的开源分布式服务框架;
DubboX是当当根据自身的需求,为Dubbo实现了一些新的功能,包括REST风格远程调用、Kryo/FST序列化等等;
使用Dubbox搭建Demo:
服务端:
1、工程结构:
2、ivy.xml配置:主要引入Dubbox和spring.日志等相关jar;
<?xml version="1.0" encoding="UTF-8"?> <ivy-module version="2.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"> <info organisation="com.dubbox.service"module="dubbox-services"status="integration"> </info> <configurations> <conf name="default"visibility="public"description="runtime dependencies and master artifact can be used with this conf"extends="runtime,master"/> <conf name="master"visibility="public"description="contains only the artifact published by this module itself, with no transitive dependencies"/> <conf name="compile"visibility="public"description="this is the default scope, used if none is specified. Compile dependencies are available in all classpaths."/> <conf name="provided"visibility="public"description="this is much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive."/> <conf name="runtime"visibility="public"description="this scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath."extends="compile"/> <conf name="test"visibility="private"description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases."extends="runtime"/> <conf name="system"visibility="public"description="this scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repository."/> <conf name="sources"visibility="public"description="this configuration contains the source artifact of this module, if any."/> <conf name="javadoc"visibility="public"description="this configuration contains the javadoc artifact of this module, if any."/> <conf name="optional"visibility="public"description="contains all optional dependencies"/> </configurations> <dependencies> <!--Spring 相关内容 --> <dependency org="org.springframework"name="spring-core"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-beans"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-web"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-webmvc"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-context"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-context-support"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-aop"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-expression"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-tx"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-jms"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-messaging"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-jdbc"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="aopalliance"name="aopalliance"rev="1.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.sun.xml.fastinfoset"name="FastInfoset"rev="1.2.13"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="cglib"name="cglib-nodep"rev="3.1"conf="compile->compile(*),master(*);runtime->runtime(*)" /> <dependency org="org.aspectj"name="aspectjrt"rev="1.8.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.aspectj"name="aspectjweaver"rev="1.8.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--Apache Commons --> <dependency org="commons-codec"name="commons-codec"rev="1.10"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="commons-pool"name="commons-pool"rev="1.6"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="commons-io"name="commons-io"rev="2.4"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="commons-net"name="commons-net"rev="3.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--JSR303 Validation --> <dependency org="javax.validation"name="validation-api"rev="1.1.0.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.hibernate"name="hibernate-validator"rev="5.1.3.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.fasterxml"name="classmate"rev="1.1.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--json序列化相关 --> <dependency org="com.fasterxml.jackson.core"name="jackson-core"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.fasterxml.jackson.core"name="jackson-annotations"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.fasterxml.jackson.core"name="jackson-databind"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--Log 相关内容 --> <dependency org="org.slf4j"name="slf4j-api"rev="1.7.10"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.slf4j"name="jcl-over-slf4j"rev="1.7.10"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.slf4j"name="jul-to-slf4j"rev="1.7.10"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.slf4j"name="log4j-over-slf4j"rev="1.7.10"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="ch.qos.logback"name="logback-classic"rev="1.1.2"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="ch.qos.logback"name="logback-core"rev="1.1.2"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.jboss.logging"name="jboss-logging"rev="3.2.1.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--DobboX --> <dependency org="com.alibaba"name= "dubbo"rev="2.8.4"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="io.netty"name="netty"rev="3.10.5.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.google.guava"name="guava"rev="19.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.101tec"name="zkclient"rev="0.7"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.javassist"name="javassist"rev="3.20.0-GA"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.jboss.resteasy"name="resteasy-jaxrs"rev="3.0.14.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.jboss.resteasy"name="resteasy-client"rev="3.0.14.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.jboss.resteasy"name="resteasy-jackson2-provider"rev="3.0.14.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.jboss.resteasy"name="jaxrs-api"rev="3.0.12.Final" /> <dependency org="com.fasterxml.jackson.jaxrs"name="jackson-jaxrs-json-provider"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.fasterxml.jackson.jaxrs"name="jackson-jaxrs-base"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.fasterxml.jackson.module"name="jackson-module-jaxb-annotations"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="de.javakaffee"name="kryo-serializers"rev="0.41"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.esotericsoftware"name="kryo"rev="4.0.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.esotericsoftware"name="reflectasm"rev="1.11.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.ow2.asm"name="asm"rev="5.0.4"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.objenesis"name="objenesis"rev="2.4"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.esotericsoftware"name="minlog"rev="1.3.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--Http 客户端 --> <dependency org="org.apache.httpcomponents"name="httpclient"rev="4.4.1"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.apache.httpcomponents"name="httpcore"rev="4.4.1"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.apache.httpcomponents"name="httpmime"rev="4.4.1"transitive="false"/> <!--ZooKeeper --> <dependency org="org.apache.zookeeper"name="zookeeper"rev="3.4.8"transitive="false"/> <!--其他: Web容器自带 --> <dependency org="javax.el"name="javax.el-api"rev="3.0.0"conf="provided->*"transitive="false"/> <dependency org="javax.servlet"name="javax.servlet-api"rev="3.1.0"conf="provided->*"transitive="false"/> </dependencies> </ivy-module>
3、web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="core-services"version="3.0"> <display-name>dubbox-services</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!--Spring --> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/dubbox.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
4、dubbox.xml:
<?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:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <context:property-placeholder /> <!--消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="dubbox-services" /> <!--使用zookeeper注册中心暴露服务地址 --> <dubbo:registry protocol="zookeeper"address="${zkHost:127.0.0.1:2181}" /> <!--用dubbo协议暴露服务 --> <dubbo:protocol name="dubbo"port="${dubbo.port:20880}" /> <!--调用的服务时的公共配置 --> <dubbo:consumer check="${dubbo.client.check:false}"retries="${dubbo.client.retries:0}"timeout="${dubbo.client.timeout:5000}" /> <dubbo:service ref="demoService"interface="com.dubbox.service.DemoService"></dubbo:service> <import resource="classpath:com/dubbox/service/beans.xml"/> </beans>
5、beans.xml与服务接口与实现类:
<?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:context="http://www.springframework.org/schema/context"xmlns:task="http://www.springframework.org/schema/task"xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <context:property-placeholder /> <context:annotation-config /> <context:component-scan base-package="com.dubbox.service" /> <bean id="demoService"class="com.dubbox.service.DemoServiceImpl" /> </beans>
packagecom.dubbox.service; public interfaceDemoService { publicString greet(String name); }
packagecom.dubbox.service; public class DemoServiceImpl implementsDemoService{ @Override publicString greet(String name) { return "HI, "+name; } }
以上是服务端所有代码,只写了一个方法,用于测试远程调用。其中最主要文件是dubbox.xml,在其中配置需要发布的接口;
客户端:
1、工程结构:
需要说明的是d-s.jar是以上服务端打成的jar包,放到了lib下面直接引用;
2、ivy.xml:几乎与服务端一样
<?xml version="1.0" encoding="UTF-8"?> <ivy-module version="2.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"> <info organisation="com.dubbox.client"module="dubbox-client"status="integration"> </info> <configurations> <conf name="default"visibility="public"description="runtime dependencies and master artifact can be used with this conf"extends="runtime,master"/> <conf name="master"visibility="public"description="contains only the artifact published by this module itself, with no transitive dependencies"/> <conf name="compile"visibility="public"description="this is the default scope, used if none is specified. Compile dependencies are available in all classpaths."/> <conf name="provided"visibility="public"description="this is much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive."/> <conf name="runtime"visibility="public"description="this scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath."extends="compile"/> <conf name="test"visibility="private"description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases."extends="runtime"/> <conf name="system"visibility="public"description="this scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repository."/> <conf name="sources"visibility="public"description="this configuration contains the source artifact of this module, if any."/> <conf name="javadoc"visibility="public"description="this configuration contains the javadoc artifact of this module, if any."/> <conf name="optional"visibility="public"description="contains all optional dependencies"/> </configurations> <dependencies> <!--Spring 相关内容 --> <dependency org="org.springframework"name="spring-core"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-beans"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-web"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-webmvc"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-context"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-context-support"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-aop"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-expression"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-tx"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-jms"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-messaging"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.springframework"name="spring-jdbc"rev="4.2.5.RELEASE"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="aopalliance"name="aopalliance"rev="1.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.sun.xml.fastinfoset"name="FastInfoset"rev="1.2.13"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="cglib"name="cglib-nodep"rev="3.1"conf="compile->compile(*),master(*);runtime->runtime(*)" /> <dependency org="org.aspectj"name="aspectjrt"rev="1.8.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.aspectj"name="aspectjweaver"rev="1.8.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--Apache Commons --> <dependency org="commons-codec"name="commons-codec"rev="1.10"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="commons-pool"name="commons-pool"rev="1.6"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="commons-io"name="commons-io"rev="2.4"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="commons-net"name="commons-net"rev="3.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--JSR303 Validation --> <dependency org="javax.validation"name="validation-api"rev="1.1.0.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.hibernate"name="hibernate-validator"rev="5.1.3.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.fasterxml"name="classmate"rev="1.1.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--json序列化相关 --> <dependency org="com.fasterxml.jackson.core"name="jackson-core"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.fasterxml.jackson.core"name="jackson-annotations"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.fasterxml.jackson.core"name="jackson-databind"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--Log 相关内容 --> <dependency org="org.slf4j"name="slf4j-api"rev="1.7.10"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.slf4j"name="jcl-over-slf4j"rev="1.7.10"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.slf4j"name="jul-to-slf4j"rev="1.7.10"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.slf4j"name="log4j-over-slf4j"rev="1.7.10"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="ch.qos.logback"name="logback-classic"rev="1.1.2"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="ch.qos.logback"name="logback-core"rev="1.1.2"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.jboss.logging"name="jboss-logging"rev="3.2.1.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--DobboX --> <dependency org="com.alibaba"name= "dubbo"rev="2.8.4"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="io.netty"name="netty"rev="3.10.5.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.google.guava"name="guava"rev="19.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.101tec"name="zkclient"rev="0.7"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.javassist"name="javassist"rev="3.20.0-GA"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.jboss.resteasy"name="resteasy-jaxrs"rev="3.0.14.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.jboss.resteasy"name="resteasy-client"rev="3.0.14.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.jboss.resteasy"name="resteasy-jackson2-provider"rev="3.0.14.Final"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.jboss.resteasy"name="jaxrs-api"rev="3.0.12.Final" /> <dependency org="com.fasterxml.jackson.jaxrs"name="jackson-jaxrs-json-provider"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.fasterxml.jackson.jaxrs"name="jackson-jaxrs-base"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.fasterxml.jackson.module"name="jackson-module-jaxb-annotations"rev="2.7.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="de.javakaffee"name="kryo-serializers"rev="0.41"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.esotericsoftware"name="kryo"rev="4.0.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.esotericsoftware"name="reflectasm"rev="1.11.3"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.ow2.asm"name="asm"rev="5.0.4"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.objenesis"name="objenesis"rev="2.4"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="com.esotericsoftware"name="minlog"rev="1.3.0"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <!--Http 客户端 --> <dependency org="org.apache.httpcomponents"name="httpclient"rev="4.4.1"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.apache.httpcomponents"name="httpcore"rev="4.4.1"conf="compile->compile(*),master(*);runtime->runtime(*)"transitive="false"/> <dependency org="org.apache.httpcomponents"name="httpmime"rev="4.4.1"transitive="false"/> <!--ZooKeeper --> <dependency org="org.apache.zookeeper"name="zookeeper"rev="3.4.8"transitive="false"/> <!--其他: Web容器自带 --> <dependency org="javax.el"name="javax.el-api"rev="3.0.0"conf="provided->*"transitive="false"/> <dependency org="javax.servlet"name="javax.servlet-api"rev="3.1.0"conf="provided->*"transitive="false"/> </dependencies> </ivy-module>
3、web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="core-services"version="3.0"> <display-name>d-c</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!--Spring --> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/beans.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
4、beans.xml:
<?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:context="http://www.springframework.org/schema/context"xmlns:task="http://www.springframework.org/schema/task"xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <context:property-placeholder /> <context:annotation-config /> <context:component-scan base-package="com.dubbox.client" /> <import resource="dubbox.xml" /> <import resource="classpath:com/dubbox/service/beans.xml"/> </beans>
5、dubbox.xml
<?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:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <context:property-placeholder /> <!--消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="dubbox-client" /> <!--使用zookeeper注册中心暴露服务地址 --> <dubbo:registry protocol="zookeeper"address="${zkHost:127.0.0.1:2181}" /> <!--调用的服务时的公共配置 --> <dubbo:consumer check="${dubbo.client.check:false}"retries="${dubbo.client.retries:0}"timeout="${dubbo.client.timeout:5000}" /> <dubbo:reference id="demoService"interface="com.dubbox.service.DemoService" /> </beans>
5、DemoClient.java:
packagecom.dubbox.client; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RequestParam; importorg.springframework.web.bind.annotation.RestController; importcom.dubbox.service.DemoService; @RestController @RequestMapping(value="/api") public classDemoClient { @Autowired DemoService _demoService; @RequestMapping(value="/greet") public String greet(@RequestParam("name") String name){ System.out.println(_demoService.greet(name)); return_demoService.greet(name); } }
以上是客户端的全部代码,引用了服务端的xml文件获取接口;
测试Demo
1、启动zookeeper:
如开始所述,这是dubbox.xml所需的,用于注册服务;
下载zookeeper: 官网地址:http://zookeeper.apache.org/,解压文件,可能需要简单配置,点击bin文件夹下的zkServer.cmd,启动zookeeper;等待启动服务端和客户端;
2、启动服务端:
部署启动,ZooKeeper会收到消息;
3、启动客户端:
输入地址:http://ip:port/dubbox-client/api/greet?name='test',输出成功;
4、结束:
只是一个Demo而已;