自定义 实现类

自定义实现类几种方式

dubbo 实现

private ThirdApiService initDubboService() throws Exception {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName(applicationContext.getId());
        RegistryConfig registry = getRegistryConfig();
        ReferenceConfig<ThirdApiService > referenceConfig = new ReferenceConfig<>();
        referenceConfig.setInterface(ThirdMeetingApiService.class);
        if(StringUtils.isNotBlank(dubboGroup)){
            referenceConfig.setGroup(dubboGroup);
        }
        referenceConfig.setRegistry(registry);
        referenceConfig.setApplication(applicationConfig);
        //ReferenceConfig实例很重,封装了与注册中心的连接以及与提供者的连接,
        //需要缓存,否则重复生成ReferenceConfig可能造成性能问题并且会有内存和连接泄漏。
        //API方式编程时,容易忽略此问题。
        //这里使用dubbo内置的简单缓存工具类进行缓存

        ReferenceConfigCache cache = ReferenceConfigCache.getCache();
        ThirdApiService genericService = cache.get(referenceConfig);
        // 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用
        if (genericService == null) {
            genericService = referenceConfig.get();
        }
        return genericService;
    }
/**
 * 第三方接口调用
 * @author Zhao.Li
 * @since 2020/9/18.
 */
public interface ThirdApiService  {
}
接入代码

maven引入依赖:

        <dependency>
            <groupId>com.meicloud.mp</groupId>
            <artifactId>vmm-service-third-interface</artifactId>
            <version>1.2.0</version>
        </dependency>
实现dubbo接口:com.meicloud.mp.vmm.third.service.ThirdApiService

@Service("customThirdApiService")
public class CustomThirdService implements ThirdApiService {

//TODO 具体接入实现

}
配置dubbo接口

<dubbo:service interface="com.meicloud.mp.vmm.third.service.ThirdApiService" ref="customThirdApiService"/>


扩展包 ext

@Configuration
@Slf4j
public class ThirdApiServiceConfiguration {

    private static final String CUSTOM_EXTRENSION_SERVICE = "custom";

    @Value("${common.vmm.thirdapi.service:com.meicloud.mp.ne.meeting.service.NeMeetingService}")
    private String thirdApiServiceClassName;

    @Autowired
    private ApplicationContext applicationContext;

    @Value("${common.zookeeper.hosts}")
    private String zookeeperAddress;

    @Value("${dubbo.registry.protocol}")
    private String zookeeperProtocol;

    @Value("${vmm.dubbo.timeout.seconds:60000}")
    private Integer vmmDubboTimeout;

    @Value("${vmm.dubbo.group:}")
    private String dubboGroup;

    private boolean isCustom() {
        return Objects.equals(CUSTOM_EXTRENSION_SERVICE, thirdApiServiceClassName);
    }

    private RegistryConfig getRegistryConfig() {
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress(zookeeperAddress);
        registry.setProtocol(zookeeperProtocol);
        return registry;
    }

    @Bean
    public ThirdMeetingApiService thirdMeetingApiService() {
        log.info("load thirdApiServiceClassName:{} ", thirdApiServiceClassName);
        if (StringUtils.isBlank(thirdApiServiceClassName)) {
            throw new BaseException(VmmErrorCode.MEETING_THIRD_CONFIG_ERROR, "common.vmm.thirdapi.service配置不能为空");
        }
        if (isCustom()) {
            try {
                return initDubboService();
            } catch (Exception e) {
                throw new BaseException(VmmErrorCode.MEETING_THIRD_CONFIG_ERROR, "common.vmm.thirdapi.service配置自定义扩展初始化错误,无法实例化,msg:" + e.getMessage(), e);
            }
        }
        try {
            Class<?> clazz = Class.forName(thirdApiServiceClassName);
            return (ThirdMeetingApiService) clazz.getDeclaredConstructor().newInstance();
        } catch (ClassNotFoundException e) {
            throw new BaseException(VmmErrorCode.MEETING_THIRD_CONFIG_ERROR, "common.vmm.thirdapi.service配置错误,class[" + thirdApiServiceClassName + "]不存在", e);
        } catch (NoSuchMethodException | InvocationTargetException e) {
            throw new BaseException(VmmErrorCode.MEETING_THIRD_CONFIG_ERROR, "common.vmm.thirdapi.service配置错误,class[" + thirdApiServiceClassName + "]需要无参public构造方法", e);
        } catch (IllegalAccessException | InstantiationException e) {
            throw new BaseException(VmmErrorCode.MEETING_THIRD_CONFIG_ERROR, "common.vmm.thirdapi.service配置错误,class[" + thirdApiServiceClassName + "]无法实例化", e);
        }
    }

    private ThirdMeetingApiService initDubboService() throws Exception {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName(applicationContext.getId());
        RegistryConfig registry = getRegistryConfig();
        ReferenceConfig<ThirdMeetingApiService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setInterface(ThirdMeetingApiService.class);
        if(StringUtils.isNotBlank(dubboGroup)){
            referenceConfig.setGroup(dubboGroup);
        }
        referenceConfig.setRegistry(registry);
        referenceConfig.setApplication(applicationConfig);
        //ReferenceConfig实例很重,封装了与注册中心的连接以及与提供者的连接,
        //需要缓存,否则重复生成ReferenceConfig可能造成性能问题并且会有内存和连接泄漏。
        //API方式编程时,容易忽略此问题。
        //这里使用dubbo内置的简单缓存工具类进行缓存

        ReferenceConfigCache cache = ReferenceConfigCache.getCache();
        ThirdMeetingApiService genericService = cache.get(referenceConfig);
        // 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用
        if (genericService == null) {
            genericService = referenceConfig.get();
        }
        return genericService;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值