/* Ċ Ġ* ĠTencent Ġis Ġplease d Ġto Ġsupport Ġthe Ġopen Ġsource Ġcommunity Ġby Ġmaking ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġavailable . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠTH L ĠA 2 9 ĠLimited , Ġa ĠTencent Ġcompany . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġis Ġlicensed Ġunder Ġthe ĠMIT Ġlicense . Ċ Ġ* Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠMIT ĠLicense Ġis Ġincluded Ġin Ġthis Ġfile . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTerms Ġof Ġthe ĠMIT ĠLicense : Ċ Ġ* Ġ------------------------------------------------ --- Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ċ Ġ* Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ċ Ġ* Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe Ċ Ġ* ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT Ċ Ġ* ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN Ċ Ġ* ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , Ċ Ġ* ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE Ċ Ġ* ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . tencent . devops . common . client Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . google . common . cache . Cache Builder Ċ import Ġcom . google . common . cache . Cache Loader Ċ import Ġcom . google . common . cache . Loading Cache Ċ import Ġcom . tencent . devops . common . api . annotation . Service Interface Ċ import Ġcom . tencent . devops . common . api . exception . ClientException Ċ import Ġcom . tencent . devops . common . client . ms . Micro Service Target Ċ import Ġcom . tencent . devops . common . service . utils . Spring Context Util Ċ import Ġfe ign . Fe ign Ċ import Ġfe ign . Request Interceptor Ċ import Ġfe ign . jackson . Jack son Decoder Ċ import Ġfe ign . jackson . Jack son Encoder Ċ import Ġfe ign . jax rs . J AX RS Contract Ċ import Ġfe ign . okhttp . Ok HttpClient Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . beans . factory . annotation . Value Ċ import Ġorg . springframework . cloud . consul . discovery . Cons ul Discovery Client Ċ import Ġorg . springframework . context . annotation . Dep ends On Ċ import Ġorg . springframework . core . annotation . Annotation Utils Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* Ċ Ġ* ĠPower ed ĠBy ĠTencent Ċ Ġ*/ Ċ @ Component Ċ @ Dep ends On (" spring Context Util ") Ċ class ĠClient Ġ@ Autowired Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġcons ul Client : ĠCons ul Discovery Client ?, ĊĠĠĠ Ġprivate Ġval Ġclient Error Decoder : ĠClient Error Decoder , ĊĠĠĠ ĠobjectMapper : ĠObjectMapper Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Client :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġread Write Timeout Seconds Ġ= Ġ 1 5 L ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġconnect Timeout Seconds Ġ= Ġ 5 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbean Caches : ĠLoading Cache < K Class <* >, Ġ*> Ġ= ĠCache Builder . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. maximum Size ( 1 0 0 0 ). build ( object Ġ: ĠCache Loader < K Class <* >, ĠAny >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload ( p 0 : ĠK Class < *> ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Impl ( p 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġprivate Ġval Ġinterfaces Ġ= ĠConcurrent HashMap < K Class <* >, ĠString >() ĊĠĠĠ Ġprivate Ġval Ġok HttpClient Ġ= Ġokhttp 3 . Ok HttpClient . Builder () ĊĠĠĠĠĠĠĠ Ġ. connect Timeout ( connect Timeout Seconds , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ. read Timeout ( read Write Timeout Seconds , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ. write Timeout ( read Write Timeout Seconds , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġval Ġfe ign Client Ġ= ĠOk HttpClient ( ok HttpClient ) ĊĠĠĠ Ġprivate Ġval Ġjax Rs Contract Ġ= ĠJ AX RS Contract () ĊĠĠĠ Ġprivate Ġval Ġj ack son Decoder Ġ= ĠJack son Decoder ( object Mapper ) ĊĠĠĠ Ġprivate Ġval Ġj ack son Encoder Ġ= ĠJack son Encoder ( object Mapper ) ĊĊĠĠĠ Ġ@ Value ("\ ${ spring . cloud . consul . discovery . tags :# { null }} ") ĊĠĠĠ Ġprivate Ġval Ġtag : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġget ( cl z : ĠK Class < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget ( cl z , Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġget ( cl z : ĠK Class < T >, Ġsuffix : ĠString ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbean Caches . get ( cl z ) Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Impl ( cl z ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġget Impl ( cl z : ĠK Class < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSpring Context Util . getBean ( cl z . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ cl z ]| try Ġto Ġproxy Ġby Ġfe ign : Ġ${ ignored . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequest Interceptor Ġ= ĠSpring Context Util . getBean ( Request Interceptor :: class . java ) Ġ// Ġèİ·åıĸ ä¸º fe ign å®ļä¹ī çļĦ æĭ ¦ æĪª åĻ¨ ĊĠĠĠĠĠĠĠ Ġreturn ĠFe ign . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. client ( fe ign Client ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. error Decoder ( client Error Decoder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. encoder ( jackson Encoder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. decoder ( jackson Decoder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contract ( jax Rs Contract ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. request Interceptor ( request Interceptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. target ( Micro Service Target ( find ServiceName ( cl z ), Ġcl z . java , Ġcons ul Client !! , Ġtag )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Service Url ( cl z : ĠK Class < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMicro Service Target ( find ServiceName ( cl z ), Ġcl z . java , Ġcons ul Client !! , Ġtag ). url () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind ServiceName ( cl z : ĠK Class < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinterfaces . get Or Put ( cl z ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Interface Ġ= ĠAnnotation Utils . find Annotation ( cl z . java , ĠService Interface :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( service Interface Ġ!= Ġnull Ġ&& Ġservice Interface . value . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Interface . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġcl z . qualified Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregex Ġ= ĠRegex (""" com . tencent . devops . ([ a - z ]+ ). api . ([ a - zA - Z ]+) """) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatches Ġ= Ġregex . find ( packageName ) Ġ?: Ġthrow ĠClient Exception (" æĹłæ³ķ æł¹æį® æİ¥åı£ \" $ packageName \" åĪĨæŀĲ æīĢ å±ŀ çļĦ æľįåĬ¡ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatches . group Values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }