SpringBoot整合Dubbo

springboot整合feign可参考我另外一篇文章SpringBoot集成Feign

1、dubbo简介

Apache Dubbo 最初在 2008 年由 Alibaba 捐献开源,很快成为了国内开源服务框架选型的事实标准框架 ,得到了各行各业的广泛应用。在 2017 年,Dubbo 正式捐献到 Apache 软件基金会并成为 Apache 顶级项目,目前 Dubbo3 已经是一站式的微服务解决方案。可以看到自 SpringCloud Alibaba 2021.0.1.0 起,Dubbo已被移除SpringCloud Alibaba 。目前基本都是使用org.apache.dubbo,而com.alibaba.dubbo已被弃用。
在这里插入图片描述

2、dubbo解决了什么问题

分类dubbo的特性
高性能RPC调用(主)提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节
服务自动注册与发现支持多种注册中心服务,服务实例上下线实时感知
运行期流量调度内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布、同机房优先等功能
智能负载均衡内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量
高度可扩展能力遵循微内核+插件的设计思想,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现
可视化的服务治理与运维提供丰富服务治理、运维工具:随时查询服务元数据、服务监控状态以及调用统计,实时下发路由策略,调整配置参数

3、环境准备

系统:windows
JDK:1.8
Maven:3.8.1
Nacos:2.2.0 (下载和使用介绍:【Nacos】SpringBoot集成Nacos)

项目下载模板地址https://github.com/shengwanping/SpringBoot-dubbo-demo.git

4、项目搭建

1、首先创建一个基于Maven的工程
在这里插入图片描述

2、然后创建三个子项目:springboot-dubbo-provider、springboot-dubbo-interface、springboot-dubbo-consumer,如下

在这里插入图片描述
在这里插入图片描述

3、每个子项目分别创建如下三个目录:org.dubbo.consumer; org.dubbo; org.dubbo.provider
在这里插入图片描述

4、父项目中添加Maven依赖
在这里插入图片描述

<!--dependencyManagement 依赖管理,子项目不会继承父依赖,需要重新声明-->
    <dependencyManagement>
        <dependencies>
            <!-- spring-boot依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.12.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring-cloud alibaba依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.7.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--com.alibaba.cloud 2.2.7版本有个坑,需要把spring-context-support升到1.0.11才能启动项目-->
    <dependencies>
        <dependency>
            <groupId>com.alibaba.spring</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>1.0.11</version>
        </dependency>
    </dependencies>

5、然后在 springboot-dubbo-consumer 和 springboot-dubbo-provider 两个模块 pom.xml 中进行具体依赖的配置
在这里插入图片描述

<dependencies>
        <!--引入 springboot-dubbo-interface 接口服务-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>springboot-dubbo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- springboot 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--  nacos 服务的注册发现     -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--  nacos  配置中心做依赖管理    -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <!-- dubbo-apache -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>
    </dependencies>

6、定义服务接口

在这里插入图片描述

package org.dubbo;

public interface DemoService {

    String sayHello(String name);
}

7、配置服务端yml文件

在这里插入图片描述

server:
  port: 8010

spring:
  # 应用名称(nacos会将改名称作为服务名称)
  application:
    name: springboot-dubbo-provider
  cloud:
    nacos:
      server-addr: localhost:8848
      # 注册中心
      discovery:
        namespace: public #命名空间,如prod,dev,默认public
      # 配置中心
      config:
        server-addr: localhost:8848

dubbo:
  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://localhost:8848

8、配置消费端yml文件

在这里插入图片描述

server:
  port: 8011

spring:
  # 应用名称(nacos会将改名称作为服务名称)
  application:
    name: springboot-dubbo-consumer
  cloud:
    nacos:
      server-addr: localhost:8848
      # 注册中心
      discovery:
        namespace: public #命名空间,如prod,dev,默认public
      # 配置中心
      config:
        server-addr: localhost:8848

dubbo:
  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://localhost:8848

9、定义服务端的实现 和 服务端启动类
在这里插入图片描述
实现类:

package org.dubbo.provider;

import org.apache.dubbo.config.annotation.DubboService;
import org.dubbo.DemoService;

@DubboService
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

启动类:

package org.dubbo.provider;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

10、定义消费端 启动类和调用类
在这里插入图片描述
启动类:

package org.dubbo.consumer;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

调用类:

package org.dubbo.consumer;

import java.util.Date;

import org.apache.dubbo.config.annotation.DubboReference;
import org.dubbo.DemoService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class Task implements CommandLineRunner {
	
    @DubboReference
    private DemoService demoService;

    @Override
    public void run(String... args) throws Exception {
        
        String result = demoService.sayHello("world");
        System.out.println("Receive result ======> " + result);

        new Thread(()-> {
            while (true) {
                try {
                    Thread.sleep(1000);
                    System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world"));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Thread.currentThread().interrupt();
                }
            }
        }).start();
    }
}

11、分别先后启动 服务启动类 和 消费启动类,当消费启动类控制台看到如下信息则说明成功了。

在这里插入图片描述

还可在nacos中看到注入的两个服务
在这里插入图片描述

5、总结

简单理解在微服务中使用Dubbo实现RPC远程接口调用,只需要满足如下几个条件:

1、导入org.apache.dubbo maven依赖。
2、配置基于dubbo的yml配置文件
3、在启动类加上@EnableDubbo注解
4、被调用接口实现类使用@DubboService注解
5、调用接口时使用@DubboReference注解

参考地址:
https://cn.dubbo.apache.org/zh-cn/overview/what/overview/
https://spring.io/projects/spring-cloud
https://blog.youkuaiyun.com/x734400146/article/details/108087926

### Spring Boot 整合 Dubbo 实现 RPC 分布式服务 #### 1. 环境准备 为了在 Spring Boot整合 Dubbo,需要先搭建好基础环境。这包括引入必要的依赖项以及配置 Zookeeper 注册中心。 以下是 Maven 配置文件中的依赖部分: ```xml <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- Dubbo Dependency --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.0.8</version> </dependency> <!-- Zookeeper Client --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>5.2.0</version> </dependency> </dependencies> ``` 上述代码片段展示了如何通过 Maven 添加 Dubbo 和 Zookeeper 的支持[^1]。 #### 2. 配置 Dubbo 和 Zookeeper Dubbo 使用 Zookeeper 来管理服务的注册与发现过程。因此,在 `application.properties` 或 `application.yml` 文件中需定义相应的参数: 对于 `application.properties` 文件: ```properties dubbo.application.name=springboot-dubbo-demo dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.protocol.name=dubbo dubbo.protocol.port=20880 ``` 或者使用 YAML 格式的配置文件: ```yaml dubbo: application: name: springboot-dubbo-demo registry: address: zookeeper://127.0.0.1:2181 protocol: name: dubbo port: 20880 ``` 这些设置指定了应用名称、Zookeeper 地址以及协议端口等重要信息[^2]。 #### 3. 创建服务提供方 (Provider) 创建一个简单的接口及其实现类作为服务提供者。例如,假设有一个名为 `DemoService` 的接口: ```java public interface DemoService { String sayHello(String name); } ``` 接着为其编写具体的逻辑实现: ```java import org.apache.dubbo.config.annotation.Service; @Service(version = "1.0.0") // Mark this class as a service provider. public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) { return "Hello, " + name; } } ``` 这里利用了 Dubbo 提供的注解来标记该类为远程服务的一部分[^3]。 #### 4. 构建服务消费方 (Consumer) 同样地,在另一个模块里声明相同的接口并注入其实例即可完成调用操作。注意不要重复定义具体方法体! ```java import org.apache.dubbo.config.annotation.Reference; import org.springframework.stereotype.Component; @Component public class DemoAction { @Reference(version = "1.0.0", timeout = 5000L) private DemoService demoService; public void execute() { System.out.println(demoService.sayHello("World")); } } ``` 此段落描述了如何借助于 `@Reference` 注解读取远端的服务实例,并执行跨节点间的交互行为。 --- #### 总结 以上就是关于如何在 Spring Boot 应用程序内部嵌入 Apache Dubbo 组件从而达成微服务体系架构下各组件间高效通讯的一个基本流程说明。它涵盖了从项目初始化到实际编码实践的所有必要环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值