dubbo学习

1.什么是微服务:

Martin fowler的关于微服务的介绍:http://martinfowler.com/articles/microservices.html

2.什么是dubbo:

 阿里巴巴开发的一款开源高性能rpc服务框架,用于开发分布式的应用。

3.架构:

4.各部分功能:

  • Provider: 暴露服务的服务提供方。
  • Consumer: 调用远程服务的服务消费方。
  • Registry: 服务注册与发现的注册中心。
  • Monitor: 统计服务的调用次调和调用时间的监控中心。
  • Container: 服务运行容器。

5.运行原理:

(1)加载spring containner

(2)加载*.xml文件,其中包括你的服务提供者下面的xml文件,里面配置了服务接口的具体实现类。

(3)根据你的配置文件进行解析,和spring的加载很类似

(4)解析出要注册的地址,以及提供的服务,服务的协议、序列化方式等。

(5)将此服务向zookeeper上进行注册

(6)消费方配置自己的xml文件,其中包括注册中心的地址,以及要调用的服务接口。

(7)消费方去注册中心返回的服务器地址上,进行最终服务的调用,并提供多种序列化方式。

(8)最终获得结果数据,一次调用结束。

在这同时,还会有monitor进行调用的监控和统计等。

6.源码下载和使用:

因为dubbo现在已经基本上不再维护了,当当在dubbo的基础上扩展了dubbox,支持rest方式调用,并集成了kyro高性能序列化框架,下面以dubbox为例,

(1)首先要安装zookeeper作为dubbo注册中心:http://zookeeper.apache.org/ 

(2)clone 源码地址:http://dangdangdotcom.github.io/dubbox

(3)编译 mvn install -Dmaven.test.skip=true

 这样会在dubbo-admin、dubbo-monitor下面生成war包,后续可以直接放到tomcat里面,然后可视化访问服务管理界面和监控界面。

(4)导入idea

(5)用IDE运行/dubbo-demo/dubbo-demo-provider/…/test目录下的DemoProvider启动dubbo服务端,目前他会分别启动dubbo协议(包括用kryo和FST序列化)和REST协议的服务

(6)用IDE运行/dubbo-demo/dubbo-demo-consumer/…/test目录下的DemoConsumer来启动dubbo客户端调用上面的服务端,直接看console的输出即可

7.demo实例:

(1)在dubbo-demo-api中定义一个接口:

package com.alibaba.dubbo.demo.hello;
/**
 * @author jiangchao
 */
public interface HelloService {
    String hello(String name);
}

(2)在服务生产者应用里面,实现接口:

package com.alibaba.dubbo.demo.hello;
/**
 * @author jiangchao
 */
public class HelloServiceImpl implements HelloService {
    public String hello(String name) {
        return "hello " + name;
  }
}

(3)服务生产者应用的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:dubbo="http://code.alibabatech.com/schema/dubbo"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

 <dubbo:application name="demo-provider" owner="programmer" organization="dubbox"/>

 <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

 <!--uncomment this if you want to test dubbo's monitor-->
 <!--<dubbo:monitor protocol="registry"/>-->

 <!-- here we demonstrate both annotation-based and xml-based configs -->
 <dubbo:annotation package="com.alibaba.dubbo.demo.hello" />

 <!--用dubbo协议在29014端口暴露服务 -->
 <dubbo:protocol name="dubbo" serialization="kryo" port="29014" optimizer="com.alibaba.dubbo.demo.SerializationOptimizerImpl"/>
 <!--<dubbo:protocol name="dubbo" serialization="fst" optimizer="com.alibaba.dubbo.demo.SerializationOptimizerImpl"/>-->

 <!--<dubbo:protocol name="dubbo" serialization="nativejava"/>-->
 <!--<dubbo:protocol name="dubbo" serialization="hessian2"/>-->
 <!--<dubbo:protocol name="dubbo" serialization="fastjson"/>-->
 <!--<dubbo:protocol name="dubbo" serialization="dubbo"/>-->

 <!--TODO according to the spring convention, we should use something like keep-alive-->
 <!-- use netty server -->
 <!--<dubbo:protocol name="rest" port="8888" keepalive="true" server="netty" iothreads="5" threads="100" contextpath="services"/>-->

 <!-- use the external tomcat or other server with the servlet approach; the port and contextpath must be exactly the same as those in external server -->
 <!--<dubbo:protocol name="rest" port="8888" contextpath="services" server="servlet"/>-->

 <!--<dubbo:protocol name="http" port="8889"/>-->
 <!--<dubbo:protocol name="hessian" port="8890"/>-->
 <!--<dubbo:protocol name="webservice" port="8892"/>-->
 <dubbo:service interface="com.alibaba.dubbo.demo.hello.HelloService" ref="helloService" protocol="dubbo"/>
 <bean id="helloService" class="com.alibaba.dubbo.demo.hello.HelloServiceImpl" />
</beans>

(4)在服务生产者应用里定义一个入口类,用来加载spring containner

package com.alibaba.dubbo.demo.provider;
public class DemoProvider {
   public static void main(String[] args) {
  com.alibaba.dubbo.container.Main.main(args);
  }
}

(5)先启动zookeeper,然后执行上面的main函数,则加载spring containner,读取XML配置文件,将配置的helloService服务注册到zookeeper中。

(6)在服务消费者应用里面,配置XML文件,配置helloService的bean:

<?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:dubbo="http://code.alibabatech.com/schema/dubbo"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

 <dubbo:application name="demo-consumer" owner="programmer" organization="dubbox"/>
 <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
 <dubbo:reference id="helloService" interface="com.alibaba.dubbo.demo.hello.HelloService"/>
</beans>

(7)在服务消费者应用里面,定义一个类用来测试服务的调用是否成功。(前提是服务生产者应用已经开启)

package com.alibaba.dubbo.demo.consumer;
import com.alibaba.dubbo.demo.hello.HelloService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by jiangchao08 on 16/12/5.
 */
public class DubboConsumerDemo {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"classpath:dubbo-demo-helloService-consumer.xml"});
        ctx.start();
 
        // 获取远程服务代理
        HelloService helloservice = (HelloService)ctx.getBean("helloService");
        System.out.println(helloservice.hello("jiangchao"));
    }
}

 

(8)服务生产者启动:

(9)消费者调用结果:

(10)启动tomcat执行dubbo-admin的war包,然后访问:http://localhost:8080/,输入用户名和密码:默认都是root

可以看到,我们的服务已经注册进去了,点击此服务,可以查看详细信息,如图:

同时也可以查看消费者信息,并可以进行降级处理:

(11)启动监控:在编译好的dubbo-monitor-simple项目中就能拿到dubbo-monitor-simple-2.8.4-SNAPSHOT-assembly.tar.gz包,然后修改一下端口好,确保端口没被占用,然后双击start.bat,访问http://localhost:{你设置的端口号} 即可。

 

重要知识点汇总:

分析dubbo-container包,api中定义了Container接口,具有start和stop两个方法,用于容器的启动和关闭。然后jetty containner 、log4j container 、spring container去实现这个接口。

(1)Dubbo的容器模块,是一个独立的容器,因为服务通常不需要Tomcat/JBoss等Web容器的特性,没必要用Web容器去加载服务。调用Main()入口函数时,会加载dubbo-container-spring下面resource下面的com.alibaba.dubbo.container.Container配置文件,里面是kv结构:spring=com.alibaba.dubbo.container.spring.SpringContainer。

 

然后执行spring container去加载META-INF/spring目录下的所有Spring配置。如代码,所以这里将会读取并解析dubbo-demo-provider包里面的spring配置文件dubbo-demo-provider.xml

 

(2)通过配置文件生成配置类serviceconfig,serviceconfig类里面又通过Registry类去注册中心去注册这个服务,同时根据配置的协议用Exporter类去暴露相关的URL。后续将对源码进行深入剖析~


 

参考资料:

《dubbo官方文档》:http://dubbo.io/User+Guide-zh.htm

Maven实战(六)--- dependencies与dependencyManagement的区别http://blog.csdn.net/liutengteng130/article/details/46991829

《dubbo git地址》:https://github.com/alibaba/dubbo

Dubbo详细介绍与安装使用过程》:http://blog.csdn.net/xlgen157387/article/details/51865289

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
dubbox 修改了kryo序列问题 at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.returnFromResponse(DefaultFuture.java:190) at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:110) at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:84) at com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker.doInvoke(DubboInvoker.java:96) at com.alibaba.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:144) at com.alibaba.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:74) at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:53) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:48) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53) at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:77) at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:227) at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72) at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52) at com.alibaba.dubbo.common.bytecode.proxy1.test(proxy1.java)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值