13 คำถามสัมภาษณ์นักพัฒนา Java ใหม่ Series-6 (Microservices และ Java Coding)
คำถามเหล่านี้เป็นคำถามสัมภาษณ์ที่เกิดขึ้นจริงในการสัมภาษณ์ Java Developer เมื่อเร็วๆ นี้ โปรดผ่านขั้นตอนนี้เพื่อล้างรอบทางเทคนิคของคุณ ได้เพิ่มคำถามการเข้ารหัสด้วย
ความปลอดภัยในไมโครเซอร์วิส
API ส่วนที่เหลือมีความปลอดภัยอย่างไร
มีหลายวิธีในการรักษาความปลอดภัย REST API:
ใช้ HTTPS: เพื่อให้แน่ใจว่าข้อมูลทั้งหมดที่ถ่ายโอนระหว่างไคลเอ็นต์และเซิร์ฟเวอร์ได้รับการเข้ารหัส
ใช้ OAuth: OAuth เป็นกรอบการให้สิทธิ์ที่อนุญาตให้ผู้ใช้ให้สิทธิ์แอปพลิเคชันบุคคลที่สามในการเข้าถึงทรัพยากรโดยไม่ต้องเปิดเผยรหัสผ่าน
ใช้โทเค็นเว็บ JSON (JWT): JWT เป็นวัตถุ JSON ที่ใช้ในการส่งข้อมูลอย่างปลอดภัยระหว่างฝ่ายต่างๆ ข้อมูลสามารถตรวจสอบและเชื่อถือได้เพราะมีการเซ็นชื่อแบบดิจิทัล
ใช้คีย์ API: คีย์ API เป็นสตริงเฉพาะที่ใช้ในการตรวจสอบคำขอ API โดยปกติแล้ว คีย์จะถูกส่งผ่านในส่วนหัว HTTP ของคำขอ API
ใช้การรับรองความถูกต้องพื้นฐาน: ในวิธีนี้ ไคลเอนต์จะส่งคำขอ HTTP พร้อมชื่อผู้ใช้และรหัสผ่านสำหรับการรับรองความถูกต้อง
ใช้การรับรองความถูกต้องด้วยหลายปัจจัย: วิธีนี้รวมวิธีการตรวจสอบความถูกต้องตั้งแต่สองวิธีขึ้นไปเพื่อเพิ่มความปลอดภัย
สิ่งสำคัญคือต้องเลือกมาตรการรักษาความปลอดภัยที่เหมาะสมตามความละเอียดอ่อนของข้อมูลที่ถ่ายโอนและระดับความไว้วางใจระหว่างไคลเอ็นต์และเซิร์ฟเวอร์
โทเค็น JWT ทำงานภายในอย่างไร (คุณควรทราบขั้นตอนและวิธีการใช้โทเค็นเป็นการภายใน)
JSON Web Token (JWT) เป็นวิธีที่กะทัดรัดและปลอดภัยสำหรับ URL ในการแสดงการอ้างสิทธิ์ที่สามารถถ่ายโอนระหว่างสองฝ่าย การอ้างสิทธิ์ใน JWT นั้นเข้ารหัสเป็นออบเจ็กต์ JSON ซึ่งใช้เป็นเพย์โหลดของโครงสร้าง JSON Web Signature (JWS) หรือเป็นข้อความธรรมดาของโครงสร้าง JSON Web Encryption (JWE) ทำให้การอ้างสิทธิ์ได้รับการลงชื่อแบบดิจิทัลหรือมีการป้องกันความสมบูรณ์ ด้วยรหัสยืนยันข้อความ (MAC) และ/หรือเข้ารหัส
นี่คือวิธีการทำงานของ JWT ภายใน:
- ลูกค้าส่งคำขอไปยังเซิร์ฟเวอร์เพื่อตรวจสอบสิทธิ์ผู้ใช้
- เซิร์ฟเวอร์ตรวจสอบข้อมูลประจำตัวของผู้ใช้และสร้าง JWT หากผู้ใช้ได้รับการตรวจสอบสิทธิ์
- เซิร์ฟเวอร์ส่ง JWT กลับไปยังไคลเอนต์
- ไคลเอนต์จัดเก็บ JWT และรวมไว้ในส่วนหัวของคำขอที่ตามมาเพื่อไปยังเส้นทางที่ได้รับการป้องกันบนเซิร์ฟเวอร์
- เซิร์ฟเวอร์ตรวจสอบ JWT และประมวลผลคำขอหากโทเค็นถูกต้อง
- โดยทั่วไปแล้วส่วนหัวจะประกอบด้วยสองส่วน: ประเภทของโทเค็น ซึ่งก็คือ JWT และอัลกอริทึมการลงนามที่ใช้ เช่น HMAC SHA256 หรือ RSA
- ส่วนที่สองของโทเค็นคือเพย์โหลด ซึ่งมีการอ้างสิทธิ์ การอ้างสิทธิ์คือข้อความเกี่ยวกับเอนทิตี (โดยทั่วไปคือผู้ใช้) และข้อมูลเพิ่มเติม การเรียกร้องมีสามประเภท: การเรียกร้องที่จดทะเบียน สาธารณะ และส่วนตัว
- ส่วนที่สามของโทเค็นคือลายเซ็น ซึ่งใช้ในการตรวจสอบว่าผู้ส่งของ JWT เป็นใคร และเพื่อให้แน่ใจว่าข้อความไม่ได้ถูกเปลี่ยนแปลงระหว่างทาง
HMACSHA256( base64UrlEncode(ส่วนหัว) + “." + base64UrlEncode(เพย์โหลด), ความลับ)
จากนั้น JWT ที่สมบูรณ์จะประกอบด้วยการต่อส่วนหัวที่เข้ารหัส เพย์โหลดที่เข้ารหัส และลายเซ็น โดยมีเครื่องหมายมหัพภาค (.) คั่น ตัวอย่างเช่น:
xxxxx.yyyyy.zzzzz
ธุรกรรมทำงานใน Spring boot microservice อย่างไร จะบรรลุเป้าหมายนั้นได้อย่างไร (โดยพื้นฐานแล้ว microservices ส่วนใหญ่จะไร้สถานะและไม่ได้รักษาสถานะที่จำเป็นสำหรับการทำธุรกรรม
ใน Spring Boot ธุรกรรมคือหน่วยของงานที่ดำเนินการกับฐานข้อมูล ธุรกรรมใน Spring Boot ได้รับการจัดการโดยโครงสร้างพื้นฐานการจัดการธุรกรรมของ Spring Framework ซึ่งใช้ Java Transaction API (JTA)
นี่คือวิธีการทำงานของธุรกรรมใน Spring Boot:
- ลูกค้าเริ่มต้นธุรกรรมโดยเรียกเมธอดบนทรานแซกชันเซอร์วิสบีน
- วิธีการของทรานแซกชันเซอร์วิสบีนดำเนินการกับฐานข้อมูลอย่างน้อยหนึ่งรายการโดยใช้ DAO (วัตถุเข้าถึงข้อมูล)
- หากการดำเนินการฐานข้อมูลสำเร็จและไม่มีข้อยกเว้นเกิดขึ้น ธุรกรรมจะถูกคอมมิตและการเปลี่ยนแปลงจะคงอยู่ในฐานข้อมูล
- หากเกิดข้อยกเว้นระหว่างการดำเนินการของฐานข้อมูล ธุรกรรมจะถูกย้อนกลับและการเปลี่ยนแปลงจะไม่คงอยู่ในฐานข้อมูล
- เปิดใช้งานการจัดการธุรกรรมในการกำหนดค่า Spring ของคุณ
- ใส่คำอธิบายประกอบ bean บริการธุรกรรมของคุณและวิธีการด้วย
@Transactionalคำอธิบายประกอบ - กำหนดค่า DataSource และtransaction manager bean ในการกำหนดค่า Spring ของคุณ
- ใช้ DAO (วัตถุเข้าถึงข้อมูล) เพื่อดำเนินการกับฐานข้อมูลภายในขอบเขตของการทำธุรกรรม
Composition and Aggregation พร้อมตัวอย่างคืออะไร?
องค์ประกอบเป็นรูปแบบความสัมพันธ์ที่ชัดเจนซึ่งแสดงถึงความสัมพันธ์แบบ "has-a" ระหว่างวัตถุสองชิ้น ใช้เพื่อแสดงถึงความสัมพันธ์บางส่วนหรือทั้งหมด โดยที่ออบเจ็กต์ทั้งหมดประกอบด้วยออบเจ็กต์ส่วนหนึ่งและมีหน้าที่รับผิดชอบแต่เพียงผู้เดียวตลอดอายุการใช้งาน ตัวอย่างเช่นCarคลาสอาจประกอบด้วยWheelคลาส โดยที่ชุดล้อของรถยนต์ "has-a" ถ้ารถถูกทำลาย ล้อก็จะถูกทำลายด้วย เพราะล้อไม่สามารถอยู่ได้โดยอิสระจากตัวรถ
class Wheel {
// ...
}
class Car {
private final List<Wheel> wheels = new ArrayList<>();
// ...
}
class Department {
// ...
}
class Employee {
private Department department;
// ...
}
ข้อยกเว้นการปรับเปลี่ยนพร้อมกันคืออะไร และจะป้องกันได้อย่างไร
ConcurrentModificationException เป็นข้อยกเว้นรันไทม์ที่เกิดขึ้นเมื่อแอปพลิเคชันแก้ไขวัตถุพร้อมกันในลักษณะที่ละเมิดกฎการปรับเปลี่ยนพร้อมกันของวัตถุ
ข้อยกเว้นนี้สามารถเกิดขึ้นได้เมื่อหลายเธรดพยายามแก้ไขอ็อบเจ็กต์พร้อมกัน และอ็อบเจ็กต์ไม่ได้ออกแบบมาให้แก้ไขพร้อมกัน นอกจากนี้ยังอาจเกิดขึ้นได้เมื่อเธรดเดียววนซ้ำกับคอลเล็กชันและแก้ไขคอลเล็กชันด้วยวิธีใดวิธีหนึ่ง เช่น โดยการเพิ่มหรือลบองค์ประกอบ ในขณะที่การวนซ้ำกำลังดำเนินอยู่
ต่อไปนี้คือตัวอย่างวิธี ConcurrentModificationException ที่อาจเกิดขึ้น:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if (s.equals("a")) {
list.remove(s); // This will throw a ConcurrentModificationException
}
}
- ใช้คอลเล็กชันที่ปลอดภัยสำหรับเธรด เช่น
VectorหรือCopyOnWriteArrayListแทนคอลเล็กชันที่ไม่ปลอดภัยสำหรับเธรดArrayListเช่น - ใช้การซิงโครไนซ์เพื่อให้แน่ใจว่ามีเพียงหนึ่งเธรดเท่านั้นที่สามารถแก้ไขคอลเล็กชันได้ในแต่ละครั้ง
- ใช้ตัววนซ้ำที่สนับสนุน
remove()เมธอดและเรียกเมธอดนั้นแทนการแก้ไขคอลเล็กชันโดยตรง
Cohesion vs Coupling อธิบายว่า?
การเกาะกันและการมีเพศสัมพันธ์เป็นการวัดคุณภาพการออกแบบของระบบซอฟต์แวร์สองแบบ
การทำงานร่วมกันหมายถึงระดับที่องค์ประกอบภายในโมดูลหรือส่วนประกอบเดียวทำงานร่วมกันเพื่อบรรลุวัตถุประสงค์เดียวที่กำหนดไว้อย่างดี ระบบที่มีความเหนียวแน่นสูงเป็นระบบที่องค์ประกอบทั้งหมดภายในโมดูลมีความสัมพันธ์กันอย่างมากและทำงานร่วมกันเพื่อบรรลุเป้าหมายร่วมกัน การเชื่อมโยงกันโดยทั่วไปมักถูกมองว่าเป็นคุณลักษณะที่พึงประสงค์ของระบบซอฟต์แวร์ เนื่องจากทำให้ระบบเข้าใจและบำรุงรักษาได้ง่ายขึ้น
ในทางกลับกัน การมีเพศสัมพันธ์หมายถึงระดับที่โมดูลหรือส่วนประกอบหนึ่งขึ้นอยู่กับ
คุณรู้จักการติดตามแบบกระจายหรือไม่? ประโยชน์ของมันคืออะไร?
การติดตามแบบกระจายเป็นเทคนิคที่ใช้ในการติดตามความคืบหน้าของคำขอเมื่อเดินทางผ่านระบบแบบกระจาย ช่วยให้คุณเห็นว่าส่วนประกอบต่างๆ ของระบบโต้ตอบกันอย่างไร และสามารถช่วยคุณระบุปัญหาคอขวดและปัญหาอื่นๆ ที่อาจส่งผลต่อประสิทธิภาพการทำงานของแอปพลิเคชันของคุณ
ใน Spring Boot คุณสามารถใช้ไลบรารี Spring Cloud Sleuth เพื่อเพิ่มการติดตามแบบกระจายไปยังแอปพลิเคชันของคุณ Sleuth ผสานรวมกับระบบการติดตามยอดนิยม เช่น Zipkin, Jaeger และ Elastic APM เพื่อรวบรวมและแสดงข้อมูลการติดตาม
หากต้องการใช้ Sleuth ในแอปพลิเคชัน Spring Boot คุณจะต้อง:
- เพิ่มการอ้างอิงเริ่มต้น Spring Cloud Sleuth ในโครงการของคุณ
- กำหนดค่าระบบการติดตามที่คุณเลือก (เช่น Zipkin, Jaeger เป็นต้น)
- ใส่คำอธิบายประกอบ Service Bean ของคุณด้วย
@Traceคำอธิบายประกอบเพื่อเปิดใช้งานการติดตามสำหรับแต่ละวิธี
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Sleuth สำหรับการติดตามแบบกระจายใน Spring Boot คุณสามารถดูเอกสารคู่มือ Spring Cloud Sleuth:https://spring.io/projects/spring-cloud-sleuth
คุณปฏิบัติตามมาตรฐานใด ๆ เพื่อสร้างบริการพักผ่อนหรือไม่?
มีมาตรฐานหลายประการที่คุณควรปฏิบัติตามเมื่อสร้างบริการ RESTful:
- ใช้วิธีการ HTTP (เช่น GET, POST, PUT, DELETE) อย่างเหมาะสม:
- ควรใช้ GET เพื่อดึงข้อมูล
- ควรใช้ POST เพื่อสร้างข้อมูลใหม่
- ควรใช้ PUT เพื่ออัปเดตข้อมูลที่มีอยู่
- ควรใช้ DELETE เพื่อลบข้อมูล
- ควรใช้รหัสสถานะ 2xx (เช่น 200, 201) เพื่อระบุความสำเร็จ
- ควรใช้รหัสสถานะ 4xx (เช่น 400, 401) เพื่อระบุข้อผิดพลาดที่เกิดขึ้นเนื่องจากไคลเอนต์
- ควรใช้รหัสสถานะ 5xx (เช่น 500, 501) เพื่อระบุข้อผิดพลาดที่เกิดขึ้นบนเซิร์ฟเวอร์
- อนุญาตให้มีการเจรจาเนื้อหาที่ยืดหยุ่น (เช่น รองรับรูปแบบต่างๆ เช่น JSON และ XML)
- ปฏิบัติตามหลักการของ REST (เช่น ใช้ไฮเปอร์มีเดีย ทรัพยากรแคช และการออกแบบสำหรับการมองเห็นและความน่าเชื่อถือ)
- สร้างเพื่อขยายขนาดตั้งแต่เริ่มต้น
- ใช้รูปแบบการประกาศสำหรับการตั้งค่าและปรับใช้
- แยกขั้นตอนการ build และ run ออกจากกันอย่างเคร่งครัด
- บริการส่งออกผ่านการผูกพอร์ต
- ใช้การฉีดพึ่งพา
- จัดเก็บการกำหนดค่าในสภาพแวดล้อม
- ปฏิบัติต่อบันทึกเป็นสตรีมเหตุการณ์
- เรียกใช้เป็นกระบวนการเดียว
- ทิ้ง
- เพิ่มความทนทานสูงสุดด้วยการเริ่มต้นอย่างรวดเร็วและการปิดเครื่องที่นุ่มนวล
- รักษาการพัฒนา การจัดเตรียม และการผลิตให้ใกล้เคียงกันมากที่สุด
- ถือว่าบริการสำรองเป็นทรัพยากรที่แนบมา
- โปรดปรบมือให้กับเรื่องราวและติดตามฉัน บนGumroadและAmazon
- อ่านเนื้อหาเพิ่มเติมบนสื่อ ของฉัน (21+ เรื่องราวเกี่ยวกับการสัมภาษณ์ Java Developer)
- ติดตามฉัน: LinkedIn | ทวิตเตอร์
ใช้ส่วนหัว HTTP ที่เหมาะสม (เช่น Content-Type, Authorization)
คุณรู้วิธีการ 12 ปัจจัยในการสร้างไมโครเซอร์วิสหรือไม่?
วิธีการแบบ 12 ปัจจัยคือชุดแนวทางปฏิบัติที่ดีที่สุดสำหรับการสร้างแอปพลิเคชันซอฟต์แวร์ในรูปแบบบริการ (SaaS) ซึ่งได้แก่:
พ็อดใน Kubernetes คืออะไร
ใน Kubernetes พ็อดเป็นหน่วยพื้นฐานของการปรับใช้ เป็นหน่วยการปรับใช้ที่เล็กที่สุดในโมเดลวัตถุ Kubernetes
พ็อดประกอบด้วยคอนเทนเนอร์ตั้งแต่หนึ่งคอนเทนเนอร์ขึ้นไป เช่น คอนเทนเนอร์ Docker และใช้เพื่อโฮสต์คอนเทนเนอร์ที่ประกอบเป็นแอปพลิเคชัน คอนเทนเนอร์ในพ็อดใช้เนมสเปซเครือข่ายเดียวกันและสามารถสื่อสารระหว่างกันโดยใช้ localhost พ็อดยังมีตำแหน่งร่วมและกำหนดเวลาร่วมกัน ซึ่งหมายความว่าพ็อดถูกกำหนดให้ทำงานบนโหนดเดียวกันและใช้ทรัพยากรเดียวกันร่วมกัน (เช่น CPU หน่วยความจำ)
พ็อดมีไว้สำหรับชั่วคราว หมายความว่าคาดว่าจะมีการยกเลิกและแทนที่เมื่อเวลาผ่านไป สิ่งนี้ช่วยให้ปรับขนาดและอัปเดตแอปพลิเคชันได้ง่าย
พ็อดถูกสร้างและจัดการโดย Kubernetes controlplane ซึ่งมีหน้าที่ตรวจสอบว่าพ็อดทำงานตามจำนวนที่ต้องการตามเวลาที่กำหนด
คำถามการเข้ารหัส J ava ถูกถามในการสัมภาษณ์
เขียนโปรแกรมเพื่อพิมพ์เฉพาะตัวเลขจากอาร์เรย์อักขระตัวอักษรและตัวเลขโดยใช้ stream API ใน java-8
char[] alphanumericArray = {'a', '1', 'b', '2', 'c', '3', 'd', '4', 'e', '5'};
Arrays.stream(alphanumericArray)
.filter(Character::isDigit)
.forEach(System.out::print);
Arrays.stream(alphanumericArray)
.mapToInt(Character::getNumericValue)
.filter(i -> i != -1)
.forEach(System.out::print);
public class StringToInt {
public static void main(String[] args) {
String str = "12345";
int result = 0;
for (int i = 0; i < str.length(); i++) {
result = result * 10 + str.charAt(i) - '0';
}
System.out.println(result);
}
}
อัลกอริทึมทำงานโดยการวนซ้ำผ่านอักขระแต่ละตัวในสตริง โดยเริ่มจากอักขระด้านซ้ายสุด สำหรับอักขระแต่ละตัว จะคูณผลลัพธ์ปัจจุบันด้วย 10 และเพิ่มค่าตัวเลขของอักขระนั้น ค่าตัวเลขของอักขระได้จากการลบค่า ASCII ของอักขระ '0' ออกจากค่า ASCII ของอักขระ นี่เทียบเท่ากับการเรียกใช้Character.getNumericValue()เมธอด ซึ่งจะส่งคืนค่าจำนวนเต็มของอักขระหลัก
ตัวอย่างเช่น หากสตริงคือ "12345" การวนซ้ำครั้งแรกจะคำนวณ การวนresult = 0 * 10 + 1ซ้ำครั้งที่สองจะคำนวณresult = 1 * 10 + 2และอื่นๆ หลังจากวนซ้ำทั้งหมดเสร็จแล้ว ค่าสุดท้ายของresultจะเป็น 12345
เขียนโปรแกรมเพื่อค้นหาอักขระตัวแรกในสตริงในภาษาจาวา
public class FindFirstOccurrence {
public static void main(String[] args) {
String str = "Hello, world!";
char c = 'l';
int index = -1;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == c) {
index = i;
break;
}
}
if (index != -1) {
System.out.println("Character '" + c + "' found at index " + index);
} else {
System.out.println("Character '" + c + "' not found in string");
}
}
}
อัลกอริทึมทำงานโดยการวนซ้ำผ่านอักขระแต่ละตัวในสตริงและตรวจสอบว่าอักขระนั้นเท่ากับอักขระเป้าหมายหรือไม่ ถ้าเป็นเช่นนั้น ดัชนีจะถูกเก็บไว้และการวนซ้ำจะสิ้นสุดลง หากไม่พบอักขระ ดัชนีจะถูกตั้งค่าเป็น -1 ค่าสุดท้ายของดัชนีจะถูกใช้เพื่อกำหนดว่าพบอักขระในสตริงหรือไม่
int index = str.indexOf(c);
if (index != -1) {
System.out.println("Character '" + c + "' found at index " + index);
} else {
System.out.println("Character '" + c + "' not found in string");
}
คุณสามารถรับสำเนาของคุณได้ที่นี่ - Grokking the Spring Boot Interview:
Grokking the Spring Boot บทสัมภาษณ์ [คัดลอกตัวอย่างฟรี]: คลิกที่นี่
คุณสามารถรับสำเนาของคุณได้ที่นี่: Grokking the Java Interview
Grokking the Java Interview [คัดลอกตัวอย่างฟรี]: คลิกที่นี่





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)