Dubbo服务者消费者提供者案例实现

Dubbo介绍

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

核心部件功能

Remoting: 网络通信框架,实现了 sync-over-async 和
 request-response 消息机制.

RPC: 一个远程过程调用的抽象,支持负载均衡容灾集群功能

Registry: 服务目录框架用于服务的注册和服务事件发布和订阅

工作原理

特性

  • 面向接口代理的高性能RPC调用

    提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。

  • 智能负载均衡

    内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

  • 服务自动注册与发现

    支持多种注册中心服务,服务实例上下线实时感知。

  • 高度可扩展能力

    遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。

  • 运行期流量调度

    内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。

  • 可视化的服务治理与运维

    提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

案例:

首先下载zookeeper(下载地址https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/)解压到本地。启动Zookeeper注册中心,在解压后zookeeper-3.4.11文件夹bin下启动cmd,输入zkServer.cmd

若启动注册中心失败,则需要修改conf目录下zoo.cfg文件,如图。

启动dubbo监控中心,通过java -jar jar包名命令启动。jar包下载地址:链接:https://pan.baidu.com/s/1m_4ktW19muxPKWpdKbufVQ 提取码:xy35 

通过浏览器访问监控中心,访问时要输入用户名:root与密码:root:

1.新建maven项目user-service-gmall,该项目包含了bean类、与接口(OrderService、UserService)

UserAddress类:

public class UserAddress implements Serializable {
    private Integer id;
    private String userAddress; //用户地址
    private String userId; //用户id
    private String consignee; //收货人
    private String phoneNum; //电话号码
    private String isDefault; //是否为默认地址    Y-是     N-否

    public UserAddress() {
        super();
        // TODO Auto-generated constructor stub
    }

    public UserAddress(Integer id, String userAddress, String userId, String consignee, String phoneNum,
            String isDefault) {
        super();
        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接口:

public interface OrderService {

    /**
     * 初始化订单
     * @param userId
     */
    public List<UserAddress> initOrder(String userId);

}

UserService接口:

public interface UserService {

    /**
     * 按照用户id返回所有的收货地址
     * @param userId
     * @return
     */
    public List<UserAddress> getUserAddressList(String userId);

}

2.创建user-service-provider01项目

pom文件中添加maven依赖:添加user-service-gmall项目依赖

<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.moon</groupId>
  <artifactId>user-service-provider01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
          <dependency>
            <groupId>com.moon</groupId>
            <artifactId>user-service-gmall</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.6.2</version>
    </dependency>
    <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>2.12.0</version>
    </dependency>
  </dependencies>
</project>

UserServiceImpl类

public class UserServiceImpl implements UserService {
    @Override
    public List<UserAddress> getUserAddressList(String userId) {
        // TODO Auto-generated method stub
        System.out.println("UserServiceImpl..3.....");
        UserAddress address1 = new UserAddress(1, "陕西省西安市", "1", "dd", "010-56253825", "Y");
        UserAddress address2 = new UserAddress(2, "陕西省咸阳市", "1", "dd", "010-56253825", "N");
        return Arrays.asList(address1,address2);
    }
}

RunClass类

public class MainClass {
    public static void main(String[] args) throws Exception{
        System.out.println("开启服务");
        ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
        ioc.start();
        System.in.read();
    }
}

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://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-service-provider01"></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="20882"></dubbo:protocol>

    <bean id="userServiceImpl" class="com.moon.service.UserServiceImpl"></bean>
    <!-- 4、暴露服务   ref:指向服务的真正的实现对象 -->
    <dubbo:service interface="com.moon.user_service_gmall.service.UserService"
        ref="userServiceImpl" timeout="1000" version="2.0.0">
        <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>

    </dubbo:service>

</beans>

3.创建user-service-consumer项目

OrderServiceImpl类

@Service
public class OrderServiceImpl implements OrderService{
    @Autowired
    UserService userService;
    public List<UserAddress> initOrder(String userId) {
        // TODO Auto-generated method stub
        List<UserAddress> addressList = userService.getUserAddressList(userId);
        for (UserAddress userAddress : addressList) {
            System.out.println(userAddress.getUserAddress()+"---"+userAddress.getId());
        }
        return addressList;
    }

}

启动类MainClass

@SuppressWarnings("resource")
public class MainClass {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext c = new ClassPathXmlApplicationContext("consumer.xml");
        c.start();

        OrderService orderService = (OrderService) c.getBean(OrderService.class);

        orderService.initOrder("1");
        System.out.println("调用完成....");
        try {
            System.in.read();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

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">
    <context:component-scan base-package="com.moon.service"></context:component-scan>
    <dubbo:application name="order-service-consumer"></dubbo:application>

    <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>

    <!-- timeout="0" 默认是1000ms-->
    <!-- retries="":重试次数,不包含第一次调用,0代表不重试-->
    <!-- 幂等(设置重试次数)【查询、删除、修改】、非幂等(不能设置重试次数)【新增】 -->
    <dubbo:reference interface="com.moon.user_service_gmall.service.UserService" <!--在user-service-provider中暴露的接口服务 -->
        id="userService" timeout="5000" retries="3" version="*">
        <!-- <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> -->
    </dubbo:reference>
</beans>

4.启动服务提供者与消费者,即启动user-service-provider01与user-service-consumer中MainClass中的main方法(先启动服务提供者)。

访问Dubbo后台监控系统,如图。

原文地址:https://www.cnblogs.com/menbo/p/10956900.html

时间: 2024-11-09 23:58:25

Dubbo服务者消费者提供者案例实现的相关文章

java 生产者 与 消费者的案例

主要理解了两个问题 1.线程数据同步的问题 2.线程交替运行的方式 package ThreadDemo; /** * 生产者与消费者的案例(一,同步的问题,值的问题 二,交替执行的问题) * @author lile * 同步的问题(synchronized 知识点) * 交替执行的问题(notify ,wait, 线程等待) */public class ThreadDemo { public static void main(String[] args) { Food food = new

Tomcat中部署web应用 ---- Dubbo服务消费者Web应用war包的部署

IP:192.168.2.61 部署容器:apache-tomcat-7.0.57 端口:8080 应用:edu-web-boss.war 1.下载(或上传)最新版的Tomcat7: $wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57.tar.gz 2.规范安装目录: /home/wusc/edu/web/xxx-tomcat 如: /home/wusc/edu/web/

dubbo启动消费者找不到服务端com.alibaba.dubbo.rpc.RpcException: No provider available from registry ip:2181 for service uatcmobile/cn.com.test.UserService on ...

最近在接触dubbo,dubbo启动的时候作为消费端一直找不到服务,找了一天:说下环境 1.springboot集成dubbo采用的注解式 2.服务端是普通的ssm项目集成dubbo的配置式 猜想; 1.两端采用的必须一致--这个应该不用 2.dubbo版本的问题--服务端用的是2.5.4,我们消费端集成dubbo-spring-boot-start采用的是2.0,里面的dubbo采用的是2.6.0版本,修改成服务端对应的版本启动一直报错DubboLog类找不到: 这个问题确实存在dubbo-2

Dubbo学习-4-dubbo简单案例-2-服务提供者和消费者配置

在上一篇帖子的基础上,开始使用dubbo来实现RPC调用: 根据dubbo的架构图可知,需要做以下几件事情: 1.将服务提供者注册到注册中心(暴露服务) (1)引入dubbo依赖, 这里依赖2.6.2版本(版本如果使用zookeeper作为注册中心,那么对应的客户端是curator,不是原来的zkClient) (2)注册中心使用的是zookeeper,需要引入操作zookeeper的客户端  2.6.以上版本的dubbo,如果使用zookeeper作为注册中心,那么注册中心客户端使用的是cur

Dubbo中消费者初始化的过程解析

首先还是Spring碰到dubbo的标签之后,会使用parseCustomElement解析dubbo标签,使用的解析器是dubbo的DubboBeanDefinitionParser,解析完成之后返回BeanDefinition给Spring管理. 服务消费者端对应的是ReferenceBean,实现了ApplicationContextAware接口,Spring会在Bean的实例化那一步回调setApplicationContext方法.也实现了InitializingBean接口,接着会

dubbo作为消费者注册过程分析

请支持原创: http://www.cnblogs.com/donlianli/p/3847676.html 作者当前分析的版本为2.5.x.作者在分析的时候,都是带着疑问去查看代码,debug进行调试的,笔者写此文章仅供参考. 先大概了解一下系统作为一个消费者从启动到注册完成的过程 系统启动时,引用service时首先将系统本身自己需要引用的服务注册到zookeeper,然后订阅系统需要的服务,最后,会接收到zookeeper发送的订阅信息.比如一个消费者注册了一个UserService,系统

Java多线程与并发——生产者与消费者应用案例

多线程的开发中有一个最经典的操作案例,就是生产者-消费者,生产者不断生产产品,消费者不断取走产品. package com.vince; /** * 生产者与消费者案例 * @author Administrator * */ public class ThreadDemo4 { public static void main(String[] args) { // TODO 自动生成的方法存根 Food food=new Food(); Producter p=new Producter(fo

项目使用dubbo会有提供者缓存问题

问题描述:配置了dubbo提供者,但是老是找到其他配置文件下面zeek地址所在的提供者,有缓存,.dubbo文件中,有一个list列表,原来的提供者缓存还在上面,现在新加的,因为名字没有变,所以追加在后面,加载不到! 在部署项目的 根目录下面 查询隐藏文件  ll -a 命令  .dubbo文件,把这个文件删掉,kill项目进程,重启即可!

Dubbo开发,利用项目模拟提供者和消费者之间的调用--初学

开发工具:IDEA,虚拟机 VMware Workstation 预备工作:安装好zookeeper的虚拟机,电脑jdk更换为1.7,本地tomcat启动,能够访问以下页面即可进行开发 2.建立以下springboot工程,关系图如下 1.首先打包父工程wk-parent,把需要的公共依赖导入,供其他项目依赖 2.打包pojo项目wk-pojo,实体类全部实现序列化 3.以上两个都打jar包即可,接下来整合接口项目wk-interface,只是单纯的接口即可,供提供者业务层实现 4.开发提供者w