调用第三方接口优化点

调用第三方接口优化点

import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.concurrent.*;
/*
https://www.bilibili.com/video/BV1YV41147wb?p=7
b栈上面学习到的。
链接:https://www.bilibili.com/video/BV1YV41147wb?p=7
当我们去请求第三方的接口时。我们每次请求只需要传入一个id拿到对应的数据。
但如果我们请求量很大。可能将第三方搞崩溃。
如果第三方有提供批量接口。 我们可以将请求的id先存在本地。 然后10ms,批量请求一次。
结果放入CompletableFuture里面。 然后通过其get()方法,complete() 唤醒get()。等待结果的返回。

注意点:
1. 批量接口有返回一个全局的id。 这样可以对应的单id的请求。
2.如果没有返回某一个id的值。一直ConcurrentLinkedQueue.get(), 感觉最好加一个过期时间。


 */

@Service
public class NextService {

    ConcurrentLinkedQueue<Request> queue = new ConcurrentLinkedQueue<>();
    class Request<T> {
        Integer id;
        String res;
        CompletableFuture<T> future;
    }

    public String get(Integer id) throws ExecutionException, InterruptedException {
        // 原: 每次调第三方,单个接口
        // return "第三方接口" + id;
        CompletableFuture<String> completableFuture = new CompletableFuture();
        Request<String> request = new Request();
        request.id = id;
        request.future = completableFuture;

        queue.add(request);
        return completableFuture.get();


    }
    @PostConstruct
    public void dealQueueTask(){
        ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);

        scheduledThreadPoolExecutor.scheduleWithFixedDelay(()->{
            if(queue.size() == 0){
                return;
            }
            // 批量拿出数据  拼装批量参数  批量请求


          /*
           放入结果
            Request poll = queue.poll();
            poll.future.complete("结果");*/
        }, 0, 10, TimeUnit.MILLISECONDS);
    }



}

hystrix 请求合并

依赖 springboot、maven、jdk版本有要求

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

启动类

      @EnableHystrix

请求合并配置

import app.cn.in.StringService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.Future;
@Service
public class StringServiceImpl implements StringService {

    @Override
    @HystrixCollapser(batchMethod = "more",
            // 控制请求合并的作用域,默认是REQUEST,就是不会跨越多个请求会话的,只在当前用户请求中合并多次请求为         //批处理请求。这里改成GLOBAL,就是可以跨越request context,合并不同用户的请求为一次批处理请求。
            scope = com.netflix.hystrix.HystrixCollapser.Scope.GLOBAL,
            // 此属性设置创建批处理后触发其执行的毫秒数。
            collapserProperties = {@HystrixProperty(name ="timerDelayInMilliseconds",value = "100"),
                    // 此属性设置在触发批处理执行之前批处理中允许的最大请求数。
                    @HystrixProperty(name ="maxRequestsInBatch",value = "10")
                    // requestCache.enabled
                    //此属性指示是否为HystrixCollapser.execute()和HystrixCollapser.queue()调用启用请求高速缓存。
            })
    public Future<String> one(Integer id) {
        return null;
    }

    @Override
    @HystrixCommand
    public List<String> more(List<Integer> ids) {
        System.out.println(ids + "===================  ");
        if(CollectionUtils.isEmpty(ids)){
            return null;
        }
        List<String> res = new ArrayList<>(ids.size());
        ids.forEach(id->{
            res.add(id + UUID.randomUUID().toString());
        });
        return res;
    }
}

测试

@RequestMapping("/order")
@RestController
public class StrController {

    @Resource
    private StringService stringService;

    @GetMapping("/one")
    public String getOrders() throws ExecutionException, InterruptedException {
          this.stringService.one(1);
          this.stringService.one(2);
        Future<String> one = this.stringService.one(3);
        return one.get();

    }

效果是调用one方法 多个请求会合并去请求 more方法

在批量接口中对传入的数据排序 扰乱原来的顺序 则取用结果错误

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 帆软是一个 BI(Business Intelligence)软件,而调用第三方接口是实现数据交互的常见操作。在帆软中调用第三方接口,通常需要使用 Java 程序来实现。 Java 是跨平台的编程语言,它能够实现对不同操作系统和不同软件的调用。因此,在帆软中使用 Java 调用第三方接口是可行的,同时还具有灵活和扩展性等优。 首先,需要编写 Java 程序来实现调用第三方接口的功能。编写 Java 程序需要掌握相关的编程语言和开发工具,比较常用的有 Eclipse、IntelliJ IDEA 等,同时还需要了解 Java 的相关知识,如基本语法、面向对象编程、IO 操作、网络编程等。 其次,需要将编写好的 Java 程序打包成 jar 包,然后将 jar 包导入到帆软中。在帆软中,选择对应的数据集,然后在数据集的“查询脚本”中配置调用 Java 程序的相关参数。 最后,保存配置,测试数据集查询是否能够正常返回数据。如果测试通过,则说明成功使用 Java 调用第三方接口,可以开始进行数据交互和数据分析等操作。 总的来说,使用 Java 调用第三方接口在帆软中实现数据交互是非常方便和实用的。需要掌握一些基本的编程知识和工具,同时还要了解具体的第三方接口调用方式和参数等,通过不断实践和优化,可以实现更加高效和稳定的数据交互流程。 ### 回答2: 使用帆软调用第三方接口java,首先要确保该接口已经部署并运行在服务器上。然后,在帆软报表设计器中,可以通过Java插件和定制代码的方式来实现调用第三方接口。具体步骤如下: 1. 添加Java插件 在报表设计器中,击“工具”菜单,选择“选项”,进入“选项”对话框。在左侧面板中选择“扩展”,然后击“添加”按钮,选择“Java插件”,击“确定”按钮,即可完成Java插件的添加。 2. 编写Java代码 在报表设计器中,击“数据”菜单,选择“数据源”,进入“数据源管理器”对话框。选择“JavaBean”的数据源类型,然后在“自定义代码”文本框中编写Java代码,通过调用第三方接口获取所需数据。 3. 引用JavaBean 在报表设计器中,击“工具”菜单,选择“选项”,进入“选项”对话框。在左侧面板中选择“数据源”,然后击“添加”按钮,选择“JavaBean”的数据源类型。在“JavaBean类名”文本框中输入JavaBean的全限定名,然后击“确定”按钮,即可引用JavaBean。 4. 制作报表 在报表设计器中,添加数据集,并将数据集绑定到相应的数据源。然后在报表中添加需要的图表、表格等控件,并将控件的数据绑定到数据集上。 总的来说,通过Java插件和定制代码的方式,可以方便地将帆软报表与第三方接口集成起来,从而实现更为灵活和强大的报表功能。但同时也要注意,编写Java代码需要具备一定的Java开发经验和技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值