dubbo 基础入门

时间:2021-09-17 06:32:44

一.什么是dubbo?

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,说白了就是个远程服务调用的分布式框架。

dubbo产生的背景

① 单一应用架构
    当网站很小时,只需要一个项目就可以将所有功能部署到一起,减少部署成本。
    此时用于简化增删改查工作量的数据访问框架(ORM)是关键。
② 垂直应用架构
    当访问量增大时,单一应用增加机器所带来的加速越来越小,此时应当拆分单个项目为互不相干的多个应用,提升效率。
    此时,加速前端页面开发的web框架(MVC)是关键。
③ 分布式服务架构
    当垂直应用越来越多,有很多相同的业务逻辑,这样应用直接的交互不可避免,此时将核心业务抽取出来,作为独立的服务,逐 渐形成稳定的服务中心,以应对快速变化的外部市场环境。
    此时,用于提高业务复用整合的分布式服务框架(RPC)是关键。
④ 流动计算架构
    当服务越来越多,容量的评估,小服务资源浪费等问题逐渐暴露,此时需要一个服务治理工具来管理集群容量,提高利用率。
    此时,提高资源利用率的资源调度和服务治理中心(SOA)是关键。
 
而Dubbo就是资源调度和服务治理中心的管理工具。
 
dubbo其核心部分包含:
1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

二.为什么使用dubbo?

1.webservice:效率不高基于soap协议,项目中不建议使用,但它的优点在于跨语言通信,适用于不同公司相互调用接口。
2.使用restful形式服务:http+json。很多项目中的应用,如果服务太多,系统之间调用关系混乱,需要治疗服务。
3.使用dubbo。使用rpc协议进行远程调用,之间使用socket通信,传输效率高,并且可以统计出系统之间的调用关系、调用次数。
 
dubbo能做什么
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。      
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
 
一般 nginx+tomcat
         | ----> Controller1--------->service1
请求----->nginx  |
         |----->Controller2--------->service2
请求进了Controller 就只有一条路可以走了
 
使用dubbo后
              | ------->service1
请求------>Controller---->   |
              |---------->service2
简单的说 也就是 一个Contoller 我可以部署多个 service   。 
 
一般的mvc项目 包含 Controller、Servicei、ServiceImpl、dao三层
使用doubbo我们可以把项目拆分:
Controller 作为 “消费着” 一个项目
ServiceImpl +dao 作为 “提供者” 一个项目
Servicei “接口” 可以作为一个项目
我们可以部署多个“提供着”。。。。。。。。。。。。。。。。。。。
 
dubbo缺点是什么
由于dubbo是通过java编写的,dubbo最大的缺点就出现了,它只适用于java系统间的通信。

三.Dubbo的架构

dubbo 基础入门

角色说明
Provider:暴露服务的服务提供方
Container:服务运行容器
Consumer:调用服务的消费方
Registry:注册服务与发现服务中心
Monitor:统计服务调用的监控中心(可有可无)
调用关系说明
0:服务运行容器启动,加载服务提供者
1:在启动时告诉注册中心服务方有什么服务
2:消费者调用服务时,先到注册中心订阅所需要服务
3:注册中心返回结果即该服务的地址,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4:消费者通过地址调用服务(此时注册中心没用了)基于软件负载均衡算法,选一台提供者进行调用,如果调用失败,在选另一台调用(单机除外)
5:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次到监控中心
 

Dubbo提供的注册中心有如下几种类型可供选择:

  • Multicast注册中心
  • Zookeeper注册中心   //官方推荐
  • Redis注册中心
  • Simple注册中心

四.如何使用Dubbo

dubbo官方的使用及步骤(基本操作)

Maven dependency

You may need to use the latest release dubbo 基础入门 to build your dubbo application.

自己敲了一遍

dubbo 基础入门

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
package com.alibaba.dubbo.demo;

public interface DemoService {
String sayHello(String name);
}
package com.alibaba.dubbo.demo.provider;
import com.alibaba.dubbo.demo.DemoService; public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello " + name;
}
}
Dubbo使用Spring配置方式,只需用Spring加载Dubbo的配置即可。
服务提供方配置
<?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.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--发布dubbo服务 -->
<!-- 提供方应用信息,用于计算依赖关系 -->
  <dubbo:application name="demo-provider"/>
  <!-- 使用multicast广播注册中心暴露服务地址 --> 
<dubbo:registry address="multicast://224.5.6.7:1234"/>
  <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper--> <dubbo:registry address="zookeeper://localhost:2181"/>//官方推荐
    <!-- 用dubbo协议在20880端口暴露服务 -->  
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>
</beans>
启动服务提供者进行测试
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"META-INF/spring/dubbo-demo-provider.xml"});
context.start();
// press any key to exit
System.in.read();//// 为保证服务一直开着,利用输入流的阻塞来模拟 
}
} 启动
dubbo 基础入门


服务消费方配置
<?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.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!---服务消费方名字,不要和服务提供方一样-->
<dubbo:application name="demo-consumer"/>
  <!--multicast---注册中心-->
<dubbo:registry address="multicast://224.5.6.7:1234"/>
  <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper--> <dubbo:registry address="zookeeper://localhost:2181"/>//官方推荐
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService"/>
</beans>
 

启动服务消费者测试

import com.alibaba.dubbo.demo.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[]{"consumer.xml"});
context.start();
// obtain proxy object for remote invocation
DemoService demoService = (DemoService) context.getBean("demoService");
// execute remote invocation
String hello = demoService.sayHello("world");
// show the result
System.out.println(hello);
}
}

输出结果:

dubbo 基础入门

ZooKeeper的安装与部署参照:https://blog.csdn.net/lihao21/article/details/51778255