delivery变成integration
大致思路:
aw07中的delivery不再作为微服务的一部分(去掉discovery和gateway配置)
pos-cart中添加发送消息的部分;发送的消息有load,字符串(与aw08样例中直接get不同);添加接收
pos-delivery 保持不变
Tech Solution
- pos-order
替换成改写demo中的inbound/outbound
inboud:处理发送来的post请求,提取string信息,调用placeOrder函数进行中间处理转换
1 | inboundGateway(uri) |
中间处理ref
outbound:向pos-delivery发送post请求
1 | outboundGateway((Message<String> r)->r.getPayload()) |
#注释 初步 handle是具体的处理函数,可以做简单的处理
method改动
pos-delivery:
普通的网页应用 rest架构,参数使用和测试方法参考
1
curl -d "orderInfo=3|CityA" http://localhost:8086/delivery/
采用了RequestParam
pos-cart
提问:post传递参数和url中携带参数的不同?
Reference:
outbound中使用的流的类型BaseHttpMessageHandlerSpec
搜索关键词:intergrationflows inbound post
pos-order inbound 接收参数,
在函数中额外指定input/outputChannel;xml配置
- 引入channel配置
AbstractApplicationContext context = new ClassPathXmlApplicationContext(xmlfile in resource,claassName);
- 对inbound channel配置
https://stackoverflow.com/questions/50108253/http-outbound-gateway-post-with-payload
测试 curl -X POST -d “orderInfo=3|CityA” http://localhost:8085/order 在暂时删除掉inbound中的处理函数的情况下
-d 是json的意思
curl -H “Content-Type:text/plain” -X POST -d ‘p1|p2|addr:CityA’ http://localhost:8085/order 明确是发送字符串
Obstacles:
- 直接访问样例中的外部服务无问题,但是运行时出现:
1 | GenericMessage [payload=Each hair in Chuck Norris's beard contributes to make the world's largest DDOS., headers={Transfer-Encoding=chunked, http_requestMethod=GET, errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@3be35f5c, Server=cloudflare, Connection=keep-alive, http_statusCode=200 OK, Date=1653960361000, Via=1.1 vegur, accept=*/*, replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@3be35f5c, host=localhost:8080, http_requestUrl=http://localhost:8080/check, id=35b1eb39-4b71-13c7-c14e-9a360c5a757e, contentType=application/json;charset=UTF-8, user-agent=curl/7.47.0, timestamp=1653960361139}] |
与外部服务链接无问题 如果需要查看其中的信息可能需要指定gateway,指定errorChannel并提取信息
解决: 中间的打印实际上消耗了流中的数据 因此去掉打印的代码即可
- 设计上的不足 head的模式 类型不匹配——用json改写所有看看
how to find api I need:
search spring integration directly:搜索出来的结果和demo并不相似,更像老师的hello-world例子,即显式调用channel发送消息,样例中的服务本质并不是独立服务而是一个java类中的方法
直接搜索demo中调用的方法,查看api doc;然后搜素是否可能用该api传递post中的参数
利用xml是配置的好方式尤其是使用了默认的channel的时候,但是对于代码阅读不是很直观,可以参考stackoverflow和github搜索到的代码样例中的api
Thoughts
inbound outbound作为接口 和之前接收http request的方法比更加简洁,体现了流式了处理,可以把更多的精力放在中间处理函数上(因为之前在http request上花费了时间)借用更加稳定的架构