有用 kotlin 开发后端的老哥吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mygreens
V2EX    Java

有用 kotlin 开发后端的老哥吗

  •  1
     
  •   mygreens 2021-03-31 10:54:29 +08:00 8545 次点击
    这是一个创建于 1653 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前只敢工具类用 kotlin,不知道 kotlin 和 spring 会不会有兼容上的坑,兼容 spring 各种注解么。 目前发现比较难受的是,数据类(DO, DTO)必须全部用可空,不然 fastjson 反序列化会有问题。 有生产环境用 kotlin 开发的老哥吗,目前有什么问题?

    第 1 条附言    2021-03-31 15:05:32 +08:00
    感谢各位大佬,这么看还是有点坑的。个人意见,相比安卓,后端上 kotlin 收益真的不大。
    spring 本身已经包装了大量的设计模式,后端对 npe 的容忍度也比较高,kotlin 基本都是当语法糖在用,所以目前还是不踩坑了。
    55 条回复    2021-04-01 13:00:44 +08:00
    rust
        1
    rust  
       2021-03-31 10:57:42 +08:00
    公司一个小项目用了 Ktor,开发确实爽,目前还没有发现什么问题.
    xuanbg
        2
    xuanbg  
       2021-03-31 10:59:57 +08:00
    自从 get 了终极秘技 cv 大法,Java 语言嗦繁琐的弱点也就不存在了,反倒是隐隐成了优势。所以 kotlin 什么的也就没有吸引力了
    zoharSoul
        3
    zoharSoul  
       2021-03-31 11:02:15 +08:00
    有, json 序列化建议用 gson, 和 kt 配合的资料比较多
    yazinnnn
        4
    yazinnnn  
       2021-03-31 11:02:51 +08:00
    json 现在在用 moshi

    用 kotlin 可以尝试一下其他东西,比如 quarkus vertx 啥的
    micean
        5
    micean  
       2021-03-31 11:10:14 +08:00
    兼容旧系统的话,带问号是必要的。
    所有的 pojo 用 IDEA 自带的.java 转.kt 就行
    kotlin 目前最主要的问题在于 debug 反编译依赖 source,异常打印 stack 的行号不那么准
    zerofancy
        6
    zerofancy  
       2021-03-31 11:14:56 +08:00
    毕设项目都是 Kotlin,目前遇到过两个奇怪的问题。

    1. 同时有 Java 和 Kotlin 的 RestController,Java 的找不到
    2. 类型推断好像有点问题

    有如下代码:

    ```kt
    val gridFsFile: GridFSFile? = gridFsTemplate.findOne(Query(Criteria.where("_id").`is`(id)))
    ```

    idea 提示我

    ```
    'gridFsFile' is always non-null type
    ```

    很明显 gridFsTemplate 是可空的,甚至在接口 GridFsOperations 中已经标注了 @Nullable
    尝试加入判空逻辑:

    ```
    if (gridFsFile == null) {
    // do something
    }
    ```

    idea 提示:

    ```
    No method 'equals(Any?): Boolean' available
    ```

    猜想是不是 Kotlin 调用 java 都会有这样问题,结果未能在 demo 项目中复现。
    目前用这样的方式判断,原理不明:

    ```kt
    if (gridFsFile === null) {
    // do something
    }
    ```
    anke1938
        7
    anke1938  
       2021-03-31 11:15:39 +08:00
    两年前小公司用的纯 kotlin 后端 开发的 web 后台 / 小程序后台 用起来还是很爽的 没啥特别的坑 或者没怎么遇到
    hantsy
        8
    hantsy  
       2021-03-31 11:17:57 +08:00   1
    你多少年没用 Spring 了?

    Spring 5.0(2017 年) 开始, 除了 Reactive,Kotlin 就是最重要的特性之一,Spring 对 Kotlin 进行深度集成(远超过之差的 Groovy 语言支持)。针对很多 Kotlin 特性很多优化,例如,不必声明 open, data class 可以用于 JPA Entity 等。

    Kotlin DSL 声明 beans 定义,安全 (参考 Spring 中 BeanDefinitionDSL )等。

    val beans = beans {
    bean {
    CommandLineRunner {
    println("start data initialization...")
    val posts = ref<PostRepository>()
    posts.deleteAll()
    .thenMany<Post>(
    posts.saveAll(
    arrayListOf(
    Post(null, "my first post", "content of my first post"),
    Post(null, "my second post", "content of my second post")
    )
    )
    )
    .log()
    .subscribe(
    { println(it) },
    { println(it) },
    { println("data initialization done...") }
    )
    }
    }

    https://github.com/hantsy/spring-kotlin-dsl-sample/blob/master/reactive/src/main/kotlin/com/example/demo/DemoApplication.kt

    现在 Spring 还有一个 Spring Kofu 孵化项目(提供完全 Kotlin DSL )。

    val app = reactiveWebApplication {
    configurationProperties<SampleProperties>(prefix = "sample")
    enable(dataConfig)
    enable(webConfig)

    listener<ApplicationReadyEvent> {
    println("start data initialization...")
    ref<PostRepository>().init()
    }
    profile("foo") {
    beans { bean<Bar>() }
    }
    }

    https://github.com/hantsy/spring-kotlin-dsl-sample/blob/master/kofu-reactive-mongo/src/main/kotlin/com/example/demo/DemoApplication.kt
    optional
        9
    optional  
       2021-03-31 11:19:03 +08:00 via iPhone   2
    你不觉得 fastJson 比较坑。。。
    wellsc
        10
    wellsc  
       2021-03-31 11:20:10 +08:00
    借楼问一个 kotlin 的 protobuf grpc 的库
    hantsy
        11
    hantsy  
       2021-03-31 11:20:40 +08:00
    @zerofancy Spring Data 一般中 Template, repository 都有写 Kotlin 扩展。估计那 GridFsTemplate 没有处理。
        12
    hantsy  
       2021-03-31 11:22:16 +08:00
    @optional 在 Spring 3 。x 就开始提供了内容协商机制,为什么要用 FastJSON 这种东西???实在不明白。
    ChangQin
        13
    ChangQin  
       2021-03-31 12:00:36 +08:00 via iPhone
    @rust ktor+1
    zoharSoul
        14
    zoharSoul  
       2021-03-31 12:07:05 +08:00
    @zerofancy gridFsTemplate.findOne 返回的是 nullable 的吗?
    loshine1992
        15
    loshine1992  
       2021-03-31 12:10:04 +08:00
    用 moshi 或 kotlin-serialization
    106npo
        16
    106npo  
       2021-03-31 12:14:02 +08:00 via Android
    建议换掉 fastjson
    另外也可以混用 java 至少我这 data class 都是用 java 的,kotlin 的 data class 非常不好用
    Kasumi20
        17
    Kasumi20  
       2021-03-31 12:28:09 +08:00
    没有发现 Kotlin 不支持 IoC 和 AOP,所以 Kotlin 和 Spring 百分百兼容。
    至于什么反序列化的如果是先构造一个空对象,当然会有问题。
    boris93
        18
    boris93  
       2021-03-31 12:35:46 +08:00 via iPhone
    正在用 Kotlin+Spring Boot+Webflux
    json 序列化反序列化用的 jackson
    目前没啥问题

    话说干嘛要用 fastjson 呢?框架自己序列化反序列化用自带的 jackson 就行了啊,也就稍微配置一下的事
    偶尔用 gson 也能搞定
    youngxhui
        19
    youngxhui  
       2021-03-31 12:43:38 +08:00 via Android
    @wellsc grpc 官方有的
    wellsc
        20
    wellsc  
       2021-03-31 13:00:48 +08:00 via iPhone
    @youngxhui protobuf 我没找到好用的
    bthulu
        21
    bthulu  
       2021-03-31 13:53:24 +08:00   1
    fastjson 比 jackson 好用一万倍啊, 为什么要用 jackson, 到处 try catch 很爽吗?
    Evrins
        22
    Evrins  
       2021-03-31 14:15:21 +08:00
    我试过 kotlin 和 java 一起混用,编译起来太慢了,我又转回去了
    GuoDuanLZ
        23
    GuoDuanLZ  
       2021-03-31 14:18:19 +08:00
    Xbluer
        24
    Xbluer  
       2021-03-31 14:52:25 +08:00
    @bthulu fastjson 动不动就爆漏洞啊
    mygreens
        25
    mygreens  
    OP
       2021-03-31 14:57:29 +08:00
    @Xbluer 个人认为 fastjson 还是同类最顺手了。漏洞不用 AutoType 就好了。
    unco020511
        26
    unco020511  
       2021-03-31 15:17:20 +08:00
    我觉得后端用 kotlin 可能收益不高
    ymmud
        27
    ymmud  
       2021-03-31 15:50:11 +08:00
    干脆上 scala 得啦,抛弃 spring
    bthulu
        28
    bthulu  
       2021-03-31 15:50:33 +08:00
    @Xbluer jackson 不一样爆么, fastjson 用的人多, 爆的自然就多, 这不很正常么.
    再说这么多漏洞爆来爆去, 大多不都是 autotype 引起的, jackson 不也因为 autotype 爆过好几次漏洞.
    关掉 autotype 不就好了.
    wellsc
        29
    wellsc  
       2021-03-31 16:33:31 +08:00 via iPhone
    @GuoDuanLZ 25 个星星的还是算了吧
    boris93
        30
    boris93  
       2021-03-31 17:27:42 +08:00 via iPhone
    @bthulu #21 我们是让框架自己处理序列化和反序列化,通常情况自己不手动序列化 json
    偶尔手动序列化就用 gson,就算用 jackson 也就随手 try catch 一下,没啥费劲的
    主要是,不用担心跟 kotlin 的兼容问题,就这一点就比别的强两万倍
    tabris17
        31
    tabris17  
       2021-03-31 17:43:31 +08:00
    kotlin 协程搭配 vertx,很香
    wupher
        32
    wupher  
       2021-03-31 17:44:52 +08:00
    有,自己负责的主力项目,后端业已全迁移至 Kotlin 。

    Pros: the language, spring/spring boot, Func Programming, even coroutines & kotlin ReactiveX 这些都用过,没碰到过什么大坑

    Cons: Kotlin 的强类型模式,在某些时候会不爽,比如对外接口。Data object 认为 String 就是 String , Int 就是 Int 。但是有可能对端实现变更或者多接一个调用方,应该传 "1" 的变成了 1,kotlin (看具体实现方式)就有可能报错。这种时候,最怀念 Groovy 或者 Ruby,你认为它是 Int 它就是 int,认为它是 string 它就是 string.

    BTW:json 可以考虑使用 moshi 或者 jackson json
    mmdsun
        33
    mmdsun  
       2021-03-31 18:48:14 +08:00 via Android
    @Kasumi20 我有一个项目是 Java 和 kotlin 混用的。Java 写的 aop 可以切到 kotlin 的代码。
    sagaxu
        34
    sagaxu  
       2021-03-31 18:55:39 +08:00 via Android   1
    fastjson 你都用了,还有什么不敢用的?
    iseki
        35
    iseki  
       2021-03-31 18:57:32 +08:00 via Android
    你不觉得坑掉的是 fastjson 吗,fastjson 啥情况我不知道,Jackson 有 Kotlin 模块。
    Jackson 兼容性,可配置性都远胜于 fastjson,至于有人嫌弃 API 不好看…都用 Kotlin 了就不会自己包一下吗
    iseki
        36
    iseki  
       2021-03-31 19:00:10 +08:00 via Android
    目前 springboot+纯 Kotlin,也不存在必须可空的问题,Jackson 和 spring 都能自动处理好。
    唯一一点问题是项目中其他人用 Java 是,他们不喜欢 Kotlin data class…不可变+构造函数传参他们嫌麻烦
    charlie21
        37
    charlie21  
       2021-03-31 21:41:02 +08:00
    若你是招聘方:Kotlin 好 Kotlin 棒 Kotlin 是未来趋势 赶快给我招几个一起用 Kotlin 的小伙伴来 我们一起飞
    若你是应聘方: 岗位数 Java : Kotlin = 100 : 1 Kotlin 你学去吧 哈哈 赶紧降低一下 Java 的竞争压力
    charlie21
        38
    charlie21  
       2021-03-31 21:41:49 +08:00
    这两方逻辑都是完整闭环的,看你站在哪一边而已
    viakiba
        39
    viakiba  
       2021-03-31 23:33:21 +08:00 via iPhone
    要是能用到 kotlin 的协程还是不错的 要是用不到其实没必要用
    viakiba
        40
    viakiba  
       2021-03-31 23:34:57 +08:00 via iPhone
    @tabris17 再加上 ignite
    peihuan
        41
    peihuan  
       2021-03-31 23:37:35 +08:00
    div class="reply_content">基本无大坑。
    kotlin + vertx 爽到爆。
    新开的 spring 项目也都用 kotlin 写,代码行数能减少很多
    hantsy
        42
    hantsy  
       2021-03-31 23:50:00 +08:00
    2021 年还有人手动序列化。你们完全不用框架吗?

    如果你用的是 Spring, 写的是 Web API 之类,还在用手动序列化,你的代码估计我看到要吐血。

    手动序列化工具太多了。我觉得 JSONB 标准最简单。https://github.com/hantsy/cargotracker-regapp/blob/master/src/main/java/org/eclipse/cargotrakcer/regapp/client/internal/HttpClientHandlingReportService.java#L64

    只有在一些没有框架支持的情况我才会用到手动序列化,比如上面的 Client 。
    hantsy
        43
    hantsy  
       2021-03-31 23:54:53 +08:00
    @peihuan

    vertx 感觉没那么爽啊,

    https://github.com/hantsy/vertx-sandbox/blob/master/kotlin-co/src/main/kotlin/com/example/demo/MainVerticle.kt#L103

    这种,没有内部 API 支持吗?这个我实在不清楚。

    关于 Jackson 的配置,没有一些接口(方法)暴露出来 , 太不灵活了,我提过 issue,官方回复就是这样的。

    https://github.com/hantsy/vertx-sandbox/blob/master/kotlin-co/src/main/kotlin/com/example/demo/MainVerticle.kt#L42
    hantsy
        44
    hantsy  
       2021-03-31 23:57:38 +08:00
    @peihuan 上面 L103 行, 这种有什么好方法把它解决掉。
    iseki
        45
    iseki  
       2021-04-01 00:21:08 +08:00 via Android
    @charlie21 头一次听说学 kt 不学 Java 的
    hantsy
        46
    hantsy  
       2021-04-01 00:37:11 +08:00
    @iseki Kotlin Immutable 类使用上这个是习惯问题。

    写过 Kotlin 后,现在回到 Java, 我也比较喜欢 Constructor Injection ( Spring 4 支持自动注入依赖,如果类只有唯一 历非空参数 constructor ),结合 Lombok,直接声明成 final,使用 @RequiredArg 。。。,省掉了 constructor 。
    另外 Dto (这个模式本来就是用于不可变的场景),也开始习惯了 of factory 方法构建,变成意义上的不可变。
    dai875939260
        47
    dai875939260  
       2021-04-01 08:38:52 +08:00
    @hantsy #44 内部应该是没有,可以写 extension
    bthulu
        48
    bthulu  
       2021-04-01 08:48:18 +08:00
    @boris93 你这轻量级使用, 或者纯框架用用, 那用啥都行, 反正也没几行代码. 等你碰到需要大量手写序列化反序列化的时候, 你就知道使用 fastjson 的工作量少的不是一星半点了. jackson 各种配置各种 try catch, fastjson 开箱即用.
    lixm
        49
    lixm  
       2021-04-01 09:14:59 +08:00
    没发现 jackson 的语法有什么缺陷的, 和 kotlin 配合也很好,kotlin 作为后端开发也是非常爽的,但是没见过会 kotlin 而不会 java 的
    Narcissu5
        50
    Narcissu5  
       2021-04-01 09:41:42 +08:00
    我感觉很多人喜欢 fastjson 只是因为它提供了静态方法,然而静态方法是反 OOP 的。。。

    而且因为 fastjson 的漏洞我们几个月之类升级了三次版本,每次几十个微服务都需要升级简直不要太酸爽。可能很多创业公司不会太在意安全问题,等招牌大了分分钟被搞事情。
    sdushn
        51
    sdushn  
       2021-04-01 09:56:36 +08:00
    @xuanbg cv 工程师
    ZeroDu
        52
    ZeroDu  
       2021-04-01 10:04:31 +08:00
    fastjson 序列化 map,key 如果为数字,结果就直接就是数字。{1:"v"}
    jerray
        53
    jerray  
       2021-04-01 10:44:01 +08:00
    别说 kotlin 了,之前遇到个公司的构建系统只支持 maven 。我问能不能支持下 gradle,人家说不支持客户端编译。
    hantsy
        54
    hantsy  
       2021-04-01 11:50:03 +08:00
    @dai875939260 之前尝试过写 Extension,一般 Extension 都是纯 Fun 就行了。Coroutine 这个比较诡异,需要 CoroutineScope 支持才行。
    boris93
        55
    boris93  
       2021-04-01 13:00:44 +08:00 via iPhone
    @bthulu #48 轻量级使用……我不知道你是怎么得出这个结论的……
    我司一堆服务每天处理来自全球的不计其数的账号业务,和日均四五万个订单,还有旁路的欺诈检测等等,都没用 fastjson,也没啥需要手写序列化的需求
    其实我倒是很好奇,什么需求需要手动序列化?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1165 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 23:35 PVG 07:35 LAX 16:35 JFK 19:35
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86