《用 Kotlin 让 Java 项目进入微服务的时代.pdf》由会员分享,可在线阅读,更多相关《用 Kotlin 让 Java 项目进入微服务的时代.pdf(51页珍藏版)》请在三个皮匠报告上搜索。
1、Kotlinkotlin|Developed by JetBrains 用 Kotlin 讓 Java 踏入微服務的時代Brandy ChangAbout Me2023 -JCConf:Arrow KT TW Kotlin 年會 -ITHome 鐵人賽 -KT Meetup#192022 -ITHome 鐵人賽2021 -Kotlin 讀書會JCConf:Reactive with QuarkusServer Side Kotlin舊 Java 專案的困境 舊程式碼有其商業價值但沒有足夠測項不預期的 Null Pointer Exception不一致且重覆的設計模式實現新的語法簡潔,但升級 J
2、ava 是風險新的語言有一定的學習曲線1.用 Kotlin 幫 Java專案加上測試100%與 Java 互操作,更簡潔Test Case Nameclass TagClientTest Test fun basic tag list()Test fun empty tag list()JSON,XML可讀性用 Kotlin 幫 Java 專案加上測試 更人性化的語法 提高可維護性Null Pointer Exception 面對他 接受他 處理他 放下他val supportType=payment?.type?.name?.toLowerCase()val supportType=paym
3、ent?.type?.name?.toLowerCase()https:/ 內建 Effective Javaequals.A Java TrapAvoid Java Common TrapNo more equalssplit 表明要用 regex 還是要分隔符No More Common-Lang,Common-Lang3Path,FileName,URLs.object Mapper val mapper:ObjectMapper=ObjectMapper().fun Any.toJson():String=mapper.writeValueAsString(this)inline fu
4、n String.fromJson():T=mapper.readValue(this,T:class.java)data class User(val name:String,val family:String)val jsonString=mapOf(name to Brandy,family to Chang).toJson()val user=jsonString.fromJson()用 Extension Function 取代 UtilsSingleton PatternDelegation Pattern更/需要為每個委派的方法提供明確的轉發新的語法簡潔,但升級 Java 是風險
5、Kotlin 支援 Java 8 以上的專案新的語言有一定的學習曲線IDE 幫助及相容漸近的轉換自動把 Java Code 轉成 Kotlin手把手指導更好的實現Google Server Side Kotlin 導入調查結果老瓶新裝、漸進導入約 Java 的 -程式碼讓開發者使用新的語法可維護性提高生產力提高微服務有很多 Service 要打UserAggregateUser InfoUser AvatarPermissionServicepublic class UserService Autowired private RestTemplate restTemplate;public U
6、serAggregate getUserData(String userId)UserInfo userInfo=restTemplate.getForObject(urlA+userId,UserInfo.class);Avatar avatar=restTemplate.getForObject(urlB+userId,Avatar.class);Permission permission=restTemplate.getForObject(urlC+userId,Permission.class);UserAggregate userAggregate=new UserAggregate
7、(userInfo,avatar,permission);/將將 userAggregate 物件緩存到物件緩存到 Redis cacheUserData(userId,userAggregate);return userAggregate;Servicepublic class UserService Autowired private AsyncRestTemplate asyncRestTemplate;public CompletableFuture getUserData(String userId)CompletableFuture userInfoFuture=Completab
8、leFuture.supplyAsync()-asyncRestTemplate.getForObject(urlA+userId,UserInfo.class);CompletableFuture avatarFuture=CompletableFuture.supplyAsync()-asyncRestTemplate.getForObject(urlB+userId,UserAvatar.class);CompletableFuture permissionFuture=CompletableFuture.supplyAsync()-asyncRestTemplate.getForObj
9、ect(UrlC+userId,UserPermission.class);return CompletableFuture.allOf(userInfoFuture,avatarFuture,permissionFuture).thenApply(v-new UserAggregate(userInfoFuture.join(),avatarFuture.join(),permissionFuture.join();同時打出去Serviceclass UserService(private val restTemplate:RestTemplate)suspend fun getUserDa
10、ta(userId:String):UserAggregate val userInfo=async getUserInfo(userId)val avatar=async getUserAvatar(userId)val permission=async getUserPermission(userId)return UserAggregate(userInfo.await(),avatar.await(),permission.await()試試 Kotlin Async,Awaitimport arrow.fx.coroutines.parZipServiceclass UserServ
11、ice(private val restTemplate:RestTemplate)suspend fun getUserData(userId:String):UserAggregate=parZip(getUserInfo(userId),getAvatar(userId),getPermission(userId),)userInfo,avatar,permission-UserAggregate(userInfo,avatar,permission)Arrow KT-parZipArrow Resilience RepeatRetryRestTemplate,JDBC are Bloc
12、king I/OSpring Boot WebfluxQuarkusSpring Boot WebfluxQuarkusGETPath(/name)public Uni getOne(String name)return Uni.createFrom().item(new Fruit(name);GetMapping(/name)public Mono getOne(PathVariable(name)String name)return Mono.just(new Fruit(name);Suspend function Non-blocking I/OSpring Boot Webflux
13、QuarkusGETPath(/name)suspend fun getOne(name:String):Fruit=Fruit(name)GetMapping(/name)suspend fun getOne(PathVariable(name)name:String):Fruit return Fruit(name)Spring Boot WebfluxQuarkusGETPath(/name)suspend fun getOne(name:String):Fruit=fruitRepository.findByName(name).awaitSuspending()GetMapping(
14、/name)suspend fun getOne(PathVariable(name)name:String):Fruit return fruitRepository.findByName(name).awaitFirstOrNull()AWS SDK for Kotlinfun User.toDTO():UserDTO =UserDTO(id=id,userId=userId,name=name,phone=phone,email=email)fun UserDTO.toUser():User requireNotNull(userId)requireNotNull(name)val user=User()user.id=id user.userId=userId user.name=name user.phone=phone user.email=email return userDDD with Kotlin kotlin|Developed by JetBrains 新的一年用 Kotlin 幫 Java 專案除舊佈新 Thanks!Have a nice Kotlinkotlin|Developed by JetBrains