dubbo基础调用搭建

前言

dubbo是一个高性能的RPC框架,提供面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现等能力(从官网上抄过来的,反正很强大),可以和spring无缝整合,实现接口透明化调用。
简单说就是,通过dubbo,可以将本地spring容器中的服务暴露出去,也可以将远程服务引用到spring中(体现在代码中,就是简单换了两个注解,就好了!!!)。
这里呢,介绍下dubbo的几种调用方式,主要分为:xml配置、属性文件+注解方式、API调用方式。
dubbo官网地址:http://dubbo.apache.org/

几种配置方式的介绍

xml方式

  • 提供者
    通过配置application、registry、protocol、service等标签做提供者的应用配置。
  • 消费者
    通过配置application、registry、reference等标签做消费者的应用配置。
  • service和reference
    提供者通过service暴露服务,消费者通过reference引用服务

属性文件+注解方式

通过使用spring的自动注入方式,将application、registry、protocol等信息通过属性文件自动注入。
消费者通过注解@Reference代替xml中的reference标签
提供者通过注解@Service代替xml中的service标签

API方式

通过dubbo提供的底层类ServiceConfig、ReferenceConfig完成服务的暴露和引用。
提供者通过将接口信息、接口实例、application、registry等信息封装为ServiceConfig,暴露服务。
消费者通过将接口信息、application、registry等信息封装为ReferenceConfig,查找接口实例,引用服务。

前提

  • 本地有个zookeeper注册中心
  • 搭建个dubbo的控制台,根据dubbo官方文档进行搭建(可选)

可以在dubbo-admin-server中配置文件(application.properties)修改zk注册中心的地址,以及后台的默认账号密码。

git clone https://github.com/apache/dubbo-admin.git
cd dubbo-admin
mvn clean package
cd dubbo-admin-distribution/target
java -jar dubbo-admin-0.1.jar

准备工作

新建个mvn项目

  • pom文件
 <properties>
     <spring.version>4.3.16.RELEASE</spring.version>
     <dubbo.version>2.6.5</dubbo.version>
 </properties>
 <!-- spring支持 -->
 <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-core</artifactId>
     <version>${spring.version}</version>
 </dependency>
 <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>${spring.version}</version>
 </dependency>

 <!-- dubbo -->
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>dubbo-config-spring</artifactId>
     <version>${dubbo.version}</version>
 </dependency>
 <!-- zookeeper注册中心 -->
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>dubbo-registry-zookeeper</artifactId>
     <version>${dubbo.version}</version>
 </dependency>

 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>dubbo-rpc-dubbo</artifactId>
     <version>${dubbo.version}</version>
 </dependency>
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>dubbo-remoting-netty</artifactId>
     <version>${dubbo.version}</version>
 </dependency>
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>dubbo-serialization-hessian2</artifactId>
     <version>${dubbo.version}</version>
 </dependency>

一些公用的类

  • 公用接口UserService
package com.zyu.service;

public interface UserService {
    String echoUser(String username);
}

  • UserService接口的实现类
package com.zyu.service;

import com.alibaba.dubbo.config.annotation.Service;

@Service//dubbo的Service注解
public class UserServiceImpl implements UserService {
    public String echoUser(String username) {
        System.out.println("收到远程调用请求,username:" + username);
        return String.format("dubbo provider echo:hello,%s", username);
    }
}

  • UserController调用类
package com.zyu.action;

import com.alibaba.dubbo.config.annotation.Reference;
import com.zyu.service.UserService;
import org.springframework.stereotype.Component;

@Component("userController")
public class UserController {
    @Reference//dubbo的Reference注解
    private UserService userService;

    public String echo(String username){
        String s = userService.echoUser(username);
        return s;
    }
}

代码撸起来

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="http://www.springframework.org/schema/context"
       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://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd
	 http://code.alibabatech.com/schema/dubbo
	 http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!--全局配置-->
    <dubbo:provider timeout="3000" />
    <!-- 服务提供方应用名称, 方便用于依赖跟踪 -->
    <dubbo:application name="xml-provider" />
    <!-- 使用本地zookeeper作为注册中心 -->
    <dubbo:registry address="zookeeper://192.168.1.103:2181" />

    <!--name指示使用什么协议监听端口:dubbo/rmi/rest-->
    <dubbo:protocol id="d1"  name="dubbo" port="20880" />
    <dubbo:protocol id="d2"  name="dubbo" port="20882" />

    <!-- 通过xml方式配置为bean, 让spring托管和实例化 -->
    <bean id="userService" class="com.zyu.service.UserServiceImpl"/>
    <!-- 声明服务暴露的接口,并暴露服务 -->
    <dubbo:service interface="com.zyu.service.UserService" ref="userService" protocol="d1" />
</beans>
  • 消费者配置
<?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="http://www.springframework.org/schema/context"
       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://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd
	 http://code.alibabatech.com/schema/dubbo
	 http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application name="xml-consumer" />
    <dubbo:registry address="zookeeper://192.168.1.103:2181" />

    <dubbo:reference id="userService" interface="com.zyu.service.UserService" />

</beans>
  • 提供者代码
package com.zyu.dubbo.xml;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

/**
 * xml文件配置方式暴露dubbo服务
 */
public class XmlProvider {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("classpath:/spring/dubbo-server.xml");
        app.start();
        System.out.println("dubbo 启动成功");
        System.in.read();
    }
}

  • 消费者代码
package com.zyu.dubbo.xml;

import com.zyu.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * xml文件配置方式引用dubbo服务
 */
public class XmlConsumer {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("classpath:/spring/dubbo-client.xml");
        app.start();
        UserService userService = app.getBean(UserService.class);
        String ret = userService.echoUser("zyufocus");
        System.out.println(ret);
    }
}

配置类方式

Bean配置方式
  • 提供者代码
package com.zyu.dubbo.annotation;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import com.zyu.action.UserController;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * 注解方式引用dubbo服务
 */
public class AnnoConsumer {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Config.class);
        app.start();
        UserController userController = app.getBean(UserController.class);
        String ret = userController.echo("zyufocus");
        System.out.println(ret);
    }
    @Configuration
    @ComponentScan("com.zyu.action")
    @EnableDubbo(scanBasePackages = "com.zyu.action")
    static class Config{
        @Bean
        public ApplicationConfig applicationConfig(){
            ApplicationConfig applicationConfig = new ApplicationConfig();
            applicationConfig.setName("anno-consumer");
            return applicationConfig;
        }

        @Bean
        public ConsumerConfig consumerConfig(){
            ConsumerConfig consumerConfig = new ConsumerConfig();
            consumerConfig.setTimeout(3000);
            return consumerConfig;
        }

        @Bean
        public RegistryConfig registryConfig(){
            RegistryConfig registryConfig = new RegistryConfig();
            registryConfig.setProtocol("zookeeper");
            registryConfig.setAddress("192.168.1.103");
            registryConfig.setPort(2181);
            return registryConfig;
        }

    }
}

  • 消费者代码
package com.zyu.dubbo.annotation;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import com.zyu.action.UserController;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * 注解方式引用dubbo服务
 */
public class AnnoConsumer {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Config.class);
        app.start();
        UserController userController = app.getBean(UserController.class);
        String ret = userController.echo("zyufocus");
        System.out.println(ret);
    }
    @Configuration
    @ComponentScan("com.zyu.action")
    @EnableDubbo(scanBasePackages = "com.zyu.action")
    static class Config{
        @Bean
        public ApplicationConfig applicationConfig(){
            ApplicationConfig applicationConfig = new ApplicationConfig();
            applicationConfig.setName("anno-consumer");
            return applicationConfig;
        }

        @Bean
        public ConsumerConfig consumerConfig(){
            ConsumerConfig consumerConfig = new ConsumerConfig();
            consumerConfig.setTimeout(3000);
            return consumerConfig;
        }

        @Bean
        public RegistryConfig registryConfig(){
            RegistryConfig registryConfig = new RegistryConfig();
            registryConfig.setProtocol("zookeeper");
            registryConfig.setAddress("192.168.1.103");
            registryConfig.setPort(2181);
            return registryConfig;
        }

    }
}

自动装配方式

自动装配,就是将配置类中手动创建的Bean,使用spring自动装配的方式,从属性文件中自动装配到Bean中。

  • 提供者的属性文件
dubbo.application.name=properties-provider
dubbo.registry.address=zookeeper://192.168.1.103:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
  • 消费者的属性文件
dubbo.application.name=properties-consumer
dubbo.registry.address=zookeeper://192.168.1.103:2181
dubbo.consumer.timeout=30000
  • 提供者代码
package com.zyu.dubbo.config;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import java.io.IOException;

/**
 * 属性文件配置方式暴露dubbo服务
 */
public class ConfigProvider {
    public static void main(String[] args) throws IOException {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Config.class);
        app.start();
        System.out.println("dubbo 启动成功");
        System.in.read();
    }

    @Configuration
    @EnableDubbo(scanBasePackages = "com.zyu.service")
    @PropertySource("classpath:dubbo-provider.properties")
    static class Config {

    }
}

  • 消费者代码
package com.zyu.dubbo.config;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import com.zyu.action.UserController;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

/**
 * 属性文件配置方式引用dubbo服务
 */
public class ConfigConsumer {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Config.class);
        app.start();
        UserController userController = app.getBean(UserController.class);
        String s = userController.echo("zyufocus");
        System.out.println(s);
    }

    @Configuration
    @EnableDubbo(scanBasePackages = "com.zyu.action")
    @ComponentScan("com.zyu.action")
    @PropertySource("classpath:dubbo-consumer.properties")
    static class Config{

    }
}

API方式

  • 提供者代码
package com.zyu.dubbo.api;

import com.alibaba.dubbo.config.*;
import com.zyu.service.UserService;
import com.zyu.service.UserServiceImpl;

import java.io.IOException;

/**
 * 使用api方式暴露dubbo服务
 */
public class ApiProvider {
    public static void main(String[] args) throws IOException {
        ServiceConfig<UserService> serviceConfig = new ServiceConfig<UserService>();
        serviceConfig.setApplication(new ApplicationConfig("api-provider"));
        serviceConfig.setRegistry(new RegistryConfig("zookeeper://192.168.1.103:2181"));
        serviceConfig.setInterface(UserService.class);
        serviceConfig.setRef(new UserServiceImpl());

        serviceConfig.export();
        System.out.println("api 方式暴露服务成功");
        System.in.read();
    }
}


  • 消费者代码
package com.zyu.dubbo.api;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.zyu.service.UserService;

/**
 * 使用api方式调用dubbo服务
 */
public class ApiConsumer {
    public static void main(String[] args) {
        ReferenceConfig<UserService> referenceConfig = new ReferenceConfig<UserService>();
        referenceConfig.setApplication(new ApplicationConfig("api-consumer"));
        referenceConfig.setRegistry(new RegistryConfig("zookeeper://192.168.1.103:2181"));
        referenceConfig.setInterface(UserService.class);

        UserService userService = referenceConfig.get();
        String s = userService.echoUser("zyufocus");
        System.out.println(s);
    }
}

测试

使用xml方式作测试。

  • 启动提供者
    在这里插入图片描述

  • 启动消费者
    在这里插入图片描述

在这里插入图片描述

  • 查看dubbo控制台(localhost:8080)
    在这里插入图片描述
    在这里插入图片描述

结束语

简单使用下dubbo,蛮有意思,比自己写的rmi要好多了。
学无止境,诸君共勉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
Dubbo是一个分布式服务框架,可以帮助我们快速构建高性能、可扩展的分布式应用。下面是一个简单的Dubbo项目搭建的步骤: 1. 创建Maven项目:首先,在你的IDE中创建一个新的Maven项目。 2. 添加Dubbo依赖:在项目的pom.xml文件中添加Dubbo的依赖。示例代码如下: ```xml <dependencies> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.12</version> </dependency> </dependencies> ``` 3. 配置Dubbo服务提供者:创建一个Java类作为Dubbo服务提供者,并在类上添加Dubbo的注解。示例代码如下: ```java import org.apache.dubbo.config.annotation.DubboService; @DubboService public class DemoServiceImpl implements DemoService { // 实现接口方法 } ``` 4. 配置Dubbo服务消费者:创建一个Java类作为Dubbo服务消费者,并在类上添加Dubbo的注解。示例代码如下: ```java import org.apache.dubbo.config.annotation.DubboReference; public class DemoConsumer { @DubboReference private DemoService demoService; // 调用远程服务方法 } ``` 5. 配置Dubbo注册中心:在项目的配置文件中配置Dubbo的注册中心,比如Zookeeper。示例配置如下: ```properties # dubbo.registry.address指定注册中心地址 dubbo.registry.address=zookeeper://127.0.0.1:2181 ``` 6. 运行项目:启动Dubbo服务提供者和消费者,通过Dubbo的注册中心进行服务的注册和发现。 以上是一个简单的Dubbo项目搭建的步骤,具体可以根据你的实际需求进行相应的配置和调整。希望对你有所帮助!如有更多问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值