Na produkciji projekat naiđe na problem koji se ne može debugirati, a offline se ne može reprodukovati, da li treba samo dodati logove i ponovo objaviti? Sa ovom alatkom, možeš debugati na liniji i realizovati hot fix, preporučujem svima!
Arthas je Alibaba open-source Java dijagnostički alat, voljen od developera. Koristi komandnu linu interaktivnog načina, istovremeno pruža bogate Tab auto-dopunjene funkcije, dodatno olakšava locating i dijagnostiku problema.
Da bismo vratili stvarno liniju okruženje, koristićemo Arthas da dijagnostifujemo Java program u Docker kontejneru.
Koristi arthas-boot, download odgovarajući jar paket, download adresa: https://alibaba.github.io/arthas/arthas-boot.jar
Pokreni našu Spring Boot aplikaciju mall-tiny-arthas korišćenjem Docker kontejner načina, pakiranje i running script su u projektu src\main\docker direktorijumu;
Kopiraj arthas-boot.jar u našu aplikaciju kontejner \ direktorijum;
Ovo je možda koristan open source projekat za te, mall projekat je set sistema (SpringBoot + Vue + uni-app) realizovan ecommerce sistema (Github60K zvezdica), koristi Docker kontejnerizaciju deployment. Uključuje foreground mall projekat i background management sistem, može podržati complete order proces! Pokriva proizvod, order, korpu, dozvolu, kupon, član, plaćanje itd. funkcije, funkcija je vrlo moćna!
Nakon uspešnog pokretanja, izaberi sekvenčni broj trenutnog Java programa koji treba dijagnostifovati, ovde je 1, možeš početi dijagnostiku;
Tokom perioda će downloadati neke potrebne fajlove, nakon završetka konzola printa informacije kao sledi, do sada Arthas instalacija i pokretanje su završeni.
Prvo ćemo predstaviti neke Arthas često korišćene komande, kombinovaćemo stvarnu aplikaciju da objasnimo, povedite sve da razumete korišćenje Arthas-a.
Koristi dashboard komandu može prikazati trenutni sistem real-time data panel, uključuje nit informacije, JVM memorijske informacije i JVM runtime parametre.
Pregledaj trenutne JVM sistemske osobine, npr. kada kontejner vremenska zona i host mašina nisu konzistentne, možeš koristiti sledeću komandu da pregledaš vremensku zonu informaciju.
Koristi logger komandu može pregledati log informacije, i promeniti log nivo, ova komanda je vrlo korisna.
Npr. mi u produkciji okruženju obično nećemo printati DEBUG nivo log-ova, kada na liniji rešavamo probleme možemo privremeno uključiti DEBUG nivo log-ova, pomažu nam da rešimo probleme, dole predstavljam kako da operišem.
Naša aplikacija podrazumevano koristi INFO nivo log-ova, koristi logger komandu može pregledati;
Koristi sledeću komandu da promeniš log nivo u DEBUG, treba koristiti -c parametar da specificiraš class loader HASH vrednost;
logger -c 21b8d17c --name ROOT --level debug
Ponovo koristi logger komandu da pregledaš, otkrio ROOT nivo log je već promenjen;
Koristi docker logs -f mall-tiny-arthas komandu da pregledaš kontejner log-ove, otkrio je već printao DEBUG nivo log-ove;
Nakon što završiš pregledanje log-ova setaj da vratiš log nivo u INFO nivo.
Iako na liniji okruženju hot update kôd nije vrlo dobro ponašanje, ali ponekad stvarno trebamo hot update kôd. Dole predstavljam kako koristiti jad/mc/redefine da hot update kôd.
Prvo imamo proizvod detalj interfejs, kada prosledimo id<=0, baciće IllegalArgumentException;
/** * Brand menadžment Controller * Created by macro on 2019/4/19. */ @Api(tags = "PmsBrandController", description = "Proizvod brend menadžment") @Controller @RequestMapping("/brand") public class PmsBrandController { @Autowired private PmsBrandService brandService; private static final Logger LOGGER = LoggerFactory.getLogger(PmsBrandController.class); @ApiOperation("Preuzmi određeni id brend detalj") @RequestMapping(value = "/{id}", method = RequestMethod.GET) @ResponseBody public CommonResult<PmsBrand> brand(@PathVariable("id") Long id) { if(id<=0){ throw new IllegalArgumentException("id not excepted id:"+id); } return CommonResult.success(brandService.getBrand(id)); } }
Poziv interfejsa će vratiti sledeće informacije, call adresa: http://192.168.5.94:8088/brand/0
{ "timestamp": "2020-06-12T06:20:20.951+0000", "status": 500, "error": "Internal Server Error", "message": "id not excepted id:0", "path": "/brand/0" }
Želimo da rešimo ovaj problem, ako prosledimo id<=0, direktno vratimo praznih podataka CommonResult, kôd modifikacija sadržaj je kao sledi;
/** * Brand menadžment Controller * Created by macro on 2019/4/19. */ @Api(tags = "PmsBrandController", description = "Proizvod brend menadžment") @Controller @RequestMapping("/brand") public class PmsBrandController { @Autowired private PmsBrandService brandService; private static final Logger LOGGER = LoggerFactory.getLogger(PmsBrandController.class); @ApiOperation("Preuzmi određeni id brend detalj") @RequestMapping(value = "/{id}", method = RequestMethod.GET) @ResponseBody public CommonResult<PmsBrand> brand(@PathVariable("id") Long id) { if(id<=0){ // throw new IllegalArgumentException("id not excepted id:"+id); return CommonResult.success(null); } return CommonResult.success(brandService.getBrand(id)); } }
Prvo treba da modifikujemo PmsBrandController klasu kôd, zatim upload na server, zatim koristimo sledeću komandu da kopiramo java fajl u kontejner /tmp direktorijum;
Github na 60K zvezdica ecommercepraktičniprojekat mall, kompletna video tutorial (2023 najnovija verzija) je već završen! Kompletna tutorial oko 40 sati, ukupno 105 perioda, kroz ovaj tutorial možeš imati pokriva glavne Java tehnički stack kompletn projekat iskustvo, istovremeno poboljšaj sposobnost nezavisnog razvoja jednog projekta, dole je projekat ukupna arhitektura mapa, zainteresovani prijatelji mogu kliknuti link mall video tutorial pridruži se učenje.
Kompletan video tutorial sadržaj je i dalje vrlo kompletan, pokriva mall projekat najbolji learning ruta, ukupan framework build, poslovna i tehnička implementacija svestrano rešavanje, linija Docker okruženje deployment itd. sadržaj, specifican outline može referencirati sledeću mapu, takođe možeš kliknuti link mall video tutorial saznaj više sadržaja.