dubbo实践

最近公司准备重构内部服务模块,准备使用dubbo,故研究一下。

官方文档:http://alibaba.github.io/dubbo-doc-static/Home-zh.htm

1. 用maven创建一个项目(父模块),将src目录删除:

mvn archetype:generate -DgroupId=com.winter.dubbo -DartifactId=dubbo-parent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DarchetypeCatalog=internal

2. 修改pom.xml文件,将packaging设为pom。并增加以下依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>3.2.5.RELEASE</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.4.9</version>
</dependency>

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.3.3</version>
    <exclusions>
        <exclusion>
        <groupId>com.sun.jmx</groupId>
        <artifactId>jmxri</artifactId>
        </exclusion>
        <exclusion>
        <groupId>com.sun.jdmk</groupId>
        <artifactId>jmxtools</artifactId>
        </exclusion>
        <exclusion>
        <groupId>javax.jms</groupId>
        <artifactId>jms</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
</dependency>

<dependency>
    <groupId>com.netflix.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>1.1.16</version>
</dependency>

3.创建子模块:provider、customer、api

  mvn archetype:generate -DgroupId=com.winter.dubbo -DartifactId=provider -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DarchetypeCatalog=internal

  mvn archetype:generate -DgroupId=com.winter.dubbo -DartifactId=customer -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DarchetypeCatalog=internal

  mvn archetype:generate -DgroupId=com.winter.dubbo -DartifactId=api -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DarchetypeCatalog=internal

将provider、customer、api模块移到父模块目录下,同时在父模块下的pom.xml文件中增加模块依赖:

<modules>    <module>provider</module>    <module>customer</module>    <module>api</module></modules>

分别修改provider、customer、api模块的pom.xml文件,增加一下内容:

  <parent>
      <groupId>com.winter.dubbo</groupId>
      <artifactId>dubbo-parent</artifactId>
      <version>1.0-SNAPSHOT</version>
      <relativePath>../pom.xml</relativePath>
  </parent>

由于provider、customer模块都依赖api模块,记着在它们的pom.xml增加api的依赖:

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

最终形成的目录结构

4. 在api模块中创建相关服务接口

package com.winter.dubbo.api;

public interface DemoService {

    String sayHello(String name);
}

5. 在provider模块中实现相关服务

package com.winter.dubbo.provider;

public class DemoServiceImpl implements DemoService {
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

6. 在provider模块中创建服务提供者、以及服务的实现

package com.winter.dubbo.provider;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ProviderServer {

    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"provider.xml"});
        context.start();
        System.out.println("请按任意键退出");
        System.in.read(); // 按任意键退出
    }

}
package com.winter.dubbo.provider;

import com.winter.dubbo.api.DemoService;

public class DemoServiceImpl implements DemoService {

    public String sayHello(String name) {
        return "Hello " + name;
    }

}

7. 在customer模块中创建消费者

package com.winter.dubbo.customer;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"customer.xml"});
        context.start();
    }
}
package com.winter.dubbo.customer;

import com.alibaba.dubbo.config.annotation.Reference;
import com.winter.dubbo.api.DemoService;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class TestClient {

    @Reference
    private DemoService demoService;

    @PostConstruct
    public void run() {
        String res = demoService.sayHello("Dubbo");
        System.out.println( res ); // 显示调用结果
    }

}

8. 在provider模块的resources下创建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-service"  />

    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <!--  <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" client="zkclient" />

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.winter.dubbo.api.DemoService" ref="demoService" />

    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="com.winter.dubbo.provider.DemoServiceImpl" />

<!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
      <dubbo:annotation package="com.winter.dubbo"/>

</beans>

9. 在customer模块的resources下创建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"  />

    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
    <!--   <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="demoService" interface="com.winter.dubbo.api.DemoService" />
    <!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->    <dubbo:annotation package="com.winter.dubbo"/>

</beans>

10. 测试

先保证zookeeper已经启动,在通过ProviderServer.java启动服务,最后运行customer模块下的Application.java来测试,你就能看到经典的“Hello Dubbo”。

11.详细代码请参考:https://git.oschina.net/winter550/dubbo-demo

时间: 2024-11-05 18:01:48

dubbo实践的相关文章

RPC实践(四)Dubbo实践

Dubbo是一款重要的RPC框架,它是Alibaba开源的分布式服务框架.它主要特点:提供了注册中心来进行服务的管理,支持zookeeper.redis等方式来实现注册中心:Dubbo按照分层的方式来架构,使用这种方式可以使各个层之间解耦合或者最大限度地松耦合:采用的是服务提供者Provider和消费者Consumer这样模型. 一.Dubbo简单介绍 Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. Dubbo有何特

Dubbo实践(五)扩展Spring Schema

先回顾Dubbo实践(一)中定义的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:context=&qu

Dubbo实践(一)入门示例

dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求. 下面将介绍如何搭建一个简单的示例程序(用maven构建). 众所周知,RPC调用涉及到消费者.提供者和接口,所以需要在maven工程warehouse-component-parent里面新建3个模块,分别是warehouse-component-dub

Dubbo实践笔记

注意的地方 默认情况下,cluster=failover.retries=2,意为失败重试两次,不包含原生调用.如需配置不重试,需设置retries=-1,或者使用failfast(快速失败)模式 如果Dubbo接口嵌套Dubbo接口,比如A程序调用B接口,B接口实现中调用C接口.如果按默认重试2次,全部调用失败情况下,最终调用C接口3 * 3 = 9次.我们在Dubbo接口嵌套情况下一般设置为不重试 配置覆盖的规则:(1)方法配置优先级大于接口配置:(2)消费端配置优先级大于提供端配置.规则思

Dubbo实践(十三)Refer

Spring在启动Dubbo客户端应用时,会实例化ReferenceBean<T>并设置配置属性,然后调用ReferenceConfig中的get方法: public synchronized T get() { if (destroyed) { throw new IllegalStateException("Already destroyed!"); } if (ref == null) { init(); } return ref; } private void in

Dubbo实践(十五)消费者引用服务

Refer取得invoker的过程 <!-- 指定了哪种的注册中心,是基于zookeeper协议的,指定了注册中心的地址以及端口号 --> <dubbo:registry protocol="zookeeper" client="zkclient" address="localhost:2181"/> <!-- 引用远程DemoService服务 --> <dubbo:reference id="

Dubbo实践(十)代理

Invoker调用 代理有几种方式:普通代理.JDK.Javassist库动态代理.Javassist库动态字节码代理. 生成代理的目的是你调用invoker的相关函数后,就等同于是调用DubboInvoker中的相关函数,也就是将本地调用转为网络调用并获得结果. // create service proxy return (T) proxyFactory.getProxy(invoker); private static final ProxyFactory proxyFactory = E

转:比较spring cloud和dubbo,各自的优缺点是什么

原文:https://blog.csdn.net/u010664947/article/details/80007767 dubbo由于是二进制的传输,占用带宽会更少 springCloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大 dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决 springcloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级 dubbo的注册中心可以选择zk,redis

ZooKeeper分布式专题与Dubbo微服务入门

第1章 分布式系统概念与ZooKeeper简介对分布式系统以及ZooKeeper进行简介,使得大家对其有大致的了解1-1 zookeeper简介1-2 什么是分布式系统1-3 分布式系统的瓶颈以及zk的相关特性 第2章 ZooKeeper安装如何安装ZooKeeper以及对ZooKeeper最基本的数据模型进行剖析2-1 JDK的安装2-2 zookeeper下载.安装以及配置环境变量2-3 zookeeper文件夹主要目录介绍2-4 zookeeper配置文件介绍,运行zk 第3章 ZooKe