Spring Boot Dubbo 构建分布式服务

简介: Spring Boot Dubbo 构建分布式服务

概述:

image.png

节点角色说明

节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行的容器

调用关系说明

  1. 服务容器 Container 负责启动,加载,运行服务提供者。
  2. 服务提供者 Provider 启动的时候,向注册中心 Registry 注册自己提供的服务。
  3. 服务消费者 Consumer 在启动的时候,向注册中心 Registry 订阅自己所需要的服务。
  4. 注册中心 Registry 返回服务提供者的地址列表给消费者,如果有变更注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者从提供者地址列表中,基于软负载均衡算法,选择一台提供者进行进行调用,如果调用失败再选择另外一台。
  6. 服务消费者与提供者在内存中统计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心 Monitor 。

项目构建

开发环境主要涉及以下方面:

  • Spring Boot
  • JDK 8
  • Dubbo 2.7.1
  • Zookeeper

具体代码可以查看 github 的 dubbo 模块:https://github.com/UniqueDong/springboot-study

Dubbo API

定义服务接口,打成 jar 包让消费者依赖,服务者实现接口。该工程只有接口定义以及 model 对象。@Data 属于lombok 开源库提供的特性,方便开发。

  • model 对象定义:
@Data
public class User implements Serializable {
    private Long id;
    private String username;
}
  • provider 接口定义:
public interface UserProvider {
    List<User> listUser();
}

Provider 服务提供者

  • pom依赖:

引入spring-boot-starter,dubbo-api 接口就是我们上面提到的 接口定义 jar ,dubbo-spring-boot-starter ,dubbo-dependencies-zookeeper。

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-logging</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>zero.springboot.study</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <!--dubbo start-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.1</version>
        </dependency>
        <!-- Zookeeper dependencies -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.1</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--dubbo end-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.57</version>
        </dependency>
    </dependencies>
  • 配置文件 yaml 定义:
spring:
  application:
    name: dubbo-provider
#自定义配置
embedded:
  zookeeper:
    # zookeeper 服务连接端口
    port: 2181
# dubbo 配置
dubbo:
  # 注册中心配置 
  registry:
    id: dubbo-provider
    address: zookeeper://127.0.0.1:${embedded.zookeeper.port}
    group: local
  application:
    name: dubbo-provider
    id: dubbo-provider
    logger: slf4j
    qosEnable: true
    qosPort: 22224
    qosAcceptForeignIp: false
  # dubbo 协议配置
  protocol:
    # -1 表示使用随机未被占用的端口
    port: -1
    name: dubbo
  scan:
    # dubbo 服务提供者实现类所在包
    base-packages: com.zero.provider.impl
  • 实现 api 定义的接口
    注意 @Service 是 Dubbo 的,不要导入了 Spring 的。
import com.google.common.collect.Lists;
import com.zero.api.model.User;
import com.zero.api.provider.UserProvider;
import org.apache.dubbo.config.annotation.Service;
import java.util.List;
@Service(interfaceClass = UserProvider.class)
public class UserProviderImpl implements UserProvider {
    @Override
    public List<User> listUser() {
        User user = new User();
        user.setId(1L);
        user.setUsername("青龙");
        return Lists.newArrayList(user);
    }
}

Consumer

  • Pom 定义:

我们要依赖 spring-boot-starter-web 提供http rest接口给前端调用。同时内部通过 Dubbo 实现 RPC调用服务提供者。

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>zero.springboot.study</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <!--dubbo start-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.1</version>
        </dependency>
        <!-- Zookeeper dependencies -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.1</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--dubbo end-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
  • yaml 定义:
server:
  # web 日更年期端口
  port: 9005
spring:
  application:
    name: dubbo-comsumer
#自定义配置
embedded:
  zookeeper:
    port: 2181
# dubbo 配置
dubbo:
  registry:
    id: dubbo-comsumer
    address: zookeeper://127.0.0.1:${embedded.zookeeper.port}
    group: local
  application:
    name: dubbo-comsumer
    id: dubbo-comsumer
    logger: slf4j
    qosEnable: false
    qosPort: 22223
    qosAcceptForeignIp: false
  protocol:
    port: -1
    name: dubbo
  # 是否检查服务提供者有效 
  consumer:
    check: false
  • 服务消费者调用服务生产者
import com.zero.api.model.User;
import com.zero.api.provider.UserProvider;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
    @Reference
    private UserProvider userProvider;
    public List<User> listUser() {
        return userProvider.listUser();
    }
}
  • 我们通过一个RESTfull接口,提供给前端调用。
@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping
    public Object listUser() {
        List<User> list = userService.listUser();
        return list;
    }
}

总结

各种具体协议、注册中心、多注册中心、超时等配置可以查看官方文档http://dubbo.apache.org/zh-cn/docs/user/quick-start.html


相关文章
|
11月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
1468 8
|
消息中间件 人工智能 监控
文生图架构设计原来如此简单之分布式服务
想象一下,当成千上万的用户同时要求AI画图,如何公平高效地处理这些请求?文生图/图生图大模型的架构设计看似复杂,实则遵循简单而有效的原则:合理排队、分工明确、防患未然。
495 14
文生图架构设计原来如此简单之分布式服务
|
人工智能 自然语言处理 前端开发
20分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
本文介绍如何使用Spring Boot3与Vue2快速构建基于DeepSeek的AI对话系统。系统具备实时流式交互、Markdown内容渲染、前端安全防护等功能,采用响应式架构提升性能。后端以Spring Boot为核心,结合WebFlux和Lombok开发;前端使用Vue2配合WebSocket实现双向通信,并通过DOMPurify保障安全性。项目支持中文语义优化,API延迟低,成本可控,适合个人及企业应用。跟随教程,轻松开启AI应用开发之旅!
|
SQL 分布式计算 DataWorks
MaxCompute MaxFrame评测 | 分布式Python计算服务MaxFrame(完整操作版)
在当今数字化迅猛发展的时代,数据信息的保存与分析对企业决策至关重要。MaxCompute MaxFrame是阿里云自研的分布式计算框架,支持Python编程接口、兼容Pandas接口并自动进行分布式计算。通过MaxCompute的海量计算资源,企业可以进行大规模数据处理、可视化数据分析及科学计算等任务。本文将详细介绍如何开通MaxCompute和DataWorks服务,并使用MaxFrame进行数据操作。包括创建项目、绑定数据源、编写PyODPS 3节点代码以及执行SQL查询等内容。最后,针对使用过程中遇到的问题提出反馈建议,帮助用户更好地理解和使用MaxFrame。
|
监控 Java API
【潜意识Java】使用SpringBoot构建高效的RESTfulAPI
本文介绍了使用Spring Boot构建RESTful API的完整流程,涵盖从项目创建到API测试的各个步骤。
870 1
|
SQL 分布式计算 数据处理
云产品评测|分布式Python计算服务MaxFrame | 在本地环境中使用MaxFrame + 基于MaxFrame实现大语言模型数据处理
本文基于官方文档,介绍了由浅入深的两个部分实操测试,包括在本地环境中使用MaxFrame & 基于MaxFrame实现大语言模型数据处理,对步骤有详细说明。体验下来对MaxCompute的感受是很不错的,值得尝试并使用!
365 1
|
Web App开发 消息中间件 Prometheus
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!(一)
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!
|
JSON 监控 安全
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!(二)
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!
|
Prometheus 监控 Cloud Native
SpringBoot服务监控机制,总算整明白了!
SpringBoot服务监控机制,总算整明白了!
SpringBoot服务监控机制,总算整明白了!
|
缓存 监控 Java
[原创]SpringBoot服务监控-SpringBootAdmin
[原创]SpringBoot服务监控-SpringBootAdmin
[原创]SpringBoot服务监控-SpringBootAdmin