建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

zora

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-11-6 20:13:19 2799 楼主 显示全部楼层
[技术交流] 【吐槽】用过最恶心的微服务框架CSE

忍不住想吐槽一下,不吐不快,昨天处理了一天SpringBoot异步问题

问题描述:

CSE+Springboot,请求我用DeferredResult异步封装,结果引入CSE后,异步响应还没回复就给我序列化了一个"setOrExpired": false

针对这个问题,先是一顿猛搜,结果大失所望,网上用CSE的都门可罗雀,基本没任何可用信息,实在没辙,耐着性子看源码

问题出在下面:

  1. CSE用反射的方式拿到controller对象,直接返回controller对象的结果,于是就出现了如果你想异步,对不起不可以,我会先反序列化你的结果,就算为null,我也给你返回去

  2. 同时还有一个问题产生了,因为他要序列化,序列化的时候又没法指定类型,所以序列化方法上定义接口、Object同样也是不行的

  3. 恶心的同时出现了第三个问题,它自己把这个方法try cache了,所以你想用@ExceptionHandler(Exception.class)这个全局异常捕获,对不起不可以,我在前面给你catch了,压根不会到你哪一步

总结:这就是我CSE的一天,各种问题,恶心之极,老实说要不是我的北向网元用的恶心的CSE(当然它们不考虑并发、异步、代码各种if else),我打死都不会用CSE

奉劝各位,赶紧远离这个垃圾微服务框架,各种恶心之极,我想这也许就是它不流行,小众的原因。了解一次的人,压根不想在它上面浪费时间

image.png

回复 举报
分享

分享文章到朋友圈

分享文章到微博

ilonc

发帖: 4粉丝: 0

级别 : 实习版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2018-11-6 20:34:26 沙发 显示全部楼层

那个。。。耐心点。你用了别的会发现还不如这个。有问题反映给小助手解决。问题反应的多才能促使它进步进化

点赞1 回复 举报

liubao68

发帖: 48粉丝: 5

级别 : 注册会员

Rank: 2

发消息 + 关注

发表于2018-11-6 20:43:10 板凳 显示全部楼层

能贴一下你的项目代码吗?多个系统开始集成的时候,由于对于两个系统的运行机制不熟悉,可能会碰到很多问题。可以针对具体问题来看。这里的描述纯粹是吐槽,很难识别出你的问题在哪儿,以及CSE的缺陷在哪儿。 

点赞 回复 举报

liubao68

发帖: 48粉丝: 5

级别 : 注册会员

Rank: 2

发消息 + 关注

发表于2018-11-6 20:55:33 地板 显示全部楼层

我理解你是把spring boot Spring MVC RestController功能和CSE的REST混淆了,它们是两个完全独立的框架,而且CSE本身是纯异步的,业务代码多数情况下不需要自己写异步代码。 但是CSE也是可以使用异步的,参考https://github.com/apache/incubator-servicecomb-java-chassis/blob/master/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/CodeFirstPojo.java 里面的

 @ApiOperation(nickname = "sayHi2", value = "")
public CompletableFuture<String> sayHi2Async(String name)

使用CompletableFuture开发异步逻辑。


spring boot Spring MVC RestController功能和CSE的REST的区别,以及在spring boot 中集成CSE后的变化和原理参考:

https://bbs.huaweicloud.com/blogs/02de5f11cb6e11e8bd5a7ca23e93a891


CSE的更多设计文章和案例:

https://bbs.huaweicloud.com/community/usersnew/id_1505821502554271


点赞1 回复 举报

liubao68

发帖: 48粉丝: 5

级别 : 注册会员

Rank: 2

发消息 + 关注

发表于2018-11-6 20:59:59 5# 显示全部楼层

CSE开发指南:https://docs.servicecomb.io/java-chassis/zh_CN/

https://huaweicse.github.io/cse-java-chassis-doc/


CSE和spring boot集成相关的文章: https://huaweicse.github.io/cse-java-chassis-doc/using-cse-in-spring-boot/using-cse-in-spring-boot.html



点赞 回复 举报

liubao68

发帖: 48粉丝: 5

级别 : 注册会员

Rank: 2

发消息 + 关注

发表于2018-11-6 21:03:38 6# 显示全部楼层

@ExceptionHandler 和 DeferredResult 本身都是spring boot的功能,并不是CSE的功能,所以和CSE集成后,跑了CSE的框架,那么行为不符合你的预期这个是意料之中的事情,你只是基于对于spring boot功能的理解在理解CSE,显然是不够的。

点赞 回复 举报

China_RKD

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-11-6 21:13:32 7# 显示全部楼层

明显是会点 spring boot 做业务就感觉自己 很牛逼的小白, 和我去年没毕业的时候差不多

点赞1 回复 举报

wujimin

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-11-6 21:35:39 8# 显示全部楼层


DeferredResult是spring-web中控制异步的一种手段,因为servlet中一般工作于同步模式,所以需要在业务代码中纯手动控制这些逻辑


在CSE中,即使是在servlet模式,默认也是工作于异步模式,即是说,业务代码并不是在web container的IO线程中执行的,而是在业务线程池中执行,并且支持通过配置指定某个operation独占一个线程池,这实际大大简化了业务逻辑的控制


如果想要用更高效的reactive模式,那么可以像上面liubao说的直接return CompletableFuture,它提供了比DeferredResult强得多的逻辑编排能力


因为有更好的替代品,所以,CSE当前并没有规划去支持DeferredResult

当然,作为补充,CSE可以在启动流程,检测到operation返回类型是DeferredResult时,打印出错日志,并描述处理建议

点赞 回复 举报

zora

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-11-7 10:36:47 9# 显示全部楼层
liubao68 发表于 2018-11-6 20:55 我理解你是把spring boot Spring MVC RestController功能和CSE的REST混淆了,它们是两个完全独立的框架,而 ...
好的,这个回复才是我想要的,我基于你这个在去了解下
点赞 回复 举报

zora

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-11-7 10:40:23 10# 显示全部楼层
China_RKD 发表于 2018-11-6 21:13 明显是会点 spring boot 做业务就感觉自己 很牛逼的小白, 和我去年没毕业的时候差不多
标题写着【吐槽】估计你眼瞎,看不到。然后基于你的回复,我没看到一点建设性意见,连版主可能不知道任何东西回复都是心平气和,奉劝你,私下去学下怎么做人,在做技术。要不就甩点有用的,要不就潜水
点赞 回复 举报

游客

您需要登录后才可以回帖 登录 | 立即注册