当前位置:

首页 > 编程开发 > springboot怎么整合dubbo实现组聚合

springboot怎么整合dubbo实现组聚合

消费者yml文件配置:dubbo:application:name:dubbo-gatewayregistry:address:zookeeper://127.0.0.1:2181server:trueprovider:timeout:3000protocol:name:dubboport:20881controller类:@RestController@RequestMapping(value="/order")@Slf4jpublicclassOrderController{/***dubbo的分组特

本文目录

    消费者

    yml 文件配置:

    dubbo:
      application:
        name: dubbo-gateway
      registry:
        address: zookeeper://127.0.0.1:2181
      server: true
      provider:
        timeout: 3000
      protocol:
        name: dubbo
        port: 20881

    controller 类:

    @RestController
    @RequestMapping(value = "/order")
    @Slf4j
    public class OrderController {
    
    /**
         * dubbo 的分组特性:group(指定将要聚合的分组)
         * dubbo 的聚合特性:merger(指定聚合策略)
         * 自定义策略申明文件名为:org.apache.dubbo.rpc.cluster.Merger(不可变),文件夹名:META-INF.dubbo(不可变)
         */
        @DubboReference(check = false, group = "2017,2018", merger = "page")
        private OrderService orderService;
    
    /**
         * 查看订单信息
         *
         * @param nowPage
         * @param pageSize
         * @return
         */
        @PostMapping("/getOrderInfo")
        public ResponseVO getOrderInfo(@RequestParam(name = "nowPage", required = false, defaultValue = "1") Integer nowPage,
                                       @RequestParam(name = "pageSize", required = false, defaultValue = "5") Integer pageSize) {
    
            // 获取当前登陆人的信息
            String userId = CurrentUser.getUserId();
    
            // 使用当前登陆人获取已经购买的订单
            Page page = new Page<>(nowPage,pageSize);
            if(userId != null && userId.trim().length()>0){
                Page result = orderService.getOrderByUserId(Integer.parseInt(userId), page);
    
                return ResponseVO.success(nowPage, (int) result.getPages(),"",result.getRecords());
    
            }else{
                return ResponseVO.serviceFail("用户未登陆");
            }
        }

    自定义聚合策略

    在 dubbo-3.0.9.jar!/META-INF/dubbo/internal/ 目录下有一个 org.apache.dubbo.rpc.cluster.Merger 文件,文件内容如下:

    map=org.apache.dubbo.rpc.cluster.merger.MapMerger
    set=org.apache.dubbo.rpc.cluster.merger.SetMerger
    list=org.apache.dubbo.rpc.cluster.merger.ListMerger
    byte=org.apache.dubbo.rpc.cluster.merger.ByteArrayMerger
    char=org.apache.dubbo.rpc.cluster.merger.CharArrayMerger
    short=org.apache.dubbo.rpc.cluster.merger.ShortArrayMerger
    int=org.apache.dubbo.rpc.cluster.merger.IntArrayMerger
    long=org.apache.dubbo.rpc.cluster.merger.LongArrayMerger
    float=org.apache.dubbo.rpc.cluster.merger.FloatArrayMerger
    double=org.apache.dubbo.rpc.cluster.merger.DoubleArrayMerger
    boolean=org.apache.dubbo.rpc.cluster.merger.BooleanArrayMerger

    其中申明了 dubbo 定义的聚合策略。在指定dubbo 聚合策略时,可使用 dubbo 提供的聚合策略,也可以使用自定义的聚合策略。

    如何自定义 dubbo 聚合策略?

    在 resources 目录下创建以下目录及文件(注意:目录及文件名称不可变)。

    springboot怎么整合dubbo实现组聚合

    org.apache.dubbo.rpc.cluster.Merger 文件内容如下:

    # 自定义聚合策略
    page=com.stylefeng.guns.gateway.config.PageMerger

    自定义聚合策略类:

    package com.stylefeng.guns.gateway.config;
    import com.baomidou.mybatisplus.plugins.Page;
    import org.apache.dubbo.rpc.cluster.Merger;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.concurrent.atomic.AtomicInteger;
    
    public class PageMerger implements Merger {
    
    
        @Override
        public Page merge(Page... items) {
            Page page = new Page<>();
    
            List records = new ArrayList<>();
            AtomicInteger total = new AtomicInteger();
    
            Arrays.stream(items).forEach(item -> {
                records.addAll(item.getRecords());
                total.addAndGet((int) item.getPages());
            });
            page.setRecords(records);
            page.setSize(total.get());
            return page;
        }
    }

    提供者

    yml 文件配置:

    dubbo:
      application:
        name: dubbo-order
      registry:
        address: zookeeper://127.0.0.1:2181
      server: true
      provider:
        timeout: 3000
      protocol:
        name: dubbo
        port: 20885

    接口及其实现

    OrderService 接口:

    public interface OrderService {
    
        /**
         * 使用当前登陆人获取已经购买的订单
         * @param userId
         * @param page
         * @return
         */
        Page getOrderByUserId(Integer userId, Page page);
    
    }

    OrderServiceImplA 实现类:

    @DubboService(group = "2017")
    @Slf4j
    public class OrderServiceImplA implements OrderService {
    
        @Autowired
        private MoocOrder2017TMapper moocOrder2017TMapper;
    
        /**
         * 使用当前登陆人获取已经购买的订单
         *
         * @param userId
         * @param page
         * @return
         */
        @Override
        public Page getOrderByUserId(Integer userId, Page page) {
            Page result = new Page<>();
            if(userId == null){
                log.error("订单查询业务失败,用户编号未传入");
                return null;
            }else{
                List ordersByUserId = moocOrder2017TMapper.getOrdersByUserId(userId,page);
                if(ordersByUserId==null && ordersByUserId.size()==0){
                    result.setTotal(0);
                    result.setRecords(new ArrayList<>());
                    return result;
                }else{
                    // 获取订单总数
                    EntityWrapper entityWrapper = new EntityWrapper<>();
                    entityWrapper.eq("order_user",userId);
                    Integer counts = moocOrder2017TMapper.selectCount(entityWrapper);
                    // 将结果放入Page
                    result.setTotal(counts);
                    result.setRecords(ordersByUserId);
    
                    return result;
                }
            }
        }
    }

    OrderServiceImplB 实现类:

    @DubboService(group = "2018")
    @Slf4j
    public class OrderServiceImplB implements OrderService {
    
        @Autowired
        private MoocOrder2018TMapper moocOrder2018TMapper;
    
        /**
         * 使用当前登陆人获取已经购买的订单
         *
         * @param userId
         * @param page
         * @return
         */
        @Override
        public Page getOrderByUserId(Integer userId, Page page) {
            Page result = new Page<>();
            if(userId == null){
                log.error("订单查询业务失败,用户编号未传入");
                return null;
            }else{
                List ordersByUserId = moocOrder2018TMapper.getOrdersByUserId(userId,page);
                if(ordersByUserId==null && ordersByUserId.size()==0){
                    result.setTotal(0);
                    result.setRecords(new ArrayList<>());
                    return result;
                }else{
                    // 获取订单总数
                    EntityWrapper entityWrapper = new EntityWrapper<>();
                    entityWrapper.eq("order_user",userId);
                    Integer counts = moocOrder2018TMapper.selectCount(entityWrapper);
                    // 将结果放入Page
                    result.setTotal(counts);
                    result.setRecords(ordersByUserId);
    
                    return result;
                }
            }
        }
    }

    表结构及数据

    表结构:

    CREATE TABLE `mooc_order_2017_t` (
      `UUID` varchar(100) DEFAULT NULL COMMENT '主键编号',
      `cinema_id` int DEFAULT NULL COMMENT '影院编号',
      `field_id` int DEFAULT NULL COMMENT '放映场次编号',
      `film_id` int DEFAULT NULL COMMENT '电影编号',
      `seats_ids` varchar(50) DEFAULT NULL COMMENT '已售座位编号',
      `seats_name` varchar(200) DEFAULT NULL COMMENT '已售座位名称',
      `film_price` double DEFAULT NULL COMMENT '影片售价',
      `order_price` double DEFAULT NULL COMMENT '订单总金额',
      `order_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间',
      `order_user` int DEFAULT NULL COMMENT '下单人',
      `order_status` int DEFAULT '0' COMMENT '0-待支付,1-已支付,2-已关闭'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='订单信息表';
    
    CREATE TABLE `mooc_order_2018_t` (
      `UUID` varchar(100) DEFAULT NULL COMMENT '主键编号',
      `cinema_id` int DEFAULT NULL COMMENT '影院编号',
      `field_id` int DEFAULT NULL COMMENT '放映场次编号',
      `film_id` int DEFAULT NULL COMMENT '电影编号',
      `seats_ids` varchar(50) DEFAULT NULL COMMENT '已售座位编号',
      `seats_name` varchar(200) DEFAULT NULL COMMENT '已售座位名称',
      `film_price` double DEFAULT NULL COMMENT '影片售价',
      `order_price` double DEFAULT NULL COMMENT '订单总金额',
      `order_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间',
      `order_user` int DEFAULT NULL COMMENT '下单人',
      `order_status` int DEFAULT '0' COMMENT '0-待支付,1-已支付,2-已关闭'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='订单信息表';

    表数据:

    INSERT INTO `guns_rest`.`mooc_order_2017_t`(`UUID`, `cinema_id`, `field_id`, `film_id`, `seats_ids`, `seats_name`, `film_price`, `order_price`, `order_time`, `order_user`, `order_status`) VALUES ('329123812gnfn31', 1, 1, 2, '1,2,3,4', '第一排1座,第一排2座,第一排3座,第一排4座', 63.2, 126.4, '2017-05-03 12:13:42', 2, 0);
    INSERT INTO `guns_rest`.`mooc_order_2017_t`(`UUID`, `cinema_id`, `field_id`, `film_id`, `seats_ids`, `seats_name`, `film_price`, `order_price`, `order_time`, `order_user`, `order_status`) VALUES ('310bb3c3127a4551ad72f2f3e53333c7', 1, 1, 2, '9,10', '第一排9座,第一排10座', 60, 120, '2022-07-20 14:25:42', 2, 0);
    
    INSERT INTO `guns_rest`.`mooc_order_2018_t`(`UUID`, `cinema_id`, `field_id`, `film_id`, `seats_ids`, `seats_name`, `film_price`, `order_price`, `order_time`, `order_user`, `order_status`) VALUES ('124583135asdf81', 1, 1, 2, '1,2,3,4', '第一排1座,第一排2座,第一排3座,第一排4座', 63.2, 126.4, '2018-02-12 11:53:42', 2, 0);

    演示:

    springboot怎么整合dubbo实现组聚合

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Dubbo
    相关文章 更多
    Dubbo核心特点与RPC框架对比分析
    Dubbo核心特点与RPC框架对比分析

    Dubbo作为Java领域热门的RPC框架,其特点包括高性能、高可用性和易扩展性。它提供从服务注册与发现、负载均衡、容错处理到监控和运维的一整套解决方案。服务注册与发现通过注册中心(如ZooKeeper、Nacos)实现动态地址管理,提升系统灵活性;负载均衡支持随机、轮询、最少活跃调用数等策略,合理分配流量;容错机制涵盖FailoverCluster、FailfastCluster、FailsafeCluster等策略,增强系统稳定性;服务治理功能包含降级、限流和监控,保障核心服务运行;在与其他RPC框架

    技术探讨:Go语言在Dubbo中的应用前景展望
    技术探讨:Go语言在Dubbo中的应用前景展望

    在当今信息技术飞速发展的时代,各种编程语言层出不穷,而Go语言作为一门快速、高效、并发性好的语言,正逐渐受到越来越多开发者的热捧。在微服务架构中,Dubbo作为一种优秀的RPC框架,随着微服务的兴起也逐渐崭露头角。本文将探讨在Dubbo中使用Go语言的前景展望,并附上具体的代码示例。Go语言与Dubbo的结合Go语言作为一门轻量级、并发性好、编译速度快的语言

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    精品阐述:Dubbo是否已经支持Go语言
    精品阐述:Dubbo是否已经支持Go语言

    尊敬的读者朋友们,今天我们将为您精心奉上一篇关于Dubbo在Go语言方面的探讨文章。Dubbo作为一款优秀的分布式服务框架,在Java语言中得到了广泛的应用和支持。而随着Go语言在近年来的快速发展,许多开发者对于Dubbo是否已经支持Go语言这一问题产生了浓厚的兴趣。本文将从Dubbo在Go语言方面的支持情况、具体实现方法以及代码示例等方面展开阐述,希望能为

    Java API 开发中使用 Apache Dubbo 进行 RPC 远程调用
    Java API 开发中使用 Apache Dubbo 进行 RPC 远程调用

    Java在企业级应用中的广泛应用,为企业及开发者带来了很大的便利。近些年来,随着互联网和移动互联网的迅速发展,数据处理和应用部署的规模也不断扩大,这就对设计和开发产生了更高的要求。因此,远程过程调用(RPC)技术在Java开发中也相应得到了广泛应用。本文将介绍ApacheDubbo作为一种开源的高性能RPC框架,在企业Java开发中的使用。

    Dubbo开发者必读:探讨Dubbo是否支持Go语言
    Dubbo开发者必读:探讨Dubbo是否支持Go语言

    Dubbo开发者必读:探讨Dubbo是否支持Go语言,需要具体代码示例在当前微服务架构的流行趋势下,Dubbo作为一种高性能远程服务调用框架备受关注,但其支持的语言范围一直受到开发者们的关注。特别是对于使用Go语言开发的团队来说,是否能够使用Dubbo作为服务调用框架成为一个重要的问题。本文将深入探讨Dubbo是否支持Go语言,并给出具体的代码示例,希望对D

    Go语言与Dubbo技术分享
    Go语言与Dubbo技术分享

    Dubbo技术分享:Go语言与Dubbo的完美结合随着互联网行业的快速发展和技术的不断升级,微服务架构已经成为了现代化软件开发的主流趋势之一。而Dubbo作为一款优秀的分布式服务框架,在微服务架构中扮演着重要的角色。最近,Go语言作为一门高效、简洁易用的语言,也逐渐受到了广泛的关注与应用。本文将结合这两者,探讨Go语言与Dubbo的完美结合,并分享一些具体的

    探究Dubbo生态下的Go语言应用:最新动向
    探究Dubbo生态下的Go语言应用:最新动向

    Dubbo新动态:Go语言在Dubbo生态中的应用探究近年来,随着微服务架构的兴起,Dubbo作为一款开源的高性能RPC框架,在国内外得到了广泛的应用和推广。在Dubbo的生态圈中,Java一直是最主要的开发语言,但随着Go语言在云原生领域的崛起,越来越多的开发者开始尝试将Go语言与Dubbo相结合,以期获得更好的效果。本文将深入探究Go语言在Dubbo生态

    使用Zookeeper和Dubbo在Beego框架中实现分布式服务治理
    使用Zookeeper和Dubbo在Beego框架中实现分布式服务治理

    随着互联网业务的不断发展,单一服务节点已无法满足高并发、高可用的需求。因此,分布式架构已成为现代化的开发方式,也是必须掌握的技术之一。在分布式架构中,服务治理是一个复杂且重要的问题。为了保证服务的高可用性、质量和性能,服务治理需要实现服务注册、发现、负载均衡、故障转移、监控等多项功能。而Zookeeper和Dubbo正是分布式服务治理的佼佼者,它们能够协同工

    解析SpringBoot和SpringMVC之间的异同
    解析SpringBoot和SpringMVC之间的异同

    解析SpringBoot和SpringMVC之间的异同SpringBoot和SpringMVC是Java领域中非常重要的开发框架。虽然它们都属于Spring框架的一部分,但是在使用和功能上有一些明显的区别。本文将对SpringBoot和SpringMVC进行比较,解析它们之间的异同。首先,让我们来了解一下SpringBoot。SpringBo

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    为什么要购买正版软件?
    01 官方授权

    授权来源透明,订单与许可信息可随时查询。

    02 即时交付

    付款成功后自动发放激活信息,支持订单追踪。

    03 中文协助

    安装、激活、迁移与续费问题都有专人响应。

    04 长期可用

    提供升级提醒与授权管理,换机时也能轻松迁移。

    网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com 网站地图

    Copyright ©2018-2026