Dubbo入门

Dubbo简介

         Apache Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供三大核心功能:面向接口的远程方法调用,智能容错和负载均衡,以及服务的注册和发现。

Dubbo架构图

在这里插入图片描述
         Dubbo将应用分为注册中心、服务提供者、服务消费者、Dubbo容器、监控中心五大角色。Dubbo框架启动,容器将启动,服务提供者执行初始化,提供者将服务注册到注册中心。服务消费者从服务注册中心订阅所需服务。当服务发生变更时,注册中心会将服务信息推送给服务消费者。消费者通过注册中心拿到服务信息,可以同步调用相关服务。服务的调用信息会定时发送到监控中心。

Dubbo注册中心

         支持多种注册中心。支持使用Zookeeper、Nacos、Redis等多种方式作为注册中心,但建议使用Zookeeper作为注册服务器。这里需要安装Zookeeper服务。
参考链接:https://blog.csdn.net/mo_2417909243/article/details/101909814

搭建Dubbo监控中心

1.下载监控中心
下载地址:https://github.com/apache/dubbo-admin/tree/master
2.打包
将项目解压后,进入项目文件夹,执行以下maven命令,将项目打成jar包。

mvn clean package

cmd可以看到打包成功信息。
在这里插入图片描述
在工程下会生成一个target文件夹,在文件夹下可以看到生成的jar包。
在这里插入图片描述
3.运行jar包
在安装好java环境的机器上,执行如下命令:

java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

服务启动信息
在这里插入图片描述
浏览器访问7001端口。
在这里插入图片描述

编写Dubbo工程

1.创建一个maven工程,创建三个子模块。
在这里插入图片描述
dubbo-api是应用的公共模块,包含相关java bean和应用所用接口。dubbo-provider是服务的提供者,dubbo-consumer是服务的消费者。
2.定义公共模块
创建一个UserAddress java bean
在这里插入图片描述

package com.gmail.bean;

import java.io.Serializable;

/**
 * UserAddress class
 * @author mofengyu
 *
 * @date 2019/10/4
 */

public class UserAddress implements Serializable {

    private Integer id;
    /**
     * 用户地址
     */
    private String userAddress;
    /**
     * 用户id
     */
    private String userId;
    /**
     *收货人
     */
    private String consignee;
    /**
     * 电话号码
     */
    private String phoneNum;
    /**
     * 是否为默认地址 Y-是,N-否
     */
    private String isDefault;

    public UserAddress() {
        super();
    }

    public UserAddress(Integer id, String userAddress, String userId, String consignee, String phoneNum, String isDefault) {
        this.id = id;
        this.userAddress = userAddress;
        this.userId = userId;
        this.consignee = consignee;
        this.phoneNum = phoneNum;
        this.isDefault = isDefault;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getConsignee() {
        return consignee;
    }

    public void setConsignee(String consignee) {
        this.consignee = consignee;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }

    public String getIsDefault() {
        return isDefault;
    }

    public void setIsDefault(String isDefault) {
        this.isDefault = isDefault;
    }
}

定义OrderService接口

package com.gmail.service;


/**
 * OrderService interface
 * @author mofengyu
 *
 * @date 2019/10/4
 */


public interface OrderService {

    /**
     * 初始化订单
     * @param userId
     */
    public void initOrder(String userId);
}

定义UserService接口

package com.gmail.service;

import com.gmail.bean.UserAddress;

import java.util.List;

/**
 * UserService interface
 */

public interface UserService {

    /**
     * 获取用户地址信息
     * @param userId
     * @return
     */
    public List<UserAddress> getUserAddressList(String userId);
}

3.编写服务提供者。
在pom.xml中引入相关依赖

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


        <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.0</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>

    </dependencies>

dubbo-api是公共模块,curator-framework和curator-recipes是用来操作zookeeper注册中心的API。
编写UserService实现类UserServiceImpl
在这里插入图片描述

package com.gmail.service.impl;

import com.gmail.bean.UserAddress;
import com.gmail.service.UserService;

import java.util.Arrays;
import java.util.List;

//import service.UserService;

/**
 * UserServiceImpl class
 * @author mofengyu
 *
 * @date 2019/10/4
 */

public class UserServiceImpl implements UserService {

    @Override
    public List<UserAddress> getUserAddressList(String userId) {
        UserAddress userAddress1=new UserAddress(1,"湖南省湘潭市","1","a","15573268134","Y");
        UserAddress userAddress2=new UserAddress(2,"湖南省长沙市","2","b","15573268134","N");

        return Arrays.asList(userAddress1,userAddress2);
    }
}

编写Dubbo配置文件provider.xml,配置文件位于src/main/resources。
在这里插入图片描述

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

      <!--指定服务或者应用的名字-->
      <dubbo:application name="user-service-provider"></dubbo:application>

      <!--指定配置中心的位置-->
      <dubbo:registry address="zookeeper://47.102.222.48:2181"></dubbo:registry>

      <!--指定通信协议和端口-->
      <dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>


      <!--暴露服务,ref:指向服务的真正实现对象-->
      <dubbo:service interface="com.gmail.service.UserService" ref="userServiceImpl"></dubbo:service>

      <bean id="userServiceImpl" class="com.gmail.service.impl.UserServiceImpl"></bean>


</beans>

创建启动类MainApplaction,在主启动类中加载Spring Ioc容器。
在这里插入图片描述

package com.gmail.context;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * MainApplication class
 * @author mofengyu
 *
 * @date 2019/10/5
 */

public class MainApplication {

    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext ioc=new ClassPathXmlApplicationContext("provider.xml");
        ioc.start();

        System.in.read();
    }
}

运行主函数,可以在dubbo的控制台看到服务信息。
在这里插入图片描述
在这里插入图片描述
4.编写服务提供者
在pom.xml中引用相同的依赖

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


        <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.0</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>

    </dependencies>

实现OrderService接口
在这里插入图片描述
OrderServiceImpl类

package com.gmail.order.impl;

import com.gmail.bean.UserAddress;
import com.gmail.service.OrderService;
import com.gmail.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * OrderServiceImpl class
 * @author mofengyu
 *
 * @date 2019/10/4
 */

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    UserService userService;

    @Override
    public void initOrder(String userId) {
        /**
         * 查询用户的收货地址
         */
        System.out.println("用户id"+userId);
        List<UserAddress> addressList=userService.getUserAddressList(userId);
        for (UserAddress userAddress:addressList){
            System.out.println(userAddress.getUserAddress());
        }
    }
}

消费者配置文件consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--扫描com.gmail.order.impl包,加入ioc容器-->
    <context:component-scan base-package="com.gmail.order.impl"></context:component-scan>

    <!--应用ming-->
    <dubbo:application name="order-service-consumer"/>
    <!-- 配置中心的通信协议以及ip和端口 -->
    <dubbo:registry address="zookeeper://47.102.222.48:2181"/>
    <!--调用的服务-->
    <dubbo:reference id="userService" check="false" interface="com.gmail.service.UserService"/>

</beans>

消费者主启动内MainApplication

package com.gmail.context;

import com.gmail.service.OrderService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApplication {

    public static void main(String[] args) throws Exception{
         ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("consumer.xml");

         OrderService orderService=applicationContext.getBean(OrderService.class);
         orderService.initOrder("1");

         System.out.println("调用结束");

         System.in.read();
    }
}

运行消费者主函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

         以上实例使用zookeeper+dubbo实现了一个简单的服务管理和服务调用,是一个分布式应用的简单实现。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值