基于SpringBoot的Dubbo泛化调用的实现代码

目录
  • 1、服务端定义
    • 1.1 服务定义及实现
    • 1.2 服务提供者配置
    • 1.3 启动类
    • 1.4 pom文件
  • 2、消费端定义
    • 2.1 Dubbo配置类
    • 2.2 启动类
    • 2.3 pom文件
  • 3、 运行结果
  • 4 、结论
  • 5、改进
    • 5.1 关于服务的实现
    • 5.2 在服务端配置中增加代码

Dubbo的泛化调用不需要引入调用方的接口,只需要指定接口的全类名,就可以调用服务,一般用于框架集成。接下来就基于SpringBoot实现了Dubbo的泛化调用。

1、服务端定义

1.1 服务定义及实现

package com.smart.springboot.api;
public interface HelloServiceFacade {
    void sayHello();
}
package com.smart.springboot.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.smart.springboot.api.HelloServiceFacade;
/**
 * @author : cuantianhou 2020/1/14
 */
@Service(version = "1.0.0",timeout = 20000)
public class HelloService implements HelloServiceFacade {
    @Override
    public void sayHello() {
        System.out.println("123");
    }
}

1.2 服务提供者配置

package com.smart.springboot.config;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.MonitorConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author : cuantianhou 2020/4/1
 */
@Configuration
public class DubboServiceConfig {
    @Bean
    public ApplicationConfig applicationConfig(){
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setId("springboot-dubbo-provider");
        applicationConfig.setName("springboot-dubbo-provider");
        return applicationConfig;
    }
    @Bean
    public ProtocolConfig protocolConfig() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setPort(20880);
        protocolConfig.setName("dubbo");
        return protocolConfig;
    }
    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://ip1:2181?backup=ip2:2181");
        registryConfig.setCheck(false);
        return registryConfig;
    }
    @Bean
    public MonitorConfig monitorConfig() {
       MonitorConfig monitorConfig = new MonitorConfig();
       monitorConfig.setProtocol("registry");
       return monitorConfig;
    }
}

1.3 启动类

package com.smart.springboot;
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * 启动类
 *
 * @author : cuantianhou 2020/1/14
 */
@SpringBootApplication
@DubboComponentScan("com.smart.springboot")
public class SpringBootDubboProvider {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDubboProvider.class,args);
    }
}

1.4 pom文件

<?xml version="1.0" encoding="UTF-8"?>
<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.smart.springboot</groupId>
    <artifactId>springboot-dubbo-provider</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--引入dubbo环境-->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.smart.springboot</groupId>
            <artifactId>springboot-dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2、消费端定义

2.1 Dubbo配置类

package com.smart.springboot.config;
import com.alibaba.dubbo.config.*;
import com.alibaba.dubbo.rpc.service.GenericService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author : cuantianhou 2020/4/1
 */
@Configuration
public class DubboConsumerConfig {
    @Bean
    public ApplicationConfig applicationConfig(){
     ApplicationConfig applicationConfig = new ApplicationConfig();
     applicationConfig.setId("springboot-dubbo-consumer");
     applicationConfig.setName("springboot-dubbo-consumer");
     return applicationConfig;
    }
    @Bean
    public ProtocolConfig protocolConfig() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setPort(20880);
        protocolConfig.setName("dubbo");
        return protocolConfig;
    }
    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://10.0.20.121:2181?backup=10.0.20.131:2181,10.0.20.132:2181,10.0.20.133:2181");
        registryConfig.setCheck(false);
        return registryConfig;
    }
    @Bean
    public MonitorConfig monitorConfig() {
        MonitorConfig monitorConfig = new MonitorConfig();
        monitorConfig.setProtocol("registry");
        return monitorConfig;
    }
    @Bean
    public ReferenceConfig<GenericService> referenceConfig(){
        ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setInterface("com.smart.springboot.api.HelloServiceFacade");
        referenceConfig.setApplication(applicationConfig());
        referenceConfig.setRegistry(registryConfig());
        referenceConfig.setMonitor(monitorConfig());
        referenceConfig.setVersion("1.0.0");
        referenceConfig.setTimeout(20000);
        referenceConfig.setId("helloService");
        referenceConfig.setGeneric(Boolean.TRUE);
        return referenceConfig;
    }
}

2.2 启动类

package com.smart.springboot;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.rpc.service.GenericService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.Arrays;
/**
 * @author : cuantianhou 2020/1/14
 */
@SpringBootApplication
public class SpringBootDubboConsumer {
    public static void main(String[] args) {
        ConfigurableApplicationContext configurableApplicationContext =   SpringApplication.run(SpringBootDubboConsumer.class,args);
        String[] beanNames = configurableApplicationContext.getBeanDefinitionNames();
        Arrays.asList(beanNames).forEach(System.out::println);
        ReferenceConfig<GenericService> referenceConfig = configurableApplicationContext.getBean(ReferenceConfig.class);
        GenericService genericService =  referenceConfig.get();
        genericService.$invoke("sayHello",null,null);
    }
}

2.3 pom文件

<?xml version="1.0" encoding="UTF-8"?>
<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.smart.springboot</groupId>
    <artifactId>springboot-dubbo-consumer</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入dubbo环境-->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3、 运行结果

4 、结论

从泛化调用实现的过程来看,我们可以对自己提供所有服务进行测试,不需要引入调用的接口,减少代码的侵入,如有问题,欢迎指正。

5、改进

关于服务暴露的改进

5.1 关于服务的实现

/**
 * @author : cuantianhou 2020/1/14
 */
public class HelloService implements HelloServiceFacade {
    @Override
    public void sayHello() {
        System.out.println("123");
    }
}

5.2 在服务端配置中增加代码

  @Bean
    public ServiceConfig<HelloServiceFacade> serviceConfig(){
        ServiceConfig<HelloServiceFacade> serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface("com.smart.springboot.api.HelloServiceFacade");
        serviceConfig.setRef(helloService());
        serviceConfig.setApplication(applicationConfig());
        serviceConfig.setRegistry(registryConfig());
        serviceConfig.setMonitor(monitorConfig());
        serviceConfig.setVersion("1.0.0");
        serviceConfig.setTimeout(20000);
        serviceConfig.setId("helloService");
        serviceConfig.export();
        return serviceConfig;
    }
    @Bean
    public HelloService helloService(){
        return new HelloService();
    }

到此这篇关于基于SpringBoot的Dubbo泛化调用的实现代码的文章就介绍到这了,更多相关SpringBoot 泛化调用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 阿里nacos+springboot+dubbo2.7.3统一处理异常的两种方式

    目录 1.为什么要抛异常? 2.给出解决方案 3.两种抛异常的实例解说 dubbo工程搭建 在网上很多关于dubbo异常统一处理的博文,90%都是抄来抄去.大多都是先上一段dubbo中对于异常的统一处理的原码,然后说一堆的(甚至有12345,五种)不靠谱方案,最后再说“本篇使用的是方案4”,然后再对所谓的方案4写了一段文字,最后还说不清!!! 本篇解决方案不会那么罗里吧嗦也不会贴dubbo源码来凑字数,我就直接从刚结束不久的双11保卫战性能全链路优化中我们的面对10万级别TPS的方案中提取的代码

  • springboot 集成dubbo的步骤详解

    目录 第一步 搭建zookeeper环境 第二步 springboot集成dubbo 1.项目目录机构 2.代码编写 2.1 api目录 2.2 consumer目录 web访问.接口调用以及dubbo配置编写 2.3 provider目录 api接口实现以及dubbo配置 第三步 测试dubbo远程服务调用 附录: 写在前面:在阅读本文前,请前拥有dubbo基础知识,springboot知识 dubbo官网: http://dubbo.apache.orgdubbo github 源码地址:h

  • springboot整合Dubbo与Feign的实现 (无注册中心)

    目录 一,SpringBoot 整合 Dubbo 1.1 服务提供者 1.1.1 核心依赖 1.1.2 核心配置 1.1.3 服务提供者代码结构 1.1.4 服务提供者暴露的API(DubboDemoServiceImpl) 1.1.5 服务提供者端的对象(User) 1.2 服务消费者 1.2.1 核心依赖 1.2.2 核心配置 1.2.3 服务消费者代码结构 1.2.4 服务消费者调用服务提供者 1.3 调用示例 1.3.1 消费者入口(测试是否导通) 1.3.2 消费者入口(测试携带参数与

  • springboot分布式整合dubbo的方式

    Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色. 1.服务提供者配置 //需要额外引入的jar包 提供者 <dependency> <groupId>com.alibaba.boot<

  • 教你springboot+dubbo快速启动的方法

    目录 前言 实操 测试 前言 现在用dubbo的太多了,我到现在还不熟悉,这太不应该了,这次好好看了一下dubbo,终于把基本的启动框架搭好了.dubbo的角色宽泛的分三类provider,comsumer,注册中心.我这里的注册中心用的是zookeeper,并且是在windows环境下做的. dubbo和springboot整合的依赖: <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>

  • 基于SpringBoot的Dubbo泛化调用的实现代码

    目录 1.服务端定义 1.1 服务定义及实现 1.2 服务提供者配置 1.3 启动类 1.4 pom文件 2.消费端定义 2.1 Dubbo配置类 2.2 启动类 2.3 pom文件 3. 运行结果 4 .结论 5.改进 5.1 关于服务的实现 5.2 在服务端配置中增加代码 Dubbo的泛化调用不需要引入调用方的接口,只需要指定接口的全类名,就可以调用服务,一般用于框架集成.接下来就基于SpringBoot实现了Dubbo的泛化调用. 1.服务端定义 1.1 服务定义及实现 package c

  • 基于springboot服务间Feign调用超时的解决方案

    解决springboot服务间Feign调用超时问题概述 1.起因 在完成项目功能需求的开发,经过自己测试以及通过测试组测试通过后,昨晚正式部署到线上环境进行正式运行前的最后一次的测试.但是在测试中,由A服务调用B服务接口时,***通过Feign调用(其实就是http请求,当A服务调用B服务时,如果不配置超时时间,那么A发出请求后,B应该立即响应,否则A服务会认为B已经断开连接)出现***连接超时的错误,错误信息:Read timed out- 2.原因 用idea开发debug模式调试代码时,

  • springboot集成dubbo注解版的示例代码

    工作中用springboot搭建项目,用dubbo做远程调用.springboot提倡注解配置和java配置,本文是基于dubbo最新版本2.6.3,使用注解方式的示例. 本文假定你已经有springboot和dubbo的使用经验. dubbo简介 dubbo是阿里巴巴开源的分布式服务框架,一般使用dubbo的RPC调用.但2016年停止维护,现在使用的2.8.4版本其实是当当维护的dubbox.2017年8月阿里又重启维护dubbo,并从2.5.7版本开始支持注解配置. 准备 此示例使用gra

  • 基于springboot实现文件上传

    本文实例为大家分享了基于springboot的文件上传的具体代码,供大家参考,具体内容如下 第一步:在vo包下创建上传前端响应类 import com.alibaba.druid.filter.AutoLoad; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * 上传响应参数 * @param <E> */ //以下是lombok插件注解 @Data @All

  • Golang基于泛化调用与Nacos实现Dubbo代理

    目录 前言 准备 实现 项目结构 go.mod 返回数据格式 获取 nacos 元信息 泛化调用 提供 http 服务 启动 效果 前言 由于工作中使用的 rpc 框架是 dubbo,经常需要调试不同环境的 dubbo 接口,例如本地环境.开发环境和测试环境.而为了统一管理 http 接口和 dubbo 接口,希望使用统一的调试工具,例如 PostMan 或 ApiPost 等,因此萌生了开发一个 dubbo 的 http 代理工具的念头. 准备 由于是通用的 dubbo 代理,因此肯定需要使用

  • SpringBoot整合Dubbo框架,实现RPC服务远程调用

    一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互. 2)图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点. 3)图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用. 4)图中只包含 RPC

  • spring/springboot整合dubbo详细教程

    一.基本使用 需求: 某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址: 我们现在需要创建两个服务模块进行测试 模块 功能 订单服务web模块 创建订单等 用户服务service模块 查询用户地址等 测试预期结果: 订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能. 二.spring整合dubbo 以下使用XML 配置的方式,更多配置方式见官方文档 2.1 spring-common模块: 公共接口层(model,service,exception-),定

  • Springboot 整合 Dubbo/ZooKeeper 实现 SOA 案例解析

    一.为啥整合 Dubbo 实现 SOA Dubbo 不单单只是高性能的 RPC 调用框架,更是 SOA 服务治理的一种方案. 核心: 远程通信,向本地调用一样调用远程方法. 集群容错 服务自动发现和注册,可平滑添加或者删除服务提供者. 我们常常使用 Springboot 暴露 HTTP 服务,并走 JSON 模式.但慢慢量大了,一种 SOA 的治理方案.这样可以暴露出 Dubbo 服务接口,提供给 Dubbo 消费者进行 RPC 调用.下面我们详解下如何集成 Dubbo. 二.运行 spring

随机推荐