рд▓реЗрдЦ рдХрд╛ рдПрдХ рдЕрдиреБрд╡рд╛рдж рдкрд╛рдареНрдпрдХреНрд░рдо "рдбреЗрд╡рд▓рдкрд░ рдСрди рдж рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ" рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред
рд╣реИрд▓реЛ рд╡рд╕рдВрдд рдкреНрд░реЗрдорд┐рдпреЛрдВ! рд╕реНрдкреНрд░рд┐рдВрдЧ рдЯрд┐рдкреНрд╕ рдХреЗ рдЕрдЧрд▓реЗ рд░рд┐рд▓реАрдЬ рдкрд░ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдЖрдЬ рд╣рдо GraalVM рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд▓рд╛рдЧреВ рд╕рдорд░реНрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА GraalVM рдФрд░ рджреЗрд╢реА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреВ рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ рдПрдХ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЯрд┐рдкреНрд╕ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВредрдЖрдЗрдП рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ GraalVM рдХреНрдпрд╛ рд╣реИред GraalVM OpenJDK рдореЗрдВ рдорд╛рдирдХ C1 рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИред рдЖрдк рдХреНрд░рд┐рд╕ рдерд▓рд┐рдВрдЧ, рдЧреНрд░реЗрд╡рд╛рд▓рдо рдХреЗ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдФрд░ рдЯреНрд╡рд┐рдЯрд░ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдмреВрдЯрдлреБрд▓ рдкреЙрдбрдХрд╛рд╕реНрдЯ рдкреЙрдбрдХрд╛рд╕реНрдЯ рдореЗрдВ рдЧреНрд░реЗрд╡рд╛рд▓рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ ред рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд, GraalVM рдЖрдкрдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИредрд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЕрдиреНрдп GraalVM рдШрдЯрдХреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ: рджреЗрд╢реА рдЫрд╡рд┐ рдмрд┐рд▓реНрдбрд░ рдФрд░ SubstrateVMред SubstrateVM рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡реИрд╕реЗ, GraalVM рдХреЗ рдЗрд╕ рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдУрд░реЗрдХрд▓ рд▓реИрдмреНрд╕ рдХреЗ рдУрд▓реЗрдЧ рд╢реЗрд▓реНрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдкреЙрдбрдХрд╛рд╕реНрдЯ рдерд╛ред рдореВрд▓ рдЫрд╡рд┐ рдмрд┐рд▓реНрдбрд░ рд╕рдордЭреМрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде GraalVM рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ (рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рдкреНрд░рддрд┐рдмрд┐рдВрдм, рдкрд░рджреЗ рдХреЗ рдкреАрдЫреЗ рдЖрджрд┐), рддреЛ рдпрд╣ рдЖрдкрдХреЗ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реА рдпрд╛ рдЧреЛрд▓рд╛рдВрдЧ рдореЗрдВ рдПрдХ рдЖрд╡реЗрджрди рдХреА рддрд░рд╣, рдПрдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рджрд░реНрджрдирд╛рдХ рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрд╢реА рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рддреЗрдЬрд╝ рд╣реЛрдЧрд╛ред рдирддреАрдЬрддрди, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд╣реБрдд рдХрдо рд░реИрдо рд▓реЗрдЧрд╛ рдФрд░ рдПрдХ рд╕реЗрдХрдВрдб рд╕реЗ рднреА рдХрдо рд╕рдордп рдореЗрдВ рдЪрд▓реЗрдЧрд╛ред рдПрдХ рд╕реЗрдХрдВрдб рд╕реЗ рднреА рдХрдоред рдмрд╣реБрдд рдЖрдХрд░реНрд╖рдХ, рд╣реИ рдирд╛? рдмреЗрд╢рдХ!рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдкрд░рд┐рдгрд╛рдореА GraalVM рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдирд╣реАрдВ рд╣реИрдВред рд╡реЗ рдирд┐рдпрдорд┐рдд JVM рдкрд░ рднреА рдирд╣реАрдВ рдЪрд▓рддреЗ рд╣реИрдВред GraalVM рдХреЛ Oracle рд▓реИрдмреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЬрд╛рд╡рд╛ рдФрд░ GraalVM рдЯреАрдореЛрдВ рдХреЗ рдмреАрдЪ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рддрдЪреАрдд рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ Java рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ред рдкрд░рд┐рдгрд╛рдореА рдмрд╛рдЗрдирд░реА рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдирд╣реАрдВ рд╣реЛрдЧреАред рдПрдкреНрд▓рд┐рдХреЗрд╢рди JVM рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ SubstrateVM рдирд╛рдордХ рдПрдХ рдЕрдиреНрдп рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИредрдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЯреНрд░реЗрдб-рдСрдл рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░реЗрд╡рд╛рд▓рдо рдореЗрдВ рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдХреНрд▓рд╛рдЙрдб-рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдФрд░ рджрдХреНрд╖рддрд╛ рд╕рд░реНрд╡реЛрдкрд░рд┐ рд╣реИредрдЪрд▓реЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред GraalVM рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдпрд╛ SDKManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд╛рд╡рд╛ рд╡рд┐рддрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ SDKManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред GraalVM рдЬрд╛рд╡рд╛ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬрд╛рд╡рд╛ 8 рдФрд░ 11 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ 14 рдпрд╛ 15 рдпрд╛ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди (рдЬрдм рдЖрдк рдЗрд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ рддреЛ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛) рдЧрд╛рдпрдм рд╣реИредрдЬрд╛рд╡рд╛ 8 рдХреЗ рд▓рд┐рдП GraalVM рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░рди рдХрд░реЗрдВ:sdk install java 20.0.0.r8-grl
рдореИрдВ рдЬрд╛рд╡рд╛ 11 рдХреЗ рдмрдЬрд╛рдп рдЬрд╛рд╡рд╛ 8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛ 11 рдореЗрдВ рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдЕрднреА рддрдХ рд╕рдордЭ рдирд╣реАрдВ рдЖрдИ рд╣реИрдВредрдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдореВрд▓ рдЫрд╡рд┐ рдмрд┐рд▓реНрдбрд░ рдШрдЯрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рднрд╛рдЧреЛ:gu install native-image
gu
- рдпрд╣ GraalVM рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИредрдЕрдВрдд рдореЗрдВ, рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ JAVA_HOME
рдЧреНрд░реЗрд╡рд╛рд▓рдо рдХреЗ рдХреМрди рд╕реЗ рдмрд┐рдВрджреБ рд╣реИрдВред рдореЗрд░реА рдорд╢реАрди рдкрд░ (SDKMAN рдХреЗ рд╕рд╛рде Macintosh) рдореЗрд░рд╛ JAVA_HOME
рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:export JAVA_HOME=$HOME/.sdkman/candidates/java/current/
рдЕрдм рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдм рдХреБрдЫ рд╕реЗрдЯ рд╣реИ, рддреЛ рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдкрд░ рдЬрд╛рдПрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ Initializr рдФрд░ Lombok, R2DBC, PostgreSQL рдФрд░ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рд╡реЗрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВредрдЖрдкрдиреЗ рдПрдХ рд╕рдорд╛рди рдХреЛрдб рдХреЛ рдПрдХ рд▓рд╛рдЦ рдмрд╛рд░ рджреЗрдЦрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рдпрд╛, рд▓реЗрдХрд┐рди рдмрд╕ рдЗрд╕реЗ рдпрд╣рд╛рдВ рджреЗ рджреВрдВредpackage com.example.reactive;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.annotation.Id;
import org.springframework.data.r2dbc.core.DatabaseClient;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping;
import org.springframework.web.reactive.socket.WebSocketHandler;
import org.springframework.web.reactive.socket.WebSocketMessage;
import org.springframework.web.reactive.socket.server.support.WebSocketHandlerAdapter;
import reactor.core.publisher.Flux;
import java.time.Duration;
import java.time.Instant;
import java.util.Collections;
import java.util.stream.Stream;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;
import static org.springframework.web.reactive.function.server.ServerResponse.ok;
@Log4j2
@SpringBootApplication(proxyBeanMethods = false)
public class ReactiveApplication {
@Bean
RouterFunction<ServerResponse> routes(ReservationRepository rr) {
return route()
.GET("/reservations", r -> ok().body(rr.findAll(), Reservation.class))
.build();
}
@Bean
ApplicationRunner runner(DatabaseClient databaseClient, ReservationRepository reservationRepository) {
return args -> {
Flux<Reservation> names = Flux
.just("Andy", "Sebastien")
.map(name -> new Reservation(null, name))
.flatMap(reservationRepository::save);
databaseClient
.execute("create table reservation ( id serial primary key, name varchar(255) not null )")
.fetch()
.rowsUpdated()
.thenMany(names)
.thenMany(reservationRepository.findAll())
.subscribe(log::info);
};
}
public static void main(String[] args) {
SpringApplication.run(ReactiveApplication.class, args);
}
}
interface ReservationRepository extends ReactiveCrudRepository<Reservation, Integer> {
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Reservation {
@Id
private Integer id;
private String name;
}
рдЖрдк рдпрд╣рд╛рдБ рдкреВрд░рд╛ рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ редрдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдПрдХрдорд╛рддреНрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо proxyBeanMethods
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди JDK рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп cglib рдпрд╛ рдЕрдиреНрдп рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред GraalVM рдЧреИрд░-JDK рдкрд░рджреЗ рдХреЗ рдкреАрдЫреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ JDK рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде рднреА, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЯрд┐рдВрдХрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ GraalVM рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рди рд╕рдХреЗред рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛, рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ 5.2 рдХреЗ рд▓рд┐рдП рдирдпрд╛, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ GraalVM рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИредрддреЛ, рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╣рдореЗрдВ рдЧреНрд░реЗрд╡рд╛рд▓рдо рдХреЛ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рд╣реИ рдЬреЛ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд┐ рджреЗрд╢реА рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдпреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм, рдкрд░рджреЗ рдХреЗ рдкреАрдЫреЗ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред GraalVM рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдард╛рдПрдЧрд╛ред рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдП рдЬреЛ рдореЙрдирд┐рдЯрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЦрддреНрдо рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдлрд┐рд░ GraalVM рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдЖрдк GraalVM рдлреАрдЪрд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдзреНрдпрд╛рди рджреЗрдВ рдЕрдиреБрд╡рд╛рджрдХ: "рдлреАрдЪрд░" - рд╢рдмреНрдж GraalVM рджреЗрд╢реА рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рдмрддрд╛рддрд╛ рд╣реИ, рдПрдХ рдХреНрд▓рд╛рд╕ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рджреЗрд╢реА рдмрд╛рдЗрдирд░реА рдмрдирд╛рддрд╛ рд╣реИ ) ред GraalVM рдлреАрдЪрд░ рдЬрд╛рд╡рд╛ рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕реВрдЪрдирд╛ рдХреЛ GraalVM рд╕рдВрдХрд▓рдХ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдлрд╝реАрдЪрд░ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рдЬрдм рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреАрдиреНрд╕ рд╕рдореАрдк рд╣реЛрддреЗ рд╣реИрдВред рд╡рд╣ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛рдПрдВ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред рд╡рд╣ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рд╡рд╕рдВрдд рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рдЧреНрд░реЗрд╡рд╛рд▓рдо рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп (рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░рд┐рд▓реАрдЬ!)рдЖрдкрдХреЛ рдмрд┐рд▓реНрдб рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд╣реИpom.xml
ред<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.M4</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>reactive</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<start-class>
com.example.reactive.ReactiveApplication
</start-class>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-graal-native</artifactId>
<version>0.6.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-h2</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<finalName>
${project.artifactId}
</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
<profiles>
<profile>
<id>graal</id>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.nativeimage</groupId>
<artifactId>native-image-maven-plugin</artifactId>
<version>20.0.0</version>
<configuration>
<buildArgs>
-Dspring.graal.mode=initialization-only -Dspring.graal.dump-config=/tmp/computed-reflect-config.json -Dspring.graal.verbose=true -Dspring.graal.skip-logback=true --initialize-at-run-time=org.springframework.data.r2dbc.connectionfactory.ConnectionFactoryUtils --initialize-at-build-time=io.r2dbc.spi.IsolationLevel,io.r2dbc.spi --initialize-at-build-time=io.r2dbc.spi.ConstantPool,io.r2dbc.spi.Assert,io.r2dbc.spi.ValidationDepth --initialize-at-build-time=org.springframework.data.r2dbc.connectionfactory -H:+TraceClassInitialization --no-fallback --allow-incomplete-classpath --report-unsupported-elements-at-runtime -H:+ReportExceptionStackTraces --no-server --initialize-at-build-time=org.reactivestreams.Publisher --initialize-at-build-time=com.example.reactive.ReservationRepository --initialize-at-run-time=io.netty.channel.unix.Socket --initialize-at-run-time=io.netty.channel.unix.IovArray --initialize-at-run-time=io.netty.channel.epoll.EpollEventLoop --initialize-at-run-time=io.netty.channel.unix.Errors
</buildArgs>
</configuration>
<executions>
<execution>
<goals>
<goal>native-image</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
рдпрд╣рд╛рдВ рд╣рдо рдкреНрд▓рдЧрдЗрди рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ native-image-maven-plugin
ред рд╡рд╣ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рдЙрд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред buildArgs
рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЗ рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ ред (рдореБрдЭреЗ рдЗрди рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдВрдбреА рдХреНрд▓реЗрдореЗрдВрдЯ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдЧреНрд░реЗрд╡рд▓рдо рдлрд╝реАрдЪрд░ рдореЗрдВрдЯреЗрдирд░ рдХреЗ рдкреНрд░рддрд┐ рдЕрдкрдиреА рдЧрд╣рд░реА рдХреГрддрдЬреНрдЮрддрд╛ рд╡реНрдпрдХреНрдд рдХрд░рдиреА рд╣реИ!)<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-graal-native</artifactId>
<version>0.6.0.RELEASE</version>
</dependency>
рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ GraalVM рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдкрд╛рд╕ рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рддрд░реАрдХреЗ рд╣реЛрдВ: java agent, GraalVM Feature, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкреИрд░рд╛рдореАрдЯрд░ред рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде GraalVM рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рд╕рдВрдХрд▓рд┐рдд рджреЗрд╢реА рдмрд╛рдЗрдирд░реА рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рд▓рдВрдмреЗ рд╕рдордп рдореЗрдВ, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рд╡рд╕рдВрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВред рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЧреНрд░реЗрд╡рд▓рдо рд╕реБрд╡рд┐рдзрд╛ рдЖрдкрдХреЛ рд╡рд╣ рд╕рдм рдХреБрдЫ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдм рдХреБрдЫ рд╕реЗрдЯ рд╣реИ, рддреЛ рдЖрдЗрдП рдПрдХ рд╕рд╛рде рдЖрд╡реЗрджрди рдХрд░реЗрдВ:- рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ
- рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдЖрдкрдХреЛ рд╕рднреА рд╕рдВрднрд╡ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реИрд╕реЗ, CI рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рд╣реИ! рд╣рд░ рдХреЛрдИ рд▓рдЧрд╛рддрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрдм, GraalVM рдХреЗ рд╕рд╛рде, рдЖрдк рджреЛрдиреЛрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
- рдлрд┐рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдВ, рдЗрд╕ рдмрд╛рд░ рд╕рдХреНрд░рд┐рдп рдЧреНрд░реЗрдл рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде, рдореВрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
mvn -DskipTests=true clean package
export MI=src/main/resources/META-INF
mkdir -p $MI
java -agentlib:native-image-agent=config-output-dir=${MI}/native-image -jar target/reactive.jar
## it's at this point that you need to exercise the application: http://localhost:8080/reservations
## then hit CTRL + C to stop the running application.
tree $MI
mvn -Pgraal clean package
рдпрджрд┐ рд╕рдм рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЪрд▓рд╛ рдЧрдпрд╛, рддреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ target
рдЖрдкрдХреЛ рдПрдХ рд╕рдВрдХрд▓рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдЪрд▓рд╛рдУред./target/com.example.reactive.reactiveapplication
рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред2020-04-15 23:25:08.826 INFO 7692 --- [ main] c.example.reactive.ReactiveApplication : Started ReactiveApplication in 0.099 seconds (JVM running for 0.103)
рдмреБрд░рд╛ рдирд╣реАрдВ? GraalVM рдореВрд▓ рдЫрд╡рд┐ рдмрд┐рд▓реНрдбрд░ рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрд╛рдЙрдВрдб рдпрд╛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЬреИрд╕реЗ рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЖрд╡реЗрджрди рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдиреНрдпреВрдирддрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВредрд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдЖрдкрдХреЛ рд╕реБрдирдХрд░ рдЦреБрд╢ рд╣реЛрдВрдЧреЗред рдХреНрдпрд╛ рдпрд╣ рддрдХрдиреАрдХ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ? рдкреНрд░рд╢рди? рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ? рдЯреНрд╡рд┐рдЯрд░ (@springcentral) ред
рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ