服务消费端泛化调用 GenericService ReferenceConfig dubbo服务接口调用防重

GenericService 通用服务 invoke 援引
https://www.cnblogs.com/xhj123/p/9076530.html
// 当前应用配置
ApplicationConfig applicationConfig= new ApplicationConfig();
applicationConfig.setName(“dubboConsumer”);//应用名称配置
ReferenceConfig referenceConfig = new ReferenceConfig();
referenceConfig.setInterface(ApiContext.getContext().getInterfaceName());
referenceConfig.setVersion(ApiContext.getContext().getVersion());
referenceConfig.setGeneric(true); // 声明为泛化接口
referenceConfig.setApplication(applicationConfig);.//
referenceConfig.setRegistry(registryConfig);//RegistryConfig 注册中心相关配置
referenceConfig.setTimeout(30000);

        GenericService genericService = ReferenceConfigCache.getCache().get(referenceConfig);

        // 如果启动OpenApi时 后端Dubbo服务没有提供者则需要销毁缓存,否则等提供者正常运行后无法正常获取提供者
        if (genericService == null) {
            ReferenceConfigCache.getCache().destroy(referenceConfig);
            return new ApiResponse(ErrorCodeConst.GLOBAL_UNKNOW_SERVICE, "服务不可用");
        }
        
        //接口防重
        if(checkRepeatRequest(apiEntity)) {
        	return new ApiResponse(ErrorCodeConst.GLOBAL_REQUEST_REPEAT, "请求已被处理!");
    	}
        
        response = genericService.$invoke(ApiContext.getContext().getInterfaceMethod(), ApiContext.getContext().getInvokerContext().getParamTypes(), ApiContext.getContext().getInvokerContext().getArgs());
        if (MediaType.APPLICATION_OCTET_STREAM_VALUE.equals(accept)) {
            outStream(request, response1, response);
            return null;
        }	
	apiResponse = new ApiResponse();
    apiResponse.setCode("0");
    apiResponse.setData(response);

    PropertyFilter filter = new PropertyFilter() {
        public boolean apply(Object source, String name, Object value) {
            if ("class".equals(name)) {
                return false;
            }
            return true;
        }
    };
    LogBusinessDto log = this.getLog(request);
    
	SerializerFeature[] serializerFeatureArray =new SerializerFeature[] {SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.QuoteFieldNames};
    
    SerializeWriter sw = new SerializeWriter(serializerFeatureArray);

    JSONSerializer serializer = new JSONSerializer(sw);
    serializer.getPropertyFilters().add(filter);

    serializer.getMapping().put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
    serializer.write(apiResponse);
    log.setOutParam(sw + "");
    try {
        this.saveLog(log);
    }catch (Exception e){
        logger.info("============{}",e.getMessage());
    }

    logger.info("response={} times={}", sw, String.valueOf(System.currentTimeMillis() - time1));

    return sw.toString();

/**
*
* @param apiEntity
* @return true 重复请求 false 正常请求
*/
public Boolean checkRepeatRequest(ApiEntity apiEntity){

	Boolean result = false;
	
	//老版本调法 无需校验是否重复请求
	if(!StringUtils.isEmpty(apiEntity.getUniqueKey())) {
		String redisKey = "CHECK_REPEAT_REQUEST_"+apiEntity.getUniqueKey();
		String lockResult = jedisCluster.set(redisKey, UUID.randomUUID().toString(), "NX", "PX", 10*60*1000);
        if (!LOCK_SUCCESS.equals(lockResult)) {
        	result =  true;
        	logger.error("重复的请求,method={},key={}",apiEntity.getMethod(),apiEntity.getUniqueKey());
        }
	}
	
	return result;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值