Dubbo入门(一)-环境搭建

Dubbo原理图

前言

Dubbo是一个远程调用框架,我们要使用Dubbo的话必须要搭建一套注册中心,Dubbo支持的注册中心非常多,它支持MulticastZookeeperNacosRedisSimple作为注册中心,而Dubbo他推荐使用Zookeeper作为它的注册中心。

Dubbo 社区目前主力维护的有 2.6.x 和 2.7.x 两大版本,其中2.6.x仍然放在Alibaba Group中,而2.7.x已经放在了Apache Group中了。

本文记录了我搭建一套Dubbo测试环境的过程,其中我搭建了Zookeeper、Dubbo-admin两个服务,然后创建了一个用户服务和一个管理服务,管理服务作为消费者去调用用户服务中的方法。

搭建Zookeeper

为了最大化简便的把环境搭建好,我这里使用了Docker启动了一个Zookeeper容器。

docker run -tid --name dev-zookeeper -p 2181:2181  zookeeper

搭建Dubbo-admin

dubbo-admin官方git地址

1、下载源码

git clone https://github.com/apache/dubbo-admin.git

项目是一个前后端分离的项目,其中:

  • dubbo-admin-ui:使用vue开发的前端项目
  • dubbo-admin-server:使用springboot开发的主项目

2、修改注册中心地址

需要确定 dubbo-admin/dubbo-admin-server/src/main/resources/application.properties 文件中。

Dubbo 2.6版本所有数据都存在注册中心上,Dubbo 2.7版本分成了注册中心,配置中心,和元数据中心。

本记录中我使用的是Dubbo 2.7。

# 注册中心地址
admin.registry.address=zookeeper://127.0.0.1:2181
# 配置中心地址
admin.config-center=zookeeper://127.0.0.1:2181
# 元数据暴露地址
admin.metadata-report.address=zookeeper://127.0.0.1:2181

3、打包启动

dubbo-admin是一个标准的前后端分离项目,部署方式有许多中,我这里使用比较简单的方法,将前端打包,再放到后端项目中一起打包了。

# 进入dubbo-admin-ui 打包前端
➜  ✗ cd dubbo-admin-ui  
# 安装依赖库
➜   ✗ npm install
➜   ✗ npm run build
➜   ✗ cp -r target/dist/* ../dubbo-admin-server/src/main/resources/static/
➜   ✗ cd ../dubbo-admin-server
➜   ✗ mvn clean package
➜   ✗ java -jar target/dubbo-admin-server-0.2.0-SNAPSHOT.jar
dubbo-admin界面

编写Demo

Dubbo 官方建议将服务接口,服务模型,服务异常等均放在 API 包中,因为服务模型及异常也是 API 的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。
如果需要,也可以考虑在 API 包中放置一份 spring 的引用配置,这样使用方,只需在 spring 加载过程中引用此配置即可,配置建议放在模块的包目录下,以免冲突,
服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo 暂未提供分布式事务支持。
服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸。不建议使用过于抽象的通用接口,如:Map query(Map),这样的接口没有明确语义,会给后期维护带来不便。

common-api

common-api是定义的接口包。

├── common-api 
│   ├── pom.xml
│   └── src
│       ├── main
│       │   ├── java
│       │   │   └── com
│       │   │       └── martain
│       │   │           └── study
│       │   │               ├── IAdminService.java
│       │   │               ├── IUserService.java
│       │   │               └── vo
│       │   │                   └── UserVO.java 

UserVO.java

@Data
public class UserVO implements Serializable {

    private String id;

    private String userName;

    private Integer age;

    private String email;

}

IUserService.java

public interface IUserService {
    UserVO getUserById(String userId);
}

IAdminService.java

public interface IAdminService {
    UserVO findUserById(String userId);
} 

spring-provider-user

服务提供者需要实现接口的方法,并将服务注册到注册中心去。

└── spring-provider-user
    ├── pom.xml
    ├── spring-provider-user.iml
    └── src
        ├── main
        │   ├── java
        │   │   └── com
        │   │       └── martain
        │   │           └── study
        │   │               ├── Application.java
        │   │               └── service
        │   │                   └── UserService.java
        │   └── resources
        │       └── provider.xml

pom.xml

这里使用的是Dubbo 2.7.x ,如果使用Dubbo 2.6.x的话会有些不同。


    <dependencies>
        <!-- 引入接口包 --> 
        <dependency>
            <groupId>com.martain.study</groupId>
            <artifactId>common-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency> 
        <!-- 引入dubbo --> 
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!--zookeeper 注册中心客户端引入 使用的是curator客户端 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.4.1</version>
            <type>pom</type>
        </dependency>
    </dependencies> 

UserService.java

IUserService的接口实现类。

public class UserService implements IUserService {

    public UserVO getUserById(String userId) {
        UserVO userVO = new UserVO();
        userVO.setId(userId);
        userVO.setUserName("user-"+userId);
        userVO.setAge(18);
        userVO.setEmail(userId+"@qq.com");
        return userVO;
    }
}

provider.xml

这里需要配置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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
            ">
    <!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
    <dubbo:application name="user-provider-service"></dubbo:application>

    <!-- 2、指定注册中心的位置 -->
    <!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>

    <!-- 3、指定通信规则(通信协议?通信端口) -->
    <dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>

    <!-- 4、暴露服务   ref:指向服务的真正的实现对象 -->
    <dubbo:service interface="com.martain.study.IUserService" ref="userServiceImpl" >
        <dubbo:method name="getUserById" timeout="3000"></dubbo:method>
    </dubbo:service>

    <!-- 服务的实现 -->
    <bean id="userServiceImpl" class="com.martain.study.service.UserService"></bean>

</beans>

Application.java

public class Application {

    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext ioc = new        ClassPathXmlApplicationContext("provider.xml");
        ioc.start();
        System.in.read();
    } 
}

启动

注册到注册中心

当 spring-provider-user 启动后,我们可以在dubbo-admin中看到服务已经注册进来了。

spring-consumer-admin

├── spring-consumer-admin
│   ├── pom.xml
│   ├── spring-consumer-admin.iml
│   └── src
│       ├── main
│       │   ├── java
│       │   │   └── com
│       │   │       └── martain
│       │   │           └── study
│       │   │               ├── Application.java
│       │   │               └── service
│       │   │                   └── AdminService.java
│       │   └── resources
│       │       └── consumer.xml

pom.xml

<dependencies>
        <dependency>
            <groupId>com.martain.study</groupId>
            <artifactId>common-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- 引入dubbo --> 
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!--zookeeper 注册中心客户端引入 使用的是curator客户端 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.4.1</version>
            <type>pom</type>
        </dependency>
    </dependencies>

AdminService.java

IAdminService的实现类

@Service
public class AdminService implements IAdminService {

    @Autowired
    IUserService userService;

    public UserVO findUserById(String userId) {
        UserVO userVO  = userService.getUserById(userId);
        System.out.println(userVO);
        return userVO;
    }
}

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

  <!-- 配置扫描包,才能使adminService被扫描到 -->
    <context:component-scan base-package="com.martain.study.service">
  </context:component-scan>

  <!-- 应用名 -->
    <dubbo:application name="admin-service-consumer"></dubbo:application>
    
  <!-- 指定注册中心地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
    
  <!-- 生成远程服务代理,可以和本地bean一样使用IUserService -->
    <dubbo:reference interface="com.martain.study.IUserService" id="userService" >
    </dubbo:reference>
    
</beans>

Application.java

启动类中,先加载了配置文件,然后再使用IAdminServiceq去调用IUserService中的接口。

public class Application {

    @SuppressWarnings("resource")
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
        IAdminService adminService = applicationContext.getBean(IAdminService.class);
        adminService.findUserById("10086");
        System.out.println("调用完成....");
        System.in.read();
    }
}

启动

UserVO(id=10086, userName=user-10086, age=18, email=10086@qq.com)
调用完成....

调用成功

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342