dubbo泛化调用实战

616 阅读1分钟

本文介绍dubbo的泛化调用和使用场景,以及平常的开发中,我们是怎么使用泛化的

1. 使用场景

1. 网关的转发
2. wen透传服务
3. dubbo接口测试

2. 使用介绍


/**
    API
 * 按照用户id返回所有的收货地址
 */
public List<UserAddress> getUserAddressList(String userId);



@RequestMapping("/generic")
public List<UserAddress> initOrder1() {
   ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
   referenceConfig.setApplication(new ApplicationConfig("boot-order-service-consumer"));
   referenceConfig.setRegistry(new RegistryConfig("zookeeper://1.117.109.40:2181"));
   referenceConfig.setInterface("com.roy.service.UserService");
   referenceConfig.setGeneric(true);
   GenericService genericService = referenceConfig.get();
   Object result = genericService.$invoke(
         "getUserAddressList",
         new String[]{"java.lang.String"},
         new Object[]{"1234"});
   System.out.println(result);
   List<UserAddress> userAddressList = (List<UserAddress>) result;
   System.out.println(userAddressList);
   return userAddressList;
}

3. 实战是怎么使用的

我不可能每调用一次就new一个referenceConfig,那还不把我的jvm干爆,不断地GC


@RequestMapping("/actual/generic")
public List<UserAddress> initOrder2() {
   Object result = DubboGenericInvoke.invoke("com.roy.service.UserService", "getUserAddressList", new String[]{"java.lang.String"}, new Object[]{"1234"});
   System.out.println(result);
   List<UserAddress> userAddressList = (List<UserAddress>) result;
   System.out.println(userAddressList);
   return userAddressList;
}




/**
 * @Author: dingyawu
 * @Description: TODO
 * @Date: Created in 17:16 2023/1/15
 */
@Slf4j
public class DubboGenericInvoke {
    private static Map<String, ReferenceConfig<GenericService>> referenceConfigMap = new ConcurrentHashMap<>();

    public static Object invoke(String interfaceClass, String methodName, String[] paramTypes, Object[] params) {
        ReferenceConfig<GenericService> referenceConfig;
        String key = interfaceClass;
        try {
            referenceConfig = referenceConfigMap.get(key);
            if (referenceConfig == null) {
                referenceConfig = new ReferenceConfig<>();
                RegistryConfig registry = new RegistryConfig("zookeeper://1.117.109.40:2181");
                referenceConfig.setRegistry(registry);
                referenceConfig.setGeneric("true");
                referenceConfig.setInterface(interfaceClass);
                referenceConfig.setCheck(true);
                referenceConfigMap.put(key, referenceConfig);
            }
            GenericService genericService = referenceConfigMap.get(key).get();
            Object result = genericService.$invoke(methodName, paramTypes, params);
            if (result == null) {
                log.info("远程服务结果返回为空,请注意查看远程服务的参数:{}", params);
            }
            return result;
        } catch (GenericException e) {
            log.info("发起远程调用失败,错误信息:{}", e.getMessage());
            referenceConfigMap.remove(key);
            return null;

        } catch (Exception e) {
            log.info("远程服务获取结果失败,错误信息:{}", e.getMessage());
            referenceConfigMap.remove(key);
            return null;
        }
    }
}

4. 各种情况参数是怎么传递的

public interface UserService {
   
   /**
    * 按照用户id返回所有的收货地址
    */
    
   public List<UserAddress> getUserAddressList(String userId);


   public List<UserAddress> getUserAddressList(String userId, String name);
   
   
   public List<UserAddress> getUserAddressList(UserAddress userAddress);


   public List<UserAddress> getUserAddressList(List<UserAddress> 
   userAddressList);


   public List<UserAddress> getUserAddressList(UserAddress[] userAddresses);
}




/**
 * 两个String参数
 */
    
@RequestMapping("/actual/generic3")
public List<UserAddress> initOrder3() {
   Object result = DubboGenericInvoke.invoke("com.roy.service.UserService", "getUserAddressList",
         new String[]{"java.lang.String","java.lang.String"},
         new Object[]{"123","dingyawu"});
   System.out.println(result);
   List<UserAddress> userAddressList = (List<UserAddress>) result;
   System.out.println(userAddressList);
   return userAddressList;
}


/**
 * 传的是一个对象
 */
    
@RequestMapping("/actual/generic4")
public List<UserAddress> initOrder4() {

   Map<String,Object> UserAddressMap = new HashMap<>();
   {
      UserAddressMap.put("id",12345);
      UserAddressMap.put("userAddress","苏州市");
      UserAddressMap.put("userId","123");
      UserAddressMap.put("consignee","丁老师");
      UserAddressMap.put("phoneNum","15371452705");
      UserAddressMap.put("isDefault","N");
      UserAddressMap.put("userId","123");
   }

   Object result = DubboGenericInvoke.invoke("com.roy.service.UserService", "getUserAddressList",
         new String[]{"com.roy.bean.UserAddress"},
         new Object[]{UserAddressMap});
   System.out.println(result);
   List<UserAddress> userAddressList = (List<UserAddress>) result;
   System.out.println(userAddressList);
   return userAddressList;
}


/**
 * 传的是一个list
 */
    
@RequestMapping("/actual/generic5")
public List<UserAddress> initOrder5() {
   List<UserAddress> userAddresses = new ArrayList<>();
   UserAddress userAddress = new UserAddress();
   userAddress.setId(12345);
   userAddress.setUserAddress("苏州市");
   userAddress.setUserId("123");
   userAddress.setConsignee("丁老师");
   userAddress.setPhoneNum("15371452705");
   userAddress.setIsDefault("N");
   userAddresses.add(userAddress);

   Object result = DubboGenericInvoke.invoke("com.roy.service.UserService", "getUserAddressList",
         new String[]{"java.util.List"},
         new Object[]{userAddresses});
   System.out.println(result);
   List<UserAddress> userAddressList = (List<UserAddress>) result;
   System.out.println(userAddressList);
   return userAddressList;
}


/**
 * 传的是一个对象数组
 */
    
@RequestMapping("/actual/generic6")
public List<UserAddress> initOrder6() {

   UserAddress[] userAddresses = new UserAddress[1];
   UserAddress userAddress = new UserAddress();
   userAddress.setId(12345);
   userAddress.setUserAddress("苏州市");
   userAddress.setUserId("123");
   userAddress.setConsignee("丁老师");
   userAddress.setPhoneNum("15371452705");
   userAddress.setIsDefault("N");
   userAddresses[0] = userAddress;

   Object result = DubboGenericInvoke.invoke("com.roy.service.UserService", "getUserAddressList",
         new String[]{"com.roy.bean.UserAddress[]"},
         new Object[]{userAddresses});
   System.out.println(result);
   List<UserAddress> userAddressList = (List<UserAddress>) result;
   System.out.println(userAddressList);
   return userAddressList;
}