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