Naučite Arthas, neka vaše 3-godišnje iskustvo poseduje 5-godišnju moć!
Mengxiang de XingkongSajt1497 reči5 minuta
Zvanični sajt mall tutorijala: macrozheng.com
Kada projekat na produkciji naiđe na problem koji se ne može debugovati, a se ne može reprodukovati lokalno, da li moramo samo dodati logove i ponovo objaviti? Sa ovim alatom možete vršiti debug na produkciji i realizovati hot-fix, preporučujem svima!
Arthas je dijagnostički alat za Java koji je Alibaba otvorio kao izvorni kod, veoma omiljen kod programera. Koristi interaktivni mod komandne linije, dok istovremeno pruža bogatu funkciju Tab automatskog dopunjavanja, dodatno olakšavajući lociranje i dijagnosticiranje problema.
Da bismo reprodukovali realno produkcijno okruženje, kroz Arthas ćemo dijagnostikovati Java program u Docker kontejneru.
Koristite arthas-boot, preuzmite odgovarajući jar paket, adresa preuzimanja: https://alibaba.github.io/arthas/arthas-boot.jar
Pokrenite našu Spring Boot aplikaciju mall-tiny-arthas korišćenjem Docker kontejnera, skripte za pakovanje i pokretanje se nalaze u direktorijumu src\main\docker projekta;
Kopirajte arthas-boot.jar u direktorijum \ našeg kontejnera aplikacije;
Ovo je možda koristan projekat za vas, projekat mall je sistem e-trgovine baziran na SpringBoot + Vue + uni-app (Github zvezda 60K), koristi Docker kontejnerizaciju. Uključuje projekat prodajnice i sistem upravljanja pozadine, može podržati kompletan proces narudžbine! Obuhvata funkcije kao robu, narudžbinu, korpu, dozvole, kupone, članove, plaćanje itd., funkcionalnost je vrlo moćna!
Korišćenjem komande dashboard možete prikazati panel podataka u realnom vremenu trenutnog sistema, uključujući informacije o nitima, informacije o JVM memoriji i runtime parametre JVM.
Pregledajte informacije o trenutnim nitima, pregledajte stek niti, možete pronaći nit koja trenutno najviše troši CPU.
Česti komandi:
# Ispišite stek informacije 3 najzaposlenijih trenutnih nitithread -n 3# Pregledajte stek informacije nite sa ID-om 1thread 1# Pronađite nit koja trenutno blokira druge nitithread -b# Pregledajte nit u specifičnom stanjuthread -state WAITING
Pregledajte sistemske osobine trenutnog JVM-a, na primer kada vremenska zona kontejnera i host mašine nisu konzistentne, možete koristiti sledeću komandu da vidite informacije o vremenskoj zoni.
Korišćenjem komande logger možete videti informacije o logovima i promeniti nivo logovanja, ova komanda je vrlo korisna.
Na primer, u produkcijonom okruženju obično nećemo ispisivati logove DEBUG nivoa, kada rešavamo probleme na produkciji možemo privremeno uključiti logove DEBUG nivoa da nam pomognu u rešavanju problema, u nastavku ću predstaviti kako da postupite.
Naša aplikacija podrazumevano koristi logove INFO nivoa, korišćenjem komande logger možete videti;
Koristite sledeću komandu da promenite nivo logovanja na DEBUG, potrebno je koristiti parametar -c da navedete HASH vrednost klasa učitača;
logger -c 21b8d17c --name ROOT --level debug
Ponovo koristite komandu logger da vidite, otkrivamo da je nivo logovanja ROOT već promenjen;
Koristite komandu docker logs -f mall-tiny-arthas da vidite logove kontejnera, otkrivamo da su već ispisani logovi DEBUG nivoa;
Nakon pregledanja logova ne zaboravite da vratite nivo logovanja na INFO nivo.
Iako hot update koda na produkciji nije dobro ponašanje, ponekad zaista zaista trebamo hot update koda. U nastavku ću predstaviti kako koristiti jad/mc/redefine za hot update koda.
Prvo imamo interfejs detalja proizvoda, kada prosledimo id<=0, bacaće IllegalArgumentException;
/** * Controller upravljanja brendom * Created by macro on 2019/4/19. */ @Api(tags = "PmsBrandController", description = "Upravljanje brendom proizvoda") @Controller @RequestMapping("/brand") public class PmsBrandController { @Autowired private PmsBrandService brandService; private static final Logger LOGGER = LoggerFactory.getLogger(PmsBrandController.class); @ApiOperation("Detalji brenda specifičnog id-a") @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, adresa poziva: 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 popravimo ovaj problem, kada se prosledi id<=0, direktno vratiti CommonResult sa praznim podacima, sadržaj izmene koda je sledeći;
/** * Controller upravljanja brendom * Created by macro on 2019/4/19. */ @Api(tags = "PmsBrandController", description = "Upravljanje brendom proizvoda") @Controller @RequestMapping("/brand") public class PmsBrandController { @Autowired private PmsBrandService brandService; private static final Logger LOGGER = LoggerFactory.getLogger(PmsBrandController.class); @ApiOperation("Detalji brenda specifičnog id-a") @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 moramo izmeniti kod klase PmsBrandController, zatim ga postaviti na server, zatim koristiti sledeću komandu da kopiramo java fajl u direktorijum /tmp kontejnera;
Zatim moramo pogledati Hash vrednost klasa učitača ove klase;
sc -d *PmsBrandController |grep classLoaderHash
Zatim koristite memorijski kompajler da kompajlirate izmenjeni .java fajl u .class fajl, obratite pažnju da treba koristiti -c da navedete klasa učitač;
mc -c 21b8d17c /tmp/PmsBrandController.java -d /tmp
Konačno koristite komandu redefine da učitate .class fajl i zamenite originalno učitanu klasu;
Projekt e-trgovine mall sa 60K zvezdica na Github-u, komplet video tutorijal (najnovija verzija 2023) je završen! Kompletan tutorijal traje oko 40 sati, ukupno 105 epizoda, kroz ovaj tutorijal možete imati iskustvo kompletnog projekta koje pokriva glavnu Java tehnologiju, dok istovremeno poboljšavate svoju sposobnost da samostalno razvijate projekat, ispod je arhitektura celog projekta, zainteresovani prijatelji mogu kliknuti na vezu mall video tutorijal da se uključe u učenje.
Sadržaj kompletnog video tutorijala je vrlo kompletan, obuhvata najbolju putanju učenja projekta mall, izgradnju kompletnog okvira, sveobuhvatnu analizu poslovne i tehničke implementacije, implementaciju Docker okruženja na produkciji itd., detaljan plan možete vidjeti na donjoj slici, takođe možete kliknuti na vezu mall video tutorijal da saznate više sadržaja.