Dubbox
Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,
后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维护,为了与原有的Dubbo区分,故将其命名为Dubbox。
工作原理:
节点角色说明
Provider: 暴露服务的提供方Consumer: 调用远程服务的服务消费方
Registry: 服务注册与发现的注册中心
Monitor: 统计服务调用次数和调用时间的监控中心
Container: 服务运行容器
调用关系说明
服务容器负责启动、加载,运行服务提供者服务提供者在启动时,向注册中心注册自己提供的服务
服务消费者在启动时,向注册中心订阅自己所需的服务
注册中心返回返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.8.4</version> </dependency> <!-- 添加zk客户端依赖 --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>3.0.7.Final</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-client</artifactId> <version>3.0.7.Final</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> </dependency> <!-- 如果要使用json序列化 --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jackson-provider</artifactId> <version>3.0.7.Final</version> </dependency> <!-- 如果要使用xml序列化 --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxb-provider</artifactId> <version>3.0.7.Final</version> </dependency> <!-- 如果要使用netty server --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-netty</artifactId> <version>3.0.7.Final</version> </dependency> <!-- 如果要使用Sun HTTP server --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jdk-http</artifactId> <version>3.0.7.Final</version> </dependency> <!-- 如果要使用tomcat server --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>8.0.11</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-logging-juli</artifactId> <version>8.0.11</version> </dependency> <dependency> <groupId>com.esotericsoftware.kryo</groupId> <artifactId>kryo</artifactId> <version>2.24.0</version> </dependency> <dependency> <groupId>de.javakaffee</groupId> <artifactId>kryo-serializers</artifactId> <version>0.26</version> </dependency> <dependency> <groupId>de.ruedigermoeller</groupId> <artifactId>fst</artifactId> <version>1.55</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.3.3</version> </dependency> <dependency> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty</artifactId> <version>7.0.0.pre5</version> </dependency> <dependency> <groupId>com.dubbo</groupId> <artifactId>dubbox_service</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies>
dubbox_provider
DoSomeService
@Path("/dosomeService") public interface DoSomeService @Path("/doSome/{userName}") @GET @Consumes({ MediaType.APPLICATION_JSON }) public String doSome(@PathParam("userName") String userName);
DoSomeServiceImpl
public class DoSomeServiceImpl implements DoSomeService { @Override public String doSome(String userName) { System.out.println("dubbox 发布的DoSomeService 服务 doSome方法 "+userName); return "bubbox"; } }
applicationContext-provider.xml
<!--声明服务提供方--> <dubbo:application name="dubbox-provider"/> <!--注册中心地址--> <dubbo:registry address="zookeeper://0.0.0.1:2181"/> <!--dubbo服务端口--> <dubbo:protocol name="rest" port="8080"/> <!--服务注册--> <dubbo:service interface="com.dubbo.service.DoSomeService" ref="doSomeService"/> <bean id="doSomeService" class="com.dubbo.service.impl.DoSomeServiceImpl"/>
AppTest
public class AppTest { public static void main(String[] args) throws IOException { //加载配置文件:配置文件中通过SPring将Dubbo服务注册到注册中心当中去 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext-provider.xml"); System.out.println("dubbox服务已经发布!!!!!"); //阻塞 System.in.read(); } }
dubbox_consumer
DoSomeService
@Path("/dosomeService") public interface DoSomeService { @Path("/doSome/{userName}") @GET @Consumes({ MediaType.APPLICATION_JSON }) public String doSome(@PathParam("userName") String userName); }
applicationContext-provider.xml
<!--声明服务提供方--> <dubbo:application name="dubbox-consumer"/> <!--注册中心地址--> <dubbo:registry address="zookeeper://0.0.0.1:2180"/> <!--服务消费--> <dubbo:reference interface="com.dubbo.service.DoSomeService" id="doSomeService"/>
AppTest
public class AppTest { public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-consumer.xml"); DoSomeService doSomeService = (DoSomeService)ctx.getBean("doSomeService"); doSomeService.doSome("李四"); } }