Problems Encountered
- Lỗi khi tạo dự án Maven [WARNING] No archetype found in remote catalog. Defaulting to internal catalog (đã giải quyết) ===================================================================================================
Mô tả vấn đề: Khi tạo dự án maven-archetype-webapp xuất hiện cảnh báo
[WARNING] No archetype found in remote catalog. Defaulting to internal catalog
Giải pháp tham khảo tại https://blog.csdn.net/gao_zhennan/article/details/123247536
Bài viết này đề cập đến một cảnh báo phổ biến khi sử dụng Maven để tạo mẫu dự án: "No archetype found in remote catalog. Defaulting to internal catalog", và cung cấp hướng dẫn khắc phục. Vấn đề xảy ra khi dùng lệnh Maven mvn archetype:generate, thường do kho lưu trữ mirror của Maven không chứa tệp archetype-catalog.xml. Người viết phát hiện rằng từ kho lưu trữ mirror của Aliyun không thể tìm thấy tệp này.
Các bước giải quyết:
- Trong khi chạy
mvn archetype:generate(thay đổi thành lúc tạo dự án Maven trong IDEA), tạm thời không sử dụng bất kỳ mirror nào, tức là dùng kho lưu trữ mặc định của Maven. - Sau khi tạo mẫu dự án, cấu hình lại mirror để lấy phụ thuộc và plugin.
Ngoài ra, tác giả lưu ý rằng cảnh báo này không ảnh hưởng đến chức năng tạo dự án của Maven. Đối với người dùng muốn truy xuất nhiều mẫu dự án hơn từ kho lưu trữ trung tâm, họ có thể trực tiếp truy cập https://repo1.maven.org/maven2/archetype-catalog.xml và lưu tệp này vào thư mục người dùng của Maven (thường là ~/.m2/). Điều này cho phép truy cập hàng ngàn mẫu dự án. Mặc dù vẫn có thể xuất hiện cảnh báo nhưng không ảnh hưởng đến việc sử dụng bình thường của Maven.
Các bước giải quyết:
-
Sửa đổi tệp cấu hình Maven
-
Tạo lại dự án maven-archetype-webapp, lưu ý bây giờ cần dùng mạng ngoài, bật chế độ TUN!!! Nếu không sẽ vẫn lỗi
-
Tạo thành công
Do cảnh báo này không ảnh hưởng đến việc sử dụng, bạn vẫn có thể tiếp tục sử dụng dự án được tạo bằng mirror của Aliyun e-commerce-center2
Cảnh báo: No archetype found in remote catalog. Defaulting to internal catalog
Ghi chú kiến thức
- Giải quyết cơ chế kế thừa đơn trong Maven thông qua pom + import ================================
<dependency> <br></br> <groupId>org.springframework.boot</groupId> <br></br> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <br></br> <!-- Giải thích từ giảng viên: <br></br> 1. loại: pom và scope import phối hợp sử dụng <br></br> 2. đại diện cho mô-đun con của dự án cha, khi nhập phụ thuộc liên quan đến springboot sẽ khóa phiên bản ở 2.2.2.RELEASE <br></br> 3. giải quyết giới hạn kế thừa đơn trong Maven thông qua pom + import <br></br> --> <br></br> <type>pom</type> <br></br> <scope>import</scope> <br></br></dependency>
Hiểu rõ vai trò của pom + import?
GPT
Trong Maven, việc sử dụng kết hợp pom và import là một tính năng nâng cao dùng để quản lý phụ thuộc. Kết hợp này được sử dụng trong phần <dependencyManagement> để kiểm soát phiên bản phụ thuộc, chứ không phải khai báo phụ thuộc trực tiếp trong <dependencies>. Dưới đây là giải thích chi tiết cho đoạn mã trên và vai trò của pom + import:
- Loại là
pom: Trong Maven, phần tử<type>của phụ thuộc mặc định làjar, biểu thị rằng phụ thuộc là một tệp JAR. Khi<type>được đặt thànhpom, điều đó có nghĩa là phụ thuộc thực tế là một tệp POM của một dự án Maven. Trong trường hợp này, Maven sẽ xử lý các phụ thuộc và cấu hình được định nghĩa trong tệp POM này thay vì thêm một thư viện mã thực tế. - Phạm vi là
import: Phần tử<scope>thường dùng để xác định phạm vi của phụ thuộc (nhưcompile,runtime,test,provided). Khi<scope>được thiết lập thànhimport, điều này có nghĩa là tệp POM hiện tại sẽ nhập phần<dependencyManagement>từ một tệp POM khác. Đây là một phạm vi đặc biệt chỉ hiệu lực trong phần<dependencyManagement>. - Cơ chế phối hợp: Khi
<type>làpomvà<scope>làimport, Maven sẽ nhập phần<dependencyManagement>từ tệp POM đã chỉ định. Kết quả là dự án hiện tại có thể sử dụng các phiên bản phụ thuộc được chỉ định trong tệp POM được nhập, mà không cần lặp lại thông tin này trong từng mô-đun con. Điều này đảm bảo tất cả các mô-đun trong dự án đều sử dụng cùng một phiên bản phụ thuộc, rất quan trọng để duy trì sự nhất quán trong các dự án lớn. - Giải quyết giới hạn kế thừa đơn trong Maven: Dự án Maven hỗ trợ kế thừa từ một POM cha duy nhất, gọi là cơ chế kế thừa đơn. Việc sử dụng
<type>pom</type>và<scope>import</scope>cho phép đạt được hiệu ứng tương tự như kế thừa đa cấp. Bạn có thể nhập thông tin quản lý phụ thuộc từ nhiều tệp POM khác nhau, từ đó vượt qua giới hạn kế thừa đơn.
Trong ví dụ của bạn, spring-boot-dependencies là một tệp POM đặc biệt của Spring Boot, chứa các phiên bản khuyến nghị cho tất cả các phụ thuộc cần thiết của Spring Boot. Việc nhập tệp này giúp dự án của bạn tự động sử dụng các phiên bản phụ thuộc được khuyến nghị của Spring Boot, tránh xung đột phiên bản và đơn giản hóa quản lý phụ thuộc.
2 Báo lỗi khi import cấu hình trong dependencyManagement trong Maven: Dependency 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0' not found
Nguyên nhân gây ra lỗi:
Khi làm mới Maven, thường do kho lưu trữ mirror hoặc trung tâm của Maven không chứa tệp
org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0. Trong quá trình debug, người dùng phát hiện rằng từ kho lưu trữ mirror của Aliyun không thể tìm thấy tệp này.
<dependencyManagement><br></br> <dependencies> <br></br> <!--Cấu hình phụ thuộc cho việc tích hợp mybatis với springboot, starter mybatis--><br></br> <dependency><br></br> <groupId>org.mybatis.spring.boot</groupId><br></br> <artifactId>mybatis-spring-boot-starter</artifactId><br></br> <!--Chỉ định phiên bản mysql và mybatis.spring.boot.version ở đây, không dùng phiên bản ưu tiên<br></br> <properties><br></br> <mybatis.spring.boot.version>2.2.0</mybatis.spring.boot.version><br></br> </properties><br></br> --><br></br> <version>${mybatis.spring.boot.version}</version> <br></br> </dependency><br></br> </dependencies><br></br></dependencyManagement>
Khi tạo dự án springcloud, báo lỗi khi khóa phiên bản trong thẻ <dependencyManagement> như sau:
Làm mới Maven vẫn báo lỗi
Lúc này, Maven đang cấu hình sử dụng kho lưu trữ trung tâm của Maven
Cấu hình trong tệp cài đặt Maven C:\Users\yangd.m2\settings.xml như sau:
Đặt URL mặc định trong tệp cấu hình Maven: http://my.repository.com/repo/path
Kiểm tra tài liệu kho lưu trữ trung tâm Maven https://mvnrepository.com/ xem có phiên bản mybatis-spring-boot-starter 2.2.0 không, phát hiện có phiên bản 2.0.0
Địa chỉ tải phụ thuộc từ kho lưu trữ trung tâm là https://repo.maven.apache.org/maven2
Giải pháp: Tạo một dự án Maven mới và thực sự import jar này
Làm mới Maven
Sau khi dự án mới import thành công, dự án springcloud e-commerce-center2 trong tệp pom.xml của nó
Thẻ dependencyManagement không còn báo lỗi với phiên bản được chỉ định
Lưu ý rằng: Thẻ dependencyManagement chủ yếu dùng để khóa phiên bản, không tự động thêm jar phụ thuộc, tức là khi làm mới Maven sẽ không thấy phụ thuộc được thêm vào dependencies
Tóm tắt:
- Phụ thuộc tải xuống bởi Maven sẽ được lưu trữ cục bộ trong thư mục C:\Users\yangd.m2\repository
- Maven sẽ tải phụ thuộc từ đâu dựa vào đường dẫn URL trong thẻ <mirror> trong tệp C:\Users\yangd.m2\settings.xml
- Nếu làm mới Maven thất bại, có thể chuyển đổi URL trong thẻ <mirror> trong tệp C:\Users\yangd.m2\settings.xml, ví dụ dùng mirror của Aliyun
- Khi dùng kho lưu trữ trung tâm mặc định của Maven, cần mạng ngoài, bật chế độ TUN
Dưới đây là các tệp cấu hình liên quan đến Maven, vị trí thư mục repository cục bộ
3 Lỗi Maven Failed to read artifact descriptor for org.springframework.boot:spring-boot-starter-web:jar:2.2.2.RELEASE nhiều lần import thất bại, kinh nghiệm giải quyết
Nếu trong IDEA mạng sử dụng chế độ *** TUN, đồng thời chỉ định từ kho lưu trữ trung tâm tải jar của Maven
Theo lý thuyết, toàn bộ lưu lượng đều đi qua proxy, không nên bị lỗi tải xuống. Kiểm tra vị trí lưu trữ phụ thuộc trong kho lưu trữ Maven cục bộ
Khi import spring-boot-starter-web-2.2.2.RELEASE, làm mới lại kho Maven nhiều lần, lỗi import như sau:
Mở thư mục lưu trữ Maven cục bộ C:\Users\yangd\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.2.2.RELEASE\, phát hiện chỉ có một tệp tên là spring-boot-starter-web-2.2.2.RELEASE.pom.lastUpdated như sau:
Dự đoán, do tồn tại tệp này khiến Maven khi làm mới không tải lại tài nguyên phụ thuộc từ kho lưu trữ. Trong thư mục chứa phụ thuộc Maven, xóa tệp spring-boot-starter-web-2.2.2.RELEASE.pom.lastUpdated này, sau khi xóa, làm mới lại Maven, thấy Maven bắt đầu tải lại tệp phụ thuộc spring-boot-starter-web-2.2.2.RELEASE, vấn đề được giải quyết!!
Nội dung tệp spring-boot-starter-web-2.2.2.RELEASE.pom.lastUpdated như sau:#NOTE: Đây là tệp nội bộ của Maven Resolver, định dạng có thể thay đổi mà không cần thông báo trước.#Thu Dec 28 16:44:33 CST 2023@default-central-https://repo.maven.apache.org/maven2/.lastUpdated=1703753073751https://repo.maven.apache.org/maven2/.error=Không thể truyền tải tài sản org.springframework.boot:spring-boot-starter-web:pom:2.2.2.RELEASE từ kho trung tâm (https://repo.maven.apache.org/maven2): Truyền tải thất bại cho https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.2.2.RELEASE/spring-boot-starter-web-2.2.2.RELEASE.pom
Nguyên nhân có thể là trước đó đã thất bại khi import phụ thuộc, ví dụ như trước đó dùng mirror của Aliyun nhưng không có tài nguyên này, cuối cùng tạo ra tệp hỏng này trong kho lưu trữ cục bộ, khiến sau này khi đặt lại đường dẫn tải về kho trung tâm mặc định của Maven, việc tải lại tệp này không còn truy cập kho trung tâm nữa. Chỉ cần xóa tệp hỏng spring-boot-starter-web-2.2.2.RELEASE.pom.lastUpdated, làm mới lại Maven rồi import một lần nữa là được
Sau khi xóa, phụ thuộc trong kho lưu trữ cục bộ như sau:
Lúc này khung Maven bên phải của IDEA vẫn hiển thị đỏ
Chỉ cần khởi động lại IDEA là được
4 Báo lỗi không tìm thấy tài nguyên trong kho trung tâm: Could not find artifact com.alibaba:druid-spring-boot-starter:jar:unknown in central (https://repo.maven.apache.org/maven2)
Không chỉ định phiên bản, cả dự án cha và dự án hiện tại đều không có phiên bản, dẫn đến lỗi
Giải pháp: Chỉ định phiên bản
Chỉ định phiên bản
5 Sử dụng @SpringBootTest test, import org.junit.jupiter.api.Test;
@SpringBootTest<br></br>public class ApplicationTest {<br></br><br></br><br></br> /**<br></br> * furnMapper được tự động gắn kết qua @Resource là một đối tượng proxy, furnService cũng vậy?<br></br> * GPT<br></br> * Trong đoạn mã test Spring Boot Java bạn cung cấp, cả furnMapper và furnService đều được gắn kết tự động qua @Resource. Theo kết quả đầu ra, có thể thấy furnMapper là một đối tượng proxy, điều này xảy ra khi dùng MyBatis trong Spring, vì các interface Mapper thường được thực hiện qua proxy động của JDK hoặc CGLIB, không cần viết lớp thực thi.<br></br> *<br></br> * Đối với furnService, kết quả đầu ra cho thấy nó là một instance của FurnServiceImpl$$EnhancerBySpringCGLIB$$... . Điều này có nghĩa là furnService cũng là một đối tượng proxy, sử dụng kỹ thuật proxy động CGLIB của Spring. Trong Spring, khi lớp dịch vụ (Service) có các annotation như @Transactional, Spring sẽ tạo một proxy để bọc lớp dịch vụ này, để xử lý các hành vi định nghĩa bởi các annotation này tại runtime (ví dụ quản lý giao dịch).<br></br> *<br></br> * Tóm lại, furnMapper là proxy Mapper của MyBatis được thực hiện qua proxy động JDK hoặc CGLIB, còn furnService là proxy lớp dịch vụ được tạo bởi Spring thông qua CGLIB, dùng để xử lý các điểm quan tâm chéo như giao dịch.<br></br> */<br></br> //Tự động gắn kết đối tượng interface Mapper - là proxy object<br></br> @Resource<br></br> private FurnMapper furnMapper;<br></br><br></br> @Resource<br></br> private FurnService furnService;<br></br><br></br> //Khi sử dụng@SpringBootTest trong dự án SpringBoot,<br></br> // cần import `import org.junit.jupiter.api.Test;` tức là junit5<br></br> // không thể import junit4 `import org.junit.Test;` nếu không gắn kết sẽ bị null<br></br> // junit5 có trong test starter<br></br> @Test<br></br> public void testFurnMapper() {}
6 application.yml không chuyển màu xanh lá, không gợi ý port, do chưa làm mới Maven
7 Khi truy cập http://eureka9001.com:9001/ bằng Firefox, luôn chuyển hướng sang https://eureka9001.com:9001/
#Khi truy cập http://eureka9001.com:9001/, Firefox luôn chuyển hướng sang https://eureka9001.com:9001/<br></br>#Sử dụng Edge và Chrome, tắt proxy *** sẽ không bị lỗi 502<br></br>#Lúc này có thể dùng localhost tạm thời, vì trong file hosts tên miền eureka9001.com ánh xạ tới địa chỉ IP 127.0.0.1 tức là http://localhost:9001/
8 Subdomain là gì?
Subdomain là một khái niệm trong hệ thống tên miền (DNS), là tên miền được phân chia dưới tên miền chính (ví dụ example.com). Hiểu subdomain như một "phần con" của tên miền chính, dùng để tổ chức và điều hướng đến các phần hoặc dịch vụ khác nhau của website. Một số điểm quan trọng:
- Cấu trúc: Trong tên miền hoàn chỉnh như
subdomain.example.com,subdomainlà subdomain,examplelà tên miền chính,.comlà cấp cao nhất. Subdomain nằm phía trước tên miền chính và được phân cách bằng dấu chấm (.) - Sử dụng: Subdomain thường dùng để chia website lớn thành các phần khác nhau, mỗi phần chịu trách nhiệm cho chức năng riêng. Ví dụ, một trường đại học có thể dùng
admissions.university.comcho thông tin tuyển sinh,research.university.comcho nghiên cứu. - Độc lập: Mặc dù subdomain là một phần của tên miền chính, chúng thường được quản lý và vận hành như website độc lập. Chúng có thể có nội dung riêng, thậm chí có máy chủ và dịch vụ host khác nhau.
- Phân giải DNS: Trong DNS, subdomain có bản ghi DNS riêng, có thể phân giải tới địa chỉ IP khác với tên miền chính.
- Tạo không giới hạn: Lý thuyết, có thể tạo vô số subdomain dưới tên miền chính.
- Ví dụ:
blog.example.comvàshop.example.comlà subdomain củaexample.com, có thể dùng cho blog và cửa hàng trực tuyến.
9 Điều chỉnh mức ưu tiên truy cập mặc định IPv6 > IPv4 thành IPv4 > IPv6
Vấn đề: Cấu hình gateway cho phép truy cập từ 127.0.0.1, nhưng khi dùng trình duyệt truy cập
http://localhost:20000/member/get/5, lại không truy cập được. Qua phân tích gói tin thấy, địa chỉ localhost cần truy cập là địa chỉ đích, không phải địa chỉ gửi yêu cầu. Trong cấu hình gateway - RemoteAddr=127.0.0.1 chỉ là địa chỉ của máy gửi yêu cầu, tức là máy chủ của trình duyệt, nhưng địa chỉ này được ưu tiên phân giải thành IPv6 ::1
Kiểm tra ưu tiên sử dụng giao thức qua ping localhost
C:\Users\yangd>ping localhost<br></br><br></br>Đang Ping F2 [::1] với 32 byte dữ liệu:<br></br>Từ ::1 trả lời: thời gian<1ms<br></br>Từ ::1 trả lời: thời gian<1ms<br></br>Từ ::1 trả lời: thời gian<1ms<br></br>Từ ::1 trả lời: thời gian<1ms<br></br><br></br>Thống kê Ping cho ::1:<br></br> Gói: Đã gửi = 4, Nhận = 4, Mất = 0 (0% mất),<br></br>Thời gian vòng đời ước tính (tính bằng mili giây):<br></br> Nhỏ nhất = 0ms, lớn nhất = 0ms, trung bình = 0ms
Xem xét mức ưu tiên truy cập mạng IPv4/IPv6 trong Windows 10/11, thấy IPv6 (::/0) có mức ưu tiên cao hơn IPv4 (::ffff:0:0/96), nên được ưu tiên truy cập.
Cột đầu tiên: mức ưu tiên càng cao thì càng được ưu tiên truy cập.
C:\WINDOWS\system32>netsh interface ipv6 show prefixpolicies<br></br>Truy vấn trạng thái hoạt động...<br></br><br></br>Ưu tiên Nhãn Tiền tố<br></br>---------- ----- --------------------------------<br></br> 50 0 ::1/128<br></br> 40 1 ::/0<br></br> 35 2 ::ffff:0:0/96<br></br> 30 3 2002::/16<br></br> 1 6 ::/96
Điều chỉnh mức ưu tiên mạng tiền tố để ưu tiên IPv4: Từ trước ta biết IPv6 (::/0) ưu tiên hơn IPv4 (::ffff:0:0/96), dùng lệnh netsh interface ipv6 để điều chỉnh mức ưu tiên.
Win + R mở hộp thoại chạy, nhập cmd, chọn chạy với tư cách quản trị viên, thực hiện lệnh điều chỉnh, thấy IPv4 (::ffff:0:0/96) có mức ưu tiên cao nhất.
C:\WINDOWS\system32>netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 100 3<br></br>Xác nhận.<br></br><br></br><br></br>C:\WINDOWS\system32>netsh interface ipv6 show prefixpolicies<br></br>Truy vấn trạng thái hoạt động...<br></br><br></br>Ưu tiên Nhãn Tiền tố<br></br>---------- ----- --------------------------------<br></br> 100 3 ::ffff:0:0/96<br></br> 50 0 ::1/128<br></br> 40 1 ::/0<br></br> 30 3 2002::/16<br></br> 1 6 ::/96
Thực hiện lệnh ping, curl để kiểm chứng, đúng là mặc định ưu tiên IPv4.
Tôi đã thành công điều chỉnh, đạt được ưu tiên IPv4.
C:\Users\yangd>ping localhost<br></br><br></br>Đang Ping F2 [127.0.0.1] với 32 byte dữ liệu:<br></br>Từ 127.0.0.1 trả lời: byte=32 thời gian<1ms TTL=128<br></br>Từ 127.0.0.1 trả lời: byte=32 thời gian<1ms TTL=128<br></br>Từ 127.0.0.1 trả lời: byte=32 thời gian<1ms TTL=128<br></br>Từ 127.0.0.1 trả lời: byte=32 thời gian<1ms TTL=128<br></br><br></br>Thống kê Ping cho 127.0.0.1:<br></br> Gói: Đã gửi = 4, Nhận = 4, Mất = 0 (0% mất),<br></br>Thời gian vòng đời ước tính (tính bằng mili giây):<br></br> Nhỏ nhất = 0ms, lớn nhất = 0ms, trung bình = 0ms
Nhưng khi truy cập http://localhost:20000/member/get/3 bằng Chrome vẫn không được
Truy cập trực tiếp bằng IPv4 http://127.0.0.1:20000/member/get/5 thì được
Nhưng Firefox có thể truy cập http://localhost:20000/member/get/3 thành công, chứng tỏ RemoteAddr:127.0.0.1:20000
# Trong tệp cấu hình gateway application.yml dùng `uri: http://www.baidu.com` + `- Path=/`<br></br># để kiểm tra `- RemoteAddr=127.0.0.1` là địa chỉ của trình duyệt, không phải máy chủ cung cấp dịch vụ<br></br><br></br>server:<br></br> port: 20000<br></br><br></br>spring:<br></br> application:<br></br> name: e-commerce-gateway<br></br> cloud:<br></br> gateway:<br></br> discovery:<br></br> locator:<br></br> # Cờ bật tích hợp DiscoveryClient<br></br> # Bật phát hiện dịch vụ<br></br> enabled: true<br></br> routes: #Cấu hình route, có thể cấu hình nhiều route,List<RouteDefinition> routes<br></br> - id: member_route01 #ID route, do lập trình viên tự cấu hình, yêu cầu duy nhất<br></br> # URL cuối cùng của gateway là url=uri + Path<br></br> # URL của route cung cấp dịch vụ sau khi khớp, cũng có thể là ngoại tuyến http://www.baidu.com<br></br> # Ví dụ: yêu cầu từ client/trình duyệt url http://localhost:20000/member/get/1<br></br> # Nếu khớp Path thành công, URL cuối cùng truy cập/forward là http://localhost:10000/member/get/1<br></br> # Nếu không khớp, gateway trả về thông tin 404<br></br> # Nghi ngờ: uri hiện tại cố định, trong tình huống này không cần Eureka Server[phát hiện dịch vụ]<br></br> # Sau này sẽ dùng cách linh hoạt hơn, dùng Eureka Server[phát hiện dịch vụ]<br></br> #uri: http://localhost:10000<br></br> #Giải thích:<br></br> # 1. lb : tên giao thức, member-service-provider (tên dịch vụ đăng ký trong Eureka-Server [viết thường])<br></br> # 2. Mặc định, thuật toán cân bằng tải là vòng tròn<br></br># uri: lb://member-service-provider<br></br> # Dùng `uri: http://www.baidu.com` + `- Path=/`<br></br> # để kiểm tra `- RemoteAddr=127.0.0.1` là địa chỉ trình duyệt, không phải máy chủ cung cấp dịch vụ<br></br> uri: http://www.baidu.com<br></br> predicates: #Điều kiện, có thể nhiều dạng <br></br> - Path=/ <br></br> # Firefox có thể truy cập http://localhost:20000/member/get/3 thành công<br></br> # Chứng tỏ trong Firefox RemoteAddr:127.0.0.1:20000<br></br> - RemoteAddr=127.0.0.1<br></br> <br></br><br></br><br></br>
Khởi động lại máy, vẫn ưu tiên IPv6.
Kiểm tra mức ưu tiên truy cập mạng tiền tố, thấy chỉ còn IPv4, có thể vì thế không hiệu lực, thêm lại tiền tố IPv6, ưu tiên IPv4, đạt được mục tiêu.
C:\Windows\system32>netsh interface ipv6 show prefixpolicies<br></br>Truy vấn trạng thái hoạt động...<br></br> <br></br>Ưu tiên Nhãn Tiền tố<br></br>---------- ----- --------------------------------<br></br> 100 4 ::ffff:0:0/96<br></br> <br></br>C:\Windows\system32>netsh interface ipv6 add prefixpolicy ::/0 40 1<br></br>Xác nhận.<br></br> <br></br> <br></br>C:\Windows\system32>netsh interface ipv6 show prefixpolicies<br></br>Truy vấn trạng thái hoạt động...<br></br> <br></br>Ưu tiên Nhãn Tiền tố<br></br>---------- ----- --------------------------------<br></br> 100 4 ::ffff:0:0/96<br></br> 40 1 ::/0
Làm thế nào để đặt lại mức ưu tiên IPv6 truy cập? Hai cách, trực tiếp đặt lại
Đặt lại chính sách IPv6
C:\Windows\system32>netsh interface ipv6 reset<br></br>Đang đặt lại phân đoạn chuyển tiếp, hoàn tất!<br></br>Đang đặt lại phân đoạn, hoàn tất!<br></br>Đang đặt lại giao thức điều khiển, hoàn tất!<br></br>Đang đặt lại yêu cầu echo, hoàn tất!<br></br>Đang đặt lại toàn cục, hoàn tất!<br></br>Đang đặt lại giao diện, hoàn tất!<br></br>Đang đặt lại địa chỉ broadcast tùy ý, hoàn tất!<br></br>Đang đặt lại địa chỉ multicast, hoàn tất!<br></br>Đang đặt lại địa chỉ unicast, hoàn tất!
Khởi động lại máy để hoàn tất thao tác.
10 Trong quy tắc giảm lỗi của Sentinel, "ngưỡng tỷ lệ yêu cầu chậm", "ngưỡng tỷ lệ" được đặt là 0 có nghĩa là gì?
Tham khảo https://sentinelguard.io/zh-cn/docs/circuit-breaking.html để hiểu rõ, ảnh chụp màn hình cho thấy ngưỡng tỷ lệ là gì?
[GPT]WebPilot
Trong quy tắc giảm lỗi của Sentinel, "ngưỡng tỷ lệ yêu cầu chậm" (slowRatioThreshold) là một tham số hoạt động trong chế độ tỷ lệ yêu cầu chậm (SLOW_REQUEST_RATIO). Tham số này dùng để xác định điều kiện kích hoạt giảm lỗi. Cụ thể:
- Khi thời gian phản hồi của yêu cầu lớn hơn thời gian phản hồi yêu cầu chậm đã thiết lập (RT), yêu cầu này sẽ được thống kê là yêu cầu chậm.
- Nếu trong khoảng thời gian thống kê (do tham số
statIntervalMsxác định), tổng số yêu cầu vượt quá lượng yêu cầu tối thiểu (do tham sốminRequestAmountxác định), và tỷ lệ yêu cầu chậm vượt quá ngưỡng tỷ lệ yêu cầu chậm, thì sẽ kích hoạt giảm lỗi. - Một khi giảm lỗi được kích hoạt, hệ thống sẽ từ chối tất cả yêu cầu trong khoảng thời gian giảm lỗi (do tham số
timeWindowxác định) để ngăn chặn dịch vụ không ổn định làm cạn kiệt tài nguyên hệ thống.
Ví dụ, nếu ngưỡng tỷ lệ yêu cầu chậm được thiết lập là 0.5 (hoặc 50%), trong khoảng thời gian thống kê, nếu tỷ lệ yêu cầu chậm vượt quá 50% tổng số yêu cầu, bộ giảm lỗi sẽ kích hoạt.
Trong ảnh chụp màn hình bạn cung cấp, ô nhập "ngưỡng tỷ lệ" được đặt là 0, giá trị này trong cấu hình thực tế cần điều chỉnh phù hợp với tình hình thực tế để kích hoạt cơ chế bảo vệ giảm lỗi một cách chính xác.
You
"ngưỡng tỷ lệ" được đặt là 0 có nghĩa là gì?
[GPT]WebPilot
Trong quy tắc giảm lỗi của Sentinel, đặt "ngưỡng tỷ lệ" là 0 có nghĩa là, bất kể tỷ lệ, chỉ cần có một yêu cầu có thời gian phản hồi vượt quá thời gian phản hồi yêu cầu chậm (RT) đã thiết lập, sẽ kích hoạt cơ chế giảm lỗi. Đây là cấu hình rất nghiêm ngặt, đặt mức độ dung sai cực thấp, vì bất kỳ yêu cầu chậm nào cũng sẽ kích hoạt giảm lỗi. Cấu hình này có thể phù hợp với các môi trường yêu cầu phản hồi cực kỳ nhạy cảm, nhưng trong hầu hết các trường hợp, có thể quá nhạy cảm gây ra giảm lỗi không cần thiết, do đó cần thiết lập ngưỡng hợp lý dựa trên nhu cầu nghiệp vụ và chỉ số hiệu suất thực tế.
Khi "ngưỡng tỷ lệ" được đặt là 0, trong khoảng thời gian thống kê, chỉ cần có một yêu cầu có thời gian phản hồi vượt quá RT đã thiết lập, và tổng số yêu cầu đã đạt ngưỡng yêu cầu tối thiểu (ở đây là 5), thì dù chỉ là một yêu cầu chậm cũng sẽ kích hoạt giảm lỗi.
Điều này có nghĩa là, nếu năm yêu cầu đầu tiên đều có thời gian phản hồi nhanh, mà yêu cầu thứ sáu chậm, sẽ kích hoạt giảm lỗi vì đã đáp ứng điều kiện số lượng yêu cầu tối thiểu, và tỷ lệ yêu cầu chậm (1/6) vượt quá ngưỡng tỷ lệ được thiết lập (0%).
11 Ví dụ về các chế độ kiểm soát lưu lượng của Sentinel: trực tiếp, liên quan, chuỗi
Sentinel là một thành phần kiểm soát lưu lượng phổ biến trong Java, dùng để đảm bảo ổn định và đáng tin cậy của ứng dụng. Nó cung cấp ba chế độ kiểm soát lưu lượng: trực tiếp, liên quan và chuỗi. Dưới đây là mô tả và ví dụ cho từng chế độ:
- Chế độ trực tiếp:
- Định nghĩa: Khi tần suất hoặc số lượng đồng thời truy cập một API đạt đến ngưỡng đã định, Sentinel sẽ trực tiếp giới hạn lưu lượng cho API đó.
- Ví dụ: Thiết lập một API chỉ được truy cập tối đa 100 lần mỗi giây. Khi tần suất vượt quá giới hạn, Sentinel sẽ chặn các yêu cầu thêm.
- Chế độ liên quan:
- Định nghĩa: Khi một tài nguyên liên quan (không phải tài nguyên hiện tại) đạt đến ngưỡng, Sentinel sẽ giới hạn lưu lượng cho tài nguyên hiện tại. Phù hợp với tình huống hai tài nguyên có mối liên hệ.
- Ví dụ: Giả sử có hai API, API A và API B. Có thể thiết lập khi tần suất truy cập API B vượt quá 100 lần mỗi giây, thì giới hạn truy cập API A. Dù tần suất truy cập API A không đạt điều kiện giới hạn, nhưng do API B truy cập nhiều, API A cũng sẽ bị giới hạn.
- Chế độ chuỗi:
- Định nghĩa: Giới hạn lưu lượng dựa trên nguồn gốc hoặc chuỗi (đường dẫn) của yêu cầu. Nếu yêu cầu đến từ một nguồn cụ thể hoặc đường dẫn nhất định và đạt đến ngưỡng, sẽ kích hoạt giới hạn lưu lượng.
- Ví dụ: Giả sử có một API C, nó có thể được gọi trực tiếp từ dịch vụ bên ngoài hoặc là gọi con từ API D. Có thể chỉ giới hạn lưu lượng khi API C được gọi từ API D, ví dụ mỗi giây gọi từ API D đến API C vượt quá 50 lần, trong khi các gọi trực tiếp khác không bị giới hạn.
12 Tài liệu về lưu trữ quy tắc cấu hình của sentinel+nacos: https://sentinelguard.io/zh-cn/docs/basic-api-resource-rule.html
13 Phương thức đánh dấu bằng @Bean có thể có tham số
Trong framework Spring, phương thức được đánh dấu bằng @Bean có thể có tham số, những tham số này biểu thị các phụ thuộc của Bean. Container Spring sẽ tự động tìm các instance phù hợp để tiêm vào. Đây là một phần quan trọng của chức năng tiêm phụ thuộc (Dependency Injection, DI) trong Spring. Cụ thể:
- Tìm kiếm Bean phù hợp để tiêm:
- Khi container Spring tạo một Bean định nghĩa bởi phương thức được đánh dấu bằng
@Bean, nó sẽ kiểm tra các tham số của phương thức này. - Với mỗi tham số, container Spring sẽ tìm kiếm Bean phù hợp với kiểu dữ liệu tham số trong các Bean đang được quản lý.
- Nếu tìm thấy Bean phù hợp, container Spring sẽ tiêm Bean đó vào như tham số.
- Xử lý nhiều Bean cùng loại:
- Nếu có nhiều Bean cùng loại có sẵn, container Spring cần thông tin bổ sung để xác định sử dụng cái nào. Điều này có thể thực hiện bằng cách chỉ định tên Bean hoặc dùng các bộ lọc khác như chú thích
@Qualifier.
- Hành vi khi không tìm thấy Bean phù hợp:
- Nếu container Spring không thể tìm thấy Bean phù hợp để tiêm, thường sẽ ném ra ngoại lệ, vì điều này thường biểu thị lỗi cấu hình hoặc Bean cần thiết chưa được định nghĩa.
- Sử dụng
@ConfigurationPropertiesđể kiểm soát chi tiết:
- Đôi khi bạn có thể thấy sử dụng
@ConfigurationPropertiescùng với@Bean. Điều này dùng để ràng buộc các cấu hình bên ngoài (như thuộc tính trong tệp thuộc tính) vào thuộc tính của Bean, kiểm soát cấu hình Bean một cách tinh vi hơn.
Tóm lại, cơ chế tiêm phụ thuộc của @Bean giúp quản lý và cấu hình Bean trong Spring trở nên linh hoạt và mạnh mẽ hơn.