Dubbo入门教程

Dubbo

一款分布式服务框架
高性能和透明化的RPC远程服务调用方案
SOA服务治理方案
每天为2千多个服务提供大于30亿次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点以及别的公司的业务中。

Dubbo架构

Dubbo入门教程_第1张图片
ps:图片来源于网络

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

调用流程
0.服务容器负责启动,加载,运行服务提供者。
1.服务提供者在启动时,向注册中心注册自己提供的服务。
2.服务消费者在启动时,向注册中心订阅自己所需的服务。
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

Dubbo注册中心
对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;
对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。
而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。

通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。

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

Multicast注册中心
Zookeeper注册中心
Redis注册中心
Simple注册中心
Dubbo优缺点

优点

透明化的远程方法调用

  • 像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。
    软负载均衡及容错机制
    可在内网替代nginx lvs等硬件负载均衡器。
    服务注册中心自动注册 & 配置管理
    -不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。
    使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。
    服务接口监控与治理
    -Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。

缺点

只支持JAVA语言
Dubbo入门Demo
了解了Dubbo以后,自然要搭建一个简单的Demo实现。本文采用Dubbo与Zookeeper、Spring框架的整合。

主要是以下几个步骤:

  1. 安装Zookeeper,启动;
  2. 创建MAVEN项目,构建Dubbo+Zookeeper+Spring实现的简单Demo;
  3. 安装Dubbo-admin,实现监控。

1、 Zookeeper介绍与安装
本Demo中的Dubbo注册中心采用的是Zookeeper。为什么采用Zookeeper呢?

Zookeeper是一个分布式的服务框架,是树型的目录服务的数据存储,能做到集群管理数据 ,这里能很好的作为Dubbo服务的注册中心。

Dubbo能与Zookeeper做到集群部署,当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,当提供者重启时,能自动恢复注册数据,以及订阅请求

具体的安装方法在此不一一叙述,可参考博文:zookeeper安装教程
安装完成后,进入到bin目录,并且启动zkServer.cmd,这个脚本中会启动一个java进程:
(注:需要先启动zookeeper后,后续dubbo demo代码运行才能使用zookeeper注册中心的功能)
Dubbo入门教程_第2张图片

2 、创建MAVEN项目

项目结构:
主要分三大模块:
dubbo-api : 存放定义的服务接口;
dubbo-consumer : 服务消费者;
dubbo-provider : 服务提供者(也是服务接口实现者)

Dubbo入门教程_第3张图片

公共依赖pom.xml



  4.0.0
  dubbo
  dubbo
  1.0.0
  pom
  this is fist dubbo demo
  
    dubbo-consumer
    dubbo-provider
    dubbo-api
  
  
  
    1.8
    1.8
    UTF-8
    UTF-8
    
    4.2.5.RELEASE
    
    3.2.8
    
    5.1.29
    
    1.7.18
    1.2.17
  
  
  
      
      junit
      junit
      3.8.1
      test
    
    
    
      jstl
      jstl
      1.2
    
    
      javax
      javaee-api
      7.0
    
    
    
      junit
      junit
      4.11
      
      test
    
    
    
      org.springframework
      spring-core
      ${spring.version}
    
    
      org.springframework
      spring-web
      ${spring.version}
    
    
      org.springframework
      spring-oxm
      ${spring.version}
    
    
      org.springframework
      spring-tx
      ${spring.version}
    
    
      org.springframework
      spring-jdbc
      ${spring.version}
    
    
      org.springframework
      spring-webmvc
      ${spring.version}
    
    
      org.springframework
      spring-context
      ${spring.version}
    
    
      org.springframework
      spring-context-support
      ${spring.version}
    
    
      org.springframework
      spring-aop
      ${spring.version}
    
    
      org.springframework
      spring-test
      ${spring.version}
    
    
    
      org.mybatis
      mybatis
      ${mybatis.version}
    
    
    
      org.mybatis
      mybatis-spring
      1.2.2
    
    
    
      mysql
      mysql-connector-java
      ${mysql-driver.version}
    
    
    
      commons-dbcp
      commons-dbcp
      1.2.2
    
    
    
      com.alibaba
      fastjson
      1.2.22
    
    
    
      log4j
      log4j
      ${log4j.version}
    
    
      org.slf4j
      slf4j-api
      ${slf4j.version}
    
    
      org.slf4j
      slf4j-log4j12
      ${slf4j.version}
    
    
    
    
      org.codehaus.jackson
      jackson-mapper-asl
      1.9.13
    
    ;
    
      com.fasterxml.jackson.core
      jackson-core
      2.8.0
    
    ;
    
      com.fasterxml.jackson.core
      jackson-databind
      2.8.0
    
    
      commons-fileupload
      commons-fileupload
      1.3.1
    
    
      commons-io
      commons-io
      2.4
    
    
      commons-codec
      commons-codec
      1.9
    
    
      org.quartz-scheduler
      quartz
      2.2.1
    
    
      org.apache.shiro
      shiro-core
      1.3.2
    
    
      org.apache.shiro
      shiro-web
      1.3.2
    
    
      org.apache.shiro
      shiro-spring
      1.3.2
    
    
      org.apache.shiro
      shiro-ehcache
      1.3.2
    
    
      org.apache.zookeeper
      zookeeper
      3.4.9
    
    
    
      com.alibaba
      dubbo
      2.5.3
      
        
          org.springframework
          spring
        
      
    
    
      com.101tec
      zkclient
      0.10
    
  
  
  
    dubbo
  

下面,我为大家具体讲解三个子项目。

1、服务接口dubbo-api

pom.xml



  4.0.0
  
    dubbo
    dubbo
    1.0.0
  
  dubbo
  dubbo-api
  1.0.0
  dubbo-api
  http://maven.apache.org
  
    UTF-8
  
  
    
      junit
      junit
      3.8.1
      test
    
  

DemoService.java

package com.dubbo.api.demo;
/**
 * 
* @ClassName: DemoService
* @Description: 定义服务接口
* @author chenqi
* @date 2018年10月4日
*
 */
public interface DemoService {
    
    String helloDubbo(String str);
}

2、 服务提供者(也是服务接口实现者)dubbo-provider

pom依赖



  4.0.0
  
    dubbo
    dubbo
    1.0.0
  
  
  dubbo-provider
  dubbo-provider
  服务提供者
  http://maven.apache.org
  
  
    UTF-8
  
  
  
      
    
    
      dubbo
      dubbo-api
      ${project.version}
    
  
    
      junit
      junit
      3.8.1
      test
    
  
  

配置文件provider.xml



    
    
    
    
    
    
    
    
    
    

服务接口实现类(用于提供服务)
实现服务接口,此实现对消费者隐藏

package com.dubbo.provider.demo;
import com.dubbo.api.demo.DemoService;
/**
 * 
* @ClassName: DemoServiceImpl
* @Description: 服务接口实现类(用于提供服务)
* @author chenqi
* @date 2018年10月4日
*
 */
public class DemoServiceImpl implements DemoService {
    
    /**
     * 实现  DemoService  中的 helloDubbo 接口
     */
    public String helloDubbo(String str) {
        return "hello " + str;
    }
}

服务启动类

package com.dubbo.provider.demo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
 * 
* @ClassName: Provider
* @Description: 服务启动类
* @author chenqi
* @date 2018年10月4日
*
 */
public class ProviderApplication {
    
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
        System.out.println(context.getDisplayName() + ": here");
        context.start();
        System.out.println("服务已经启动...");
        System.in.read();
    }
}

3、服务消费者dubbo-consumer

pom依赖



  4.0.0
  
    dubbo
    dubbo
    1.0.0
  
  
  dubbo-consumer
  dubbo-consumer
  服务消费者
  http://maven.apache.org
  
  
    UTF-8
  
  
  
  
      
    
      dubbo
      dubbo-api
      ${project.version}
    
    
    
      junit
      junit
      3.8.1
      test
    
  
  

配置文件consumer.xml
通过Spring配置引用远程服务:



    
    
    
    
    

测试服务消费者获取服务接口

package com.dubbo.consumer.demo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dubbo.api.demo.DemoService;
/**
 * 
* @ClassName: ConsumerTest
* @Description: 测试服务消费者获取服务接口
* @author chenqi
* @date 2018年10月7日
*
 */
public class ConsumerTest {
    public static void main(String[] args) {
        //测试常规服务
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("consumer.xml");
        context.start();
        System.out.println("consumer start");
        DemoService demoService = context.getBean(DemoService.class);
        System.out.println("consumer");
        System.out.println(demoService.helloDubbo("dubbo"));
    }
}

OK,下面我们依次启动服务提供者和服务消费者,注意确保provider已被运行后再启动consumer
启动服务提供者:
Dubbo入门教程_第4张图片
启动报了点错误,暂时忽略。

运行消费者进行测试:
Dubbo入门教程_第5张图片

可以看到,消费者成功调用提供者所提供的远程服务。当然,这只是一个模拟的项目,实际中有多提供者多消费者情况,比这要复杂的多,当然只有这样才能体现dubbo的特性。

Dubbo管理控制台介绍

管理控制台功能

路由规则,动态配置,服务降级
访问控制,权重调整
负载均衡
Dubbo入门教程_第6张图片

网上自行下载dubbo-admin,下载后是一个war包,直接放到tomcat安装目录的webapps目录下,然后启动tomcat即可
Dubbo入门教程_第7张图片

Dubbo入门教程_第8张图片

浏览器访问:http://localhost:28080/dubbo-admin/
输入用户名密码 root

Dubbo入门教程_第9张图片

查看服务提供者

Dubbo入门教程_第10张图片

查看服务消费者
Dubbo入门教程_第11张图片

通过上面的内容,相信大家应该对dubbo有了初步的认知和了解。

ps:如果该文章有帮助到您,就点个赞吧!您的支持与肯定是我持续更新最大的动力。

你可能感兴趣的:(dubbo)