Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求;这容易和负载均衡弄混,负载均衡是对外提供一个公共地址,请求过来时通过轮询、随机等,路由到不同server。目的分摊压力。dubbo在淘宝也是解决他们实际问题的,不一定适合其他。
原理就是:A系统调用B系统接口服务, 后面就是怎么把这个流程,动态化(zookeeper通知)、权限化、配置化、低耦合化、自动化。
其核心部分包含:
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,需一个治理系统确保架构有条不紊的演进。
目前市场一些基本的架构:
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。
在大规模服务化之前,一般只是简单的暴露和引用远程服务,通过配置url进行调用,用f5或者nginx等进行负载均衡;
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
0.服务容器负责启动,加载,运行服务提供者。
1 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小
监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示
服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销
服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销
注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
注册中心和监控中心都是可选的,服务消费者可以直连服务提供者
监控中心宕掉不影响使用,只是丢失部分采样数据
数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
注册中心对等集群,任意一台宕掉后,将自动切换到另一台
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
服务提供者无状态,任意一台宕掉后,不影响使用
服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复
注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心
服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者
当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力:
Dubbo提供的注册中心有如下几种类型可供选择:
Multicast注册中心
Zookeeper注册中心
Redis注册中心
Simple注册中心
ZooKeeper是一个开源的分布式服务框架,它是Apache Hadoop项目的一个子项目,主要用来解决分布式应用场景中存在的一些问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置管理等,它支持Standalone模式和分布式模式,在分布式模式下,能够为分布式应用提供高性能和可靠地协调服务,而且使用ZooKeeper可以大大简化分布式协调服务的实现,为开发分布式应用极大地降低了成本。
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
1、启动zookeeper
参考上一篇博客:https://mp.csdn.net/mdeditor/97176024#
2. 建立项目
2.1首先创建一个maven父项目
创建过程参考:https://blog.csdn.net/u014429653/article/details/97181403
创建完成后可删除src文件夹,父项目用不到这个文件夹;
2.2接着创建DubboDemoApi、DubboDemoProvider、DubboDemoConsumer
一共分三个模块,每个模块都有独立的pom文件。
稍微说明一下三个模块的作用。DubboDemoApi内为公用接口,DubboDemoProvider提供远程服务,DubboDemoConsumer调用远程服务。
2.3 在DubboDemoApi内添加接口
写一个sayHello的方法
public interface DemoService {
String sayHello(String name);
}
然后打成一个jar包
然后找到jar包对应的信息,利于下一步进行
2.4在DubboDemoProvider的pom.xml中添加依赖
com.alibaba
dubbo
2.5.3
spring
org.springframework
com.101tec
zkclient
0.9
com.ali.dubbo
DubboDemoApi
1.0-SNAPSHOT
org.springframework
spring-context
5.1.0.RELEASE
compile
io.netty
netty-all
4.1.37.Final
在DubboDemoConsumer的pom.xml中添加依赖
com.alibaba
dubbo
2.5.3
spring
org.springframework
com.101tec
zkclient
0.9
com.ali.dubbo
DubboDemoApi
1.0-SNAPSHOT
org.springframework
spring-context
5.1.0.RELEASE
compile
2.5 在DubboDemoProvider中实现接口
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
return "Hello " + name + ", response form provider: " + RpcContext.getContext().getLocalAddress();
}
}
注意:此处@Service、@Override注解可不加,不影响;
引入import org.springframework.stereotype.Service;spring提供服务
或者import com.alibaba.dubbo.config.annotation.Service; 暴露远程服务,不影响;
2.6 在DubboDemoProvider中resources文件夹下添加配置文件provider.xml
然后在provider.xml中添加以下内容
2.7创建Provider.java,然后启动,启动前先启动zookeeper
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"provider"});
context.start();
System.out.println("----------------服务已启动,按任意键结束···········--------------------");
System.in.read(); // press any key to exit
}
}
DubboDemoProvider结构如下:
2.8 在DubboDemoConsumer中resources文件夹下添加配置文件consumer.xml
2.9 在DubboDemoConsumer中创建Consumer.java,然后启动,启动之前必须先启动Provider
public class Consumer {
public static void main(String[] args){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-consumer.xml"});
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxy
String hello = demoService.sayHello("world"); // call remote method
System.out.println(hello);
}
}
3.运行项目
先启动zookeeper,启动成功后启动provider,最后启动consumer
再运行Provider.java
再运行Consumer.java,成功调用
dubbo-admin有两种方法运行
dubbo-admi再github上下载地址https://github.com/apache/dubbo/tree/2.5.x
注意:在github上的branch上选择2.5.x上有的,master分支上没有dubbuo-admin
进入dubbo-admin这个文件目录 运行命令:
mvn package -Dmaven.skip.test=true
看到如下结果,说明打包成功了:
打包成功之后,就会发现dubbo-admin下多了个target文件夹,打开target文件夹,发现里面有个war包:
我们得到dubbo-admin-2.5.10.war,下面我们将这个war包部署到tomcat上。
把dubbo-admin-2.5.10.war放到tomcat的webapps目录下;
启动tomcat,让tomcat把war解压了
划重点:如果一直提示unable to open the service ‘tomcat’,那么重新安装一个tomcat(注意一定要使用tomcat安装包,重新安装,不是解压可用那种),以上是在笔记本win7上测试通过;
另外在台式机win10上也可以用解压版tomcat,测试通过*
tomcat的webapps里面就会多了这个文件夹:
运行tomcat之前必须先运行zookeeper,zookeeper启动默认端口是8080,但是tomcat服务是8080在用,会冲突,启动前需要修改zookeeper端口为9091
去zoo.cfg文件中修改端口号,输入admin.serverPort=9091
在浏览器输入:http://localhost:8088/dubbo-admin-2.5.10/
查找dubbo-admin的用户名和密码,去dubbo-admin下面查找dubbo.properties
用户名:root 密码:root
用户名:guest 密码:guest
在dubbo加入apache后,github地址也变了。dubbo-admin需要从https://github.com/apache/incubator-dubbo-ops下载。,必须切换到master分支
将项目克隆到本地后,可以看到dubbo-admin模块。
值得注意的是,最新的dubbo-admin集成了springboot,可以打包为jar运行。
进入dubboadmin项目 修改application.properties文件
dubbo-admin\src\main\resources\application.properties;zookeeper改为自己电脑安装的
cmd到在dubbo-admin下,执行mvn package -DskipTests=true
,将dubbo-admin打成jar包。
打包完成后,我们会在dubbo-admin/target下看到dubbo-admin的jar包 。
注意:dubbo-admin的端口默认是7001,dubbo注册中心的地址是本机的2181端口
PS:注意必须先运行本机的zookeeper
运行jar包
启动后,浏览器输入http://localhost:7001即可访问,默认的用户名密码输入root,即进入首页。
监控平台与管理平台一样,不是必须品,仅仅作为统计服务的调用次调和调用时间的监控中心
下载地址:https://github.com/apache/incubator-dubbo-ops/tree/master
进入dubbo-monitor-package这个文件目录 (在pom.xml目录直接执行命令)运行命令:
mvn clean package -Dmaven.skip.test=true
执行完成后,会生成target文件夹,内有一个压缩文件dubbo-monitor-simple-2.0.0-assembly.tar.gz
解压该文件后如下:
conf目录下有dubbo.properties配置文件
dubbo.registry.address=zookeeper://127.0.0.1:2181(添加注册中心)
dubbo.protocol.port=7070:服务消费者和提供者通过该端口发送统计信息到monitor(监控平台)
dubbo.jetty.directory:7010:监控平台的端口,这里使用的是jetty容器,作用同tomcat
进入assembly.bin目录,执行start.bat即可
访问7010端口服务:http://localhost:7010/
这就是我们监控中心,如果想监控到我们的消费者和服务者使用情况,需要在消费者和服务提供者工程中进行相关的配置:
修改dubbo的消费者和提供者的配置文件,追加
http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-monitor.html
重新启动消费者和服务提供者:
可以看到Services点进去有我们服务提供者发布的服务列表:
点击 Providers(1),可以看到提供者的详细信息,即提供者的URL
点击Consumers(1),可以看到消费者的详细信息,即消费者的URL
点击Statistics,成功的次数,失败的次数,平均花费的时间,最大花费的时间,并发的次数。
点击Charts,可以看到请求和响应的图表。