关于Dubbo的基础使用

dubbo的基础使用搭建

为什么写这个呢?现在大多数用的是提供给我们的springcloud,但是在公司用到的是Dubbo,当然进公司之后,虽然不用自己搭建,但是写多了接口,我就想尝试一次对dubbo的搭建,这次写了一个小的demo。

官网:http://dubbo.apache.org/en-us/

微服务的一些认识

我大致对dubbo的一点认识是这样的(画的不好):
在这里插入图片描述
当我们的从Controller过来到消费者,然后消费者去找到我们需要的rpc接口,rpc接口再走相应的提供者,最后一步一步返回,用一个模块将我们需要暴露的接口来进行存放。

安装zookeeper

dubbo可以依赖于zookeeper,也就是注册中心,把我们需要的服务注册进去,然后用的时候再去提供出来。
1.下载zookeeper的安装包
下载地址为:https://mirrors.cnnic.cn/apache/zookeeper/
2.解压下载的压缩包,修改配置文件
修改目录下zookeeper-3.4.10\conf\zoo_sample.cfg文件内容,并将文件名修改为zoo.cfg。
实际上只需要修改dataDir和dataLogDir两个地方即可,dataDir为Zookeeper 保存数据的目录,dataLogDir为Zookeeper 保存日志文件的目录。
下面是我的本地配置:
(这两个需要进行修改)
dataDir=D:/work_to_space/zookeeper/data
dataLogDir=D://work_to_space/zookeeper/log
3.启动zookeeper
找到目录\bin,双击zkServer.cmd,直接运行(一般情况下都会正常启动)

创建项目

我用的是idea,所以使用的是下面的Spring Initializr(其实也就是建一个maven项目比较好管理):

新建一个项目,然后在项目下新建相应的model。
在这里插入图片描述
外层项目的pom.xml中
在这里插入图片描述
以及需要进行相关的model,这里只需要放相关联的model就行了,因为我这次写的案例和其他的关联在一起,所以就不单独写了,本篇文章只是简单的入门。
在这里插入图片描述
common_service-facade中写对应需要暴露的接口方法

package com.yqx.wfw_common_service_facade.rpc.user;
import com.yqx.wfw_common_service_facade.entity.UserEntity;
import java.util.List;

/**
 * 用户接口
 *
 * @author YangChingyu-k
 * @date 2019/8/26 15:48
 */
public interface UserService {
    
    /**
     * 测试dubbo是否成功
     */
    String sayHello();
}

实现类在另一个userModel中,这就是到我们调用需要用到的接口时,会去找到我们关联的实现

package com.yqx.wfw_user.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.yqx.wfw_common_service_facade.entity.UserEntity;
import com.yqx.wfw_common_service_facade.rpc.user.UserService;
import com.yqx.wfw_user.dao.UserDao;
import javax.annotation.Resource;
import java.util.List;

/**
 * 用户接口Provide
 *
 * @author YangChingyu-k
 * @date 2019/8/26 16:18
 */
@Service
public class UserServiceProvide implements UserService {

    @Override
    public String sayHello() {
        String str = "Say hello!";
        return str;
    }
}

provider的配置文件xml:
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/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-2.5.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- provider's application name, used for tracing dependency relationship -->
    <dubbo:application name="user-provider"/>

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

    <!-- use dubbo protocol to export service on port 20880 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- service implementation, as same as regular local bean -->
    <bean id="userService" class="com.yqx.wfw_user.service.UserServiceProvide"/>

    <!-- declare the service interface to be exported -->
    <dubbo:service interface="com.yqx.wfw_common_service_facade.rpc.user.UserService" ref="userService"/>
</beans>

consumer的配置xml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/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-2.5.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- consumer's application name, used for tracing dependency relationship (not a matching criterion),
    don't set it same as provider -->
    <dubbo:registry address="zookeeper://localhost:2181"/>

    <dubbo:application name="consumer"/>
    <!--  user  -->
    <dubbo:reference id="userService" check="false" interface="com.yqx.wfw_common_service_facade.rpc.user.UserService"/>

</beans>

provider的启动:

package com.yqx.wfw_user;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

@MapperScan("com.yqx.wfw_user.dao")
@SpringBootApplication
public class WfwUserApplication {

    public static void main(String[] args) throws IOException {

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"\\WEB-INF\\spring\\user-provide.xml"});
        context.start();
        System.out.println("-------  UserService服务已启动  -------");

    }
}

consumer的启动:

package com.yqx.wfw_controller;

import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import com.yqx.wfw_common_service_facade.rpc.user.UserService;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.support.ClassPathXmlApplicationContext;

@DubboComponentScan(basePackages = "com.yqx.wfw_common_service_facade.rpc")
@SpringBootApplication
public class WfwControllerApplication {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"\\WEB-INF\\spring\\consumer.xml"});
        context.start();

        UserService userService = (UserService) context.getBean("userService");

        // 测试服务调用是否成功
        while (true) {
            try {
                Thread.sleep(1000);
                String str = userService.sayHello();
                System.out.println("--- 调用服务 ---");
                System.out.println("---" + str + "---");
            } catch (Exception e){
                e.printStackTrace();
            }
        }
        // SpringApplication.run(WfwControllerApplication.class, args);
    }
}

测试是否成功

启动过程:
手动启动zookeeper(这是肯定的,不然你接口从哪里拿);
provider启动;
consumer启动。

放一个测试的结果:
zookeeper的启动没有报错
在这里插入图片描述
provide启动:
在这里插入图片描述
最后结果:
在这里插入图片描述

题外

这知识一个简单的搭建,可以看出在不同的模块,我们引入的不在同一model下的"资源",然后测试的时候调用的接口和实现也不在同一模块下,这就是一个简单的理解,模块与模块之间的关联以及调用和实现,另外还放一段配置,上面的简单搭建是没有用到数据库的,那么如果我们用到的话需要再配置中写点东西,也就是让服务暴露在外。
在propertise中加入以下(具体加的和我们之前xml中的相关):

spring.dubbo.application.name=user-provider # 本服务的名称
spring.dubbo.registry.address=zookeeper://localhost:2181 # ZooKeeper所在服务器的IP和端口号
spring.dubbo.protocol.name=dubbo # RPC通信所采用的协议
spring.dubbo.protocol.port=20880 # 本服务对外暴露的端口号
spring.dubbo.scan=com.yqx.wfw_common_service_facade.rpc.user.UserService # 服务实现类所在的路径

末尾

我这里只是提供一下简单的搭建,具体的用法还是要看具体场景,并不是说一定就去调用模块之外的方法,如果只是对自身有用,那就可以不需要暴露在外,这是一点点理解和看法,如果有其他的看法,可以一起讨论,欢迎评论,有问题指出,哪里不对就改哪里,希望可以共同进步,加油吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Dubbo是一个高性能的Java RPC框架,它提供了分布式服务框架的支持,可以让开发者轻松地构建分布式应用。而Zookeeper是一个分布式的协调服务,它可以用来管理和协调分布式系统中的各种资源,如配置信息、命名服务、分布式锁等。 当使用Dubbo框架时,我们可以将服务注册到Zookeeper中,这样其他的服务消费者就可以通过Zookeeper来发现和调用这些服务。同时,Zookeeper还可以用来监控服务的状态,当服务出现故障时,Zookeeper可以及时地通知其他服务消费者,从而保证整个分布式系统的稳定性和可靠性。 因此,Dubbo和Zookeeper的结合可以为分布式系统的开发和运维提供很好的支持,让开发者可以更加轻松地构建高性能、可靠的分布式应用。 ### 回答2: Dubbo和Zookeeper是两个分布式框架,结合起来可以帮助开发者构建高性能、高可用性的分布式应用。Dubbo提供了RPC远程过程调用框架,可以实现跨进程、跨语言的方法调用,支持负载均衡、容错、限流等特性。而Zookeeper是一个开源的分布式协调服务框架,可以协调和管理分布式应用的节点之间的通信。下面详细介绍Dubbo和Zookeeper的分布式基础。 1、Dubbo Dubbo是一款高性能、轻量级的RPC框架,采用Java编写,支持多种协议(Dubbo协议、HTTP、Hessian、RMI等),通过注册中心连接提供者和消费者。Dubbo可以做到请求耗时的优化、负载均衡、集群容错、异步调用等特性,让开发者可以轻松地构建分布式应用。 Dubbo的工作流程如下:服务提供者(Provider)将服务注册到注册中心,服务消费者(Consumer)从注册中心订阅服务,当服务消费者需要调用服务时,会通过代理对象来远程调用服务提供者,完成方法调用并将结果返回。Dubbo自带了多种注册中心的实现,例如Zookeeper、Redis等。 2、Zookeeper Zookeeper是一个开源的分布式协调服务框架,可以用来协调和管理分布式应用的节点之间的通信。Zookeeper的主要作用是提供一个分布式的协调服务,例如分布式锁、配置管理、分布式队列等。Zookeeper可以减轻分布式应用的复杂性,让开发者可以专注于业务逻辑。 Zookeeper通过基于目录树结构的数据模型来保存数据,并提供了一套完整的API用于操作这些数据。Zookeeper的工作原理是基于主从架构,当Zookeeper集群中的节点出现故障时,可以自动选举出新的Leader节点以继续提供服务。 Dubbo和Zookeeper结合起来可以构建一个高可用性的分布式应用。Dubbo将服务注册到Zookeeper,服务消费者从Zookeeper订阅服务,同时Zookeeper提供了注册中心的高可用性和负载均衡等特性。当服务提供者出现故障时,Zookeeper可以自动重新分配服务提供者的角色,从而保证服务的高可用性。 ### 回答3: Dubbo和Zookeeper是目前流行的分布式系统基础组件,它们常常被一起使用来构建可靠的分布式服务。在现代复杂的分布式系统中使用基础组件可以极大地简化开发和部署工作,而测试和维护都变得更容易。 Dubbo是一种高性能的分布式服务框架,它提供了统一的服务管理和RPC调用机制。Dubbo的核心在于将服务提供方和服务消费方解耦,同时提供了动态负载均衡和服务治理等功能。Dubbo具有高性能、可靠、易扩展等优点,广泛应用于大型分布式系统中。 Zookeeper是一种开源的分布式配置管理和协调解决方案,可以实现分布式配置管理、命名服务、分布式锁、集群选主和消息队列等功能。Zookeeper具有高可用性、可靠性和易扩展性,可以轻松管理大型分布式系统的配置和状态信息。Zookeeper还提供了建立分布式协调基础设施的基础组件。 在实际应用中,Dubbo通常和Zookeeper一起使用。服务提供方将服务注册到Zookeeper中心,服务消费方从Zookeeper中获取服务地址,并进行RPC调用,通过Dubbo提供的高性能、高可靠性的RPC调用机制实现分布式服务的调用和管理。 总之,Dubbo和Zookeeper是分布式系统基础构件,通常会共同使用来实现高性能、高可靠性的分布式服务。对于分布式开发者来说,掌握这些基础组件的使用和原理,可以对分布式开发和维护提供很大帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值