本文介绍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;
}