dubbo入门示例

本文主要介绍阿里dubbo的基本使用,关于dubbo的相关基础概念请自行参考dubbo官网:http://www.dubbo.io

dubbo是一个服务治理的框架,在如今大规模的分布式应用和SOA架构中,服务治理的问题显的尤为的重要。

以我个人使用dubbo的场景来总结,dubbo主要解决如下问题:

  1.项目服务化后,项目之间的高性能通讯问题。(项目被拆分成多个服务模块后必然会涉及模块之间的通讯)

  2.服务的URL管理,当项目拆分为N个服务并且不断增加时,如何有效的管理的服务URL

  3.服务发现和服务移除,动态的管理服务

带着以上三个问题开始dubbo的学习和入门demo的开发。

示例项目分为三个,分别是:

  1. dubbo-api:提供统一的接口,最终会打为jar包,供consumer和provider引用

  2.dubbo-provider:服务提供者,包含api接口的实现类,提供服务的实现逻辑

  3.dubbo-consumer:该项目是一个web项目,有几个作用,首先该项目以http的形式提供前端和浏览器访问的接口,

    其次,该项目也是dubbo消费者,用来消费dubbo-provider项目提供的服务。所以该项目可以通过浏览器调用接口测试,

    也可以使用postman或者前端js来调用进行测试,比较接近真实环境的使用场景。

首先开发dubbo-api:

  项目结构如下图:

  

  该项目只有一个文件,是一个接口,他定义了统一的接口让provider和consumer来引用,接口文件内容如下:

  

public interface UserService {
    String sayHi(String name);
}

很纯粹的一个java接口,不再多解释什么了。

在该项目的classpath路径下提供了一个xml配置,该配置文件其实就是dubbo消费者的相关配置,后边消费者项目引入api之后可以直接使用该文件。

文件内容如下:

<?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:reference id="userService" interface="com.dubbo.api.UserService" cluster="failfast" check="false"/>
</beans>

抛开xml头文件,该文件的内容也只有一行而已,通过<dubbo:reference>标签来引用服务配置。

其次是该项目的pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.demo.dubbo</groupId>
    <artifactId>dubbo-api</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.5.RELEASE</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

pom文件中在引入dubbo包时,排除掉了dubbo自带的spring引用,因为dubbo自带的spring依赖版本过低,我们使用自己导入的spring版本

到此位置dubbo-api项目已开发完成。

通过maven将其打成jar包,一会consumer和provider需要引入该包。

接着我们开发dubbo-provider,项目结构如下:

  

该项目只有两个类,一个是服务实现类UserServiceImpl,代码如下:

public class UserServiceImpl implements UserService {
    public String sayHi(String s) {
        return "hello " + s + "!";
    }
}

另外一个Main文件是启动dubbo服务的,内容如下:

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

该类是dubbo框架提供,作用是启动dubbo服务,dubbo会在启动服务时,读取classpath下一个名为dubbo.properties文件的属性值。

并指定了属性key,只要按照dubbo的规则配置相关参数即可。有兴趣的可以去查看下dubbo的源码。

dubbo.properties文件配置如下:

dubbo.container=spring
#set dubbo Sping load setting xmls
dubbo.spring.config=classpath:dubbo-provider.xml
dubbo.protocol.name=dubbo
dubbo.protocol.port=28511

dubbo.container指定了dubbo的容器使用spring,dubbo内部有四种容器实现,SpringContainer是其中一种,也是默认的容器

dubbo.spring.config指定了dubbo在启动服务时加载的spring配置文件。

dubbo.protocol.name和dubbo.protocol.port分别指定使用的协议名和端口

贴一下dubbo的源码,SpringContainer类中定义了两个常量,SPRING_CONFIG和DEFAULT_SPRING_CONFIG,

大概读一下代码就可以知道,start方法在执行时,会读取dubbo.spring.config属性值,该值指定的就是spring的配置文件,如果没读到,则使用默认的配置

默认配置为classpath下META-INF/spring/*.xml,意思是读取classpath下META-INF文件夹下的spring文件夹中的所有xml文件。

所以我们也可以不配置dubbo.spring.config,但是要遵循dubbo默认的读取路径,将spring配置文件放置在META-INF/spring文件夹下。

接下来看dubbo-provider.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.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <dubbo:application name="dubbo-provider"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <dubbo:provider cluster="failfast"/>
    <bean id="userService" class="com.dubbo.provider.UserServiceImpl"/>
    <dubbo:service interface="com.dubbo.api.UserService" ref="userService"/>
</beans>

该文件其实就是一个spring配置文件,只不过引入了dubbo相关的配置。

<dubbo:application>指定了程序名称,我们可以在dubbo管理后台中通过该名称更清晰的区分服务

<dubbo:registry>指定了注册中心的地址

<dubbo:provider>指定了集群容错模式,此处为快速失败

<bean> 普通的spring依赖注入

<dubbo:service>服务导出,引用<bean>标签注入的类

最后来看下provider项目的pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yinyuetai.dubbo</groupId>
    <artifactId>dubbo-provider</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.demo.dubbo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>

</project>

此处引入了zk相关的包,因为服务提供者在启动时会向注册中心注册服务。

此处的provider引入了dubbo-api的jar包。

到此位置,provider项目的开发已经完成。

最后来看dubbo-consumer这个web项目,相对来说也是三个项目中最为负责的一个。

项目结构:

UserController类就是个控制器,使用requestMapping注解提供http接口服务,内容如下:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/hello.html")
    @ResponseBody
    public String sayHello(String name) {
        String welcome = userService.sayHi(name);
        return welcome;
    }
}

接下来看配置文件,首先看web.xml:

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

    <!-- 配置Spring配置文件路径 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:spring-config.xml
        </param-value>
    </context-param>
    <!-- 配置Spring上下文监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

</web-app>

<context-param>配置了spring配置文件的位置

下边servlet中配置spring-mvc配置文件的位置,都是spring开发的基本配置。不多解释了

spring-config.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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
       default-autowire="byName">

    <!-- 开启注解配置 -->
    <context:annotation-config/>

    <import resource="classpath:dubbo-consumer.xml"/>

</beans>

开启了注解支持,并且通过import导入了另一份配置文件

dubbo-consumer.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.xsd
    http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application name="dubbo-consumer"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <dubbo:consumer check="false"/>

    <!-- 导入dubbo配置 -->
    <import resource="classpath*:user-reference.xml"/>
</beans>

该配置指定了应用程序的名称,注册中心地址,以及dubbo-api项目中定义的dubbo配置文件。

spring-mvc.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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 配置自动扫描的包路径 -->
    <context:component-scan base-package="com.dubbo.consumer.web"/>
</beans>

仅仅定义了自动扫描的包路径而已

最后看下pom文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yinyuetai.dubbo</groupId>
    <artifactId>dubbo-consumer</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>dubbo-consumer Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.demo.dubbo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>dubbo-consumer</finalName>
    </build>
</project>

到此。dubbo的入门demo已经全部开发完成。

先通过Main.java中的main方法 启动dubbo-provider项目。

然后将dubbo-consumer项目打成war包,部署到tomcat或其他web容器中。

在浏览器中访问:localhost:tomcatport/dubbo-consumer/hello.html?name=test

tomcatport换成你本地的tomcat端口号

可以看到浏览器输出:

说明我们的项目已经成功部署,可以成功调用了。

此时观察dubbo管理后台,可以看到如图所示:

两个应用分别对应我们开发的provider和consumer,而名字则是由<dubbo:application name>指定的。

一个消费者,一个服务提供者,和我们开发的东西完全吻合。到此为止dubbo的入门示例已经全部完成。

相关的代码放在了码云,懒的动手的可以直接下载运行看看效果。

码云地址:

dubbo-api:https://git.oschina.net/li_mingzhu/dubbo-api.git

dubbo-provider:https://git.oschina.net/li_mingzhu/dubbo-provider.git

dubbo-consumer:https://git.oschina.net/li_mingzhu/dubbo-consumer.git

关于dubbo管理后台,其实就是一个war包,只要部署在web容器运行即可。

暂时还没有整理关于dubbo管理后台部署的文章,后续整理了我会补发链接。

时间: 2024-10-10 14:19:26

dubbo入门示例的相关文章

Spring MVC 入门示例讲解

MVC框架是什么 Dispatcher Servlet(Spring控制器) Spring入门示例 运行时依赖库 web.xml和spring-servlet.xml文件配置 请求控制器EmployeeController.java 视图模型EmployeeVO.java Dao类 业务层类 视图employeeListDisplay.jsp MVC框架是什么 模型-视图-控制器(MVC)是一个众所周知的以设计界面应用程序为基础的设计模式.它主要通过分离模型.视图及控制器在应用程序中的角色将业务

SpringMVC 入门示例讲解

首先要了解什么是MVC,MVC全称是Model View Controller,是模型(Model)-视图(View)和控制器(Controller)的缩写,一种软件设计典范,用一种业务逻辑·.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 伯乐在线-ImportNew:       http://www.importnew

ehcache2.8.3入门示例:hello world

一.pom.xml 依赖项 1 <dependency> 2 <groupId>net.sf.ehcache</groupId> 3 <artifactId>ehcache</artifactId> 4 <version>2.8.3</version> 5 </dependency> 6 7 <dependency> 8 <groupId>org.slf4j</groupId>

OpenCV 入门示例之五:一个复杂点的变换

前言 前文介绍了一个简单的变换.需要注意的是,很多时候,输出和输入图像的格式是不同的( 大小,深度,通道 ).在本文将展示的程序中,对图像进行了缩放( 使用cvPyrDown 函数 ),这种情况下需要先定制好输出图像的格式,然后再将其与输入图像一起传递进缩放函数. 代码示例 1 // 此头文件包含图像IO函数的声明 2 #include "highgui.h" 3 // 此头文件包含基本的图像处理函数和高级计算机视觉算法 4 #include "cv.h" 5 6

Dubbo入门---搭建一个最简单的Demo框架

Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. 缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护 垂直应用框架(MVC) 垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率. 缺点:但是在垂直架构

Android OpenGL入门示例:绘制三角形和正方形 (附完整源码)

Android上对OpenGl的支持是无缝的,所以才有众多3D效果如此逼真的游戏,在Camera的一些流程中也有用到GLSurfaceView的情况.本文记录OpenGL在Android上的入门级示例,绘制一个三角形和正方形.尽管功能简单,可是我捣腾了好几个晚上,大量网上文章上的代码都有点问题,不是绘制不出来就是挂了. 第一个文件:MainActivity.java package com.example.learnopengl1; import android.opengl.GLSurface

OpenCV 入门示例之四:一个简单的变换

前言 图像的平滑处理,是计算机视觉中非常重要的操作,本文将展示一个可以对图像进行平滑处理的简单程序.而关于平滑处理深层次的知识,会在以后的文章中重点探讨. 代码示例 1 // 此头文件包含图像IO函数的声明 2 #include "highgui.h" 3 // 此头文件包含基本的图像处理函数和高级计算机视觉算法 4 #include "cv.h" 5 6 int main (void) { 7 8 // 将D盘目录下名为" 1.jpg "的图像

Activiti 入门示例

设置流程定义图bpmn     assignee :申请人.审核人 相关操作的表 -- act_re_procdef 流程定义表-- act_re_deployment 部署表 -- act_ge_property 通用属性表  id 生成策略  -- act_ru_execution  执行对象,流程实例,流程对象-- act_ru_task 任务表 入门示例: 1. 创建流程引擎及工作流数据表     - 数据库及表可以自动创建,       可以在配置数据库连接时,实现自动创建数据库和表 

OpenCV 入门示例之一:显示图像

前言 本文展示一个显示图像的示例程序,它用于从硬盘加载一副图像并在屏幕上显示之. 代码示例 OpenCV 入门示例之一:显示图像,布布扣,bubuko.com