《Apache Dubbo微服务开发从入门到精通》——服务治理与生态——三、 网关(1) https://developer.aliyun.com/article/1223994
b) 进阶篇:复杂场景示例
在上述的简单用例中可以看出,我们确实通过Apache APISIX将Dubbo Service发布为一个HTTP服务,但是在使用过程中的限制也非常明显。比如:接口的参数和返回值都必须要是Map。
那么,如果项目中出现已经定义好、但又不符合上述限制的接口,该如何通过Apache APISIX来暴露HTTP服务呢?
操作步骤
针对上述场景,我们可以通过HTTP Request Body描述要调用的Service和Method以及对应参数,再利用Java的反射机制实现目标方法的调用。最后将返回值序列化为JSON,并写入到HTTP Response Body中。
这样就可以将Apache APISIX的「HTTP to Dubbo」能力进一步加强,并应用到所有已存在的Dubbo Service中。具体操作可参考下方:
• 为已有项目增加一个Dubbo Service用来统一处理HTTP to Dubbo的转化。
public class DubboInvocationParameter { private String type; private String value; } public class DubboInvocation { private String service; private String method; private DubboInvocationParameter[] parameters; } public interface HTTP2DubboService { Map<String, Object> invoke(Map<String, Object> context) throws Exception; } @Component public class HTTP2DubboServiceImpl implements HTTP2DubboService { @Autowired private ApplicationContext appContext; @Override public Map<String, Object> invoke(Map<String, Object> context) throws Exception { DubboInvocation invocation = JSONObject.parseObject((byte[]) context.get("body"), DubboInvocation.class); Object[] args = new Object[invocation.getParameters().size()]; for (int i = 0; i < args.length; i++) { DubboInvocationParameter parameter = invocation.getParameters().get(i); args[i] = JSONObject.parseObject(parameter.getValue(), Class.forName(parameter.getType())); } Object svc = appContext.getBean(Class.forName(invocation.getService())); Object result = svc.getClass().getMethod(invocation.getMethod()).invoke(args); Map<String, Object> httpResponse = new HashMap<>(); httpResponse.put("status", 200); httpResponse.put("body", JSONObject.toJSONString(result)); return httpResponse; } }
• 通过如下命令请求来发起相关调用。
3) 总结
本文为大家介绍了如何借助Apache APISIX实现Dubbo Service的代理,通过引入dubbo-proxy插件便可为Dubbo框架的后端系统构建更简单更高效的流量链路。
希望通过上述操作步骤和用例场景分享,能为大家在相关场景的使用提供借鉴思路。更多关于dubbo-proxy插件的介绍与使用可参考官方文档。
《Apache Dubbo微服务开发从入门到精通》——服务治理与生态——三、 网关(3) https://developer.aliyun.com/article/1223991