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")@slf4jpublic 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<ordervo> page = new page<>(nowpage,pagesize); if(userid != null && userid.trim().length()>0){ page<ordervo> 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.mapmergerset=org.apache.dubbo.rpc.cluster.merger.setmergerlist=org.apache.dubbo.rpc.cluster.merger.listmergerbyte=org.apache.dubbo.rpc.cluster.merger.bytearraymergerchar=org.apache.dubbo.rpc.cluster.merger.chararraymergershort=org.apache.dubbo.rpc.cluster.merger.shortarraymergerint=org.apache.dubbo.rpc.cluster.merger.intarraymergerlong=org.apache.dubbo.rpc.cluster.merger.longarraymergerfloat=org.apache.dubbo.rpc.cluster.merger.floatarraymergerdouble=org.apache.dubbo.rpc.cluster.merger.doublearraymergerboolean=org.apache.dubbo.rpc.cluster.merger.booleanarraymerger
其中申明了 dubbo 定义的聚合策略。在指定dubbo 聚合策略时,可使用 dubbo 提供的聚合策略,也可以使用自定义的聚合策略。
如何自定义 dubbo 聚合策略?在 resources 目录下创建以下目录及文件(注意:目录及文件名称不可变)。
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<page> { @override public page merge(page... items) { page<object> page = new page<>(); list<object> 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<ordervo> getorderbyuserid(integer userid, page<ordervo> page);}
orderserviceimpla 实现类:
@dubboservice(group = "2017")@slf4jpublic class orderserviceimpla implements orderservice { @autowired private moocorder2017tmapper moocorder2017tmapper; /** * 使用当前登陆人获取已经购买的订单 * * @param userid * @param page * @return */ @override public page<ordervo> getorderbyuserid(integer userid, page<ordervo> page) { page<ordervo> result = new page<>(); if(userid == null){ log.error("订单查询业务失败,用户编号未传入"); return null; }else{ list<ordervo> ordersbyuserid = moocorder2017tmapper.getordersbyuserid(userid,page); if(ordersbyuserid==null && ordersbyuserid.size()==0){ result.settotal(0); result.setrecords(new arraylist<>()); return result; }else{ // 获取订单总数 entitywrapper<moocorder2017t> 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")@slf4jpublic class orderserviceimplb implements orderservice { @autowired private moocorder2018tmapper moocorder2018tmapper; /** * 使用当前登陆人获取已经购买的订单 * * @param userid * @param page * @return */ @override public page<ordervo> getorderbyuserid(integer userid, page<ordervo> page) { page<ordervo> result = new page<>(); if(userid == null){ log.error("订单查询业务失败,用户编号未传入"); return null; }else{ list<ordervo> ordersbyuserid = moocorder2018tmapper.getordersbyuserid(userid,page); if(ordersbyuserid==null && ordersbyuserid.size()==0){ result.settotal(0); result.setrecords(new arraylist<>()); return result; }else{ // 获取订单总数 entitywrapper<moocorder2018t> 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实现组聚合的详细内容。
