Tìm hiểu về ngưỡng tự bảo quản và gia hạn Máy chủ Spring Cloud Eureka


82

Tôi chưa quen với việc phát triển microservices, mặc dù tôi đã nghiên cứu về nó một thời gian, đọc cả tài liệu của Spring và Netflix.

Tôi đã bắt đầu một dự án đơn giản có sẵn trên Github . Về cơ bản, nó là một máy chủ Eureka (Archimedes) và ba dịch vụ khách Eureka (một API công khai và hai dịch vụ riêng tư). Kiểm tra readme của github để biết mô tả chi tiết.

Vấn đề là khi mọi thứ đang chạy, tôi muốn rằng nếu một trong các dịch vụ riêng tư bị giết, máy chủ Eureka nhận ra và xóa nó khỏi sổ đăng ký.

Tôi đã tìm thấy câu hỏi này trên Stackoverflow và giải pháp được đưa ra bằng cách sử dụng enableSelfPreservation:falsetrong cấu hình Máy chủ Eureka. Làm điều này sau một thời gian dịch vụ bị giết sẽ biến mất như mong đợi.

Tuy nhiên, tôi có thể thấy thông báo sau:

CHẾ ĐỘ BẢO QUẢN TỰ CHỌN ĐƯỢC TẮT. CÓ THỂ KHÔNG BẢO VỆ HẠN MỨC TRONG TRƯỜNG HỢP MẠNG / CÁC VẤN ĐỀ KHÁC.

1. Mục đích của việc bảo quản bản thân là gì? Tài liệu nói rằng với việc tự bảo quản trên "khách hàng có thể nhận được các phiên bản không tồn tại nữa" . Vậy khi nào thì nên bật / tắt nó?

Hơn nữa, khi bật tính năng tự bảo quản, bạn có thể nhận được một thông báo nổi bật trong cảnh báo bảng điều khiển Máy chủ Eureka:

TRƯỜNG HỢP KHẨN CẤP! EUREKA CÓ THỂ LÊN ĐÚNG CÁCH CẢI TIẾN KHẢ NĂNG LÊN TRONG KHI KHÔNG CÓ. CÁC TIỀN GIA HẠN LÀ ÍT HƠN HỮU HẠN VÀ VÌ CÁC TIỀN NÂNG CAO KHÔNG HẾT HẠN CHỈ LÀ ĐƯỢC AN TOÀN.

Bây giờ, tiếp tục với Spring Eureka Console.

Lease expiration enabled    true/false
Renews threshold    5
Renews (last min)   4

Tôi đã gặp một hành vi kỳ lạ của số ngưỡng: khi tôi khởi động Máy chủ Eureka một mình, ngưỡng là 1.

2. Tôi có một máy chủ Eureka duy nhất và được định cấu hình registerWithEureka: falseđể ngăn nó đăng ký trên máy chủ khác. Sau đó, tại sao nó lại hiển thị trong số ngưỡng?

3. Đối với mỗi khách hàng, tôi bắt đầu số ngưỡng tăng thêm +2. Tôi đoán là do họ gửi 2 tin nhắn gia hạn mỗi phút, đúng không?

4. Máy chủ Eureka không bao giờ gửi gia hạn nên số lần gia hạn tối thiểu cuối cùng luôn ở dưới ngưỡng. Điều này có bình thường không?

renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4

Máy chủ cfg:

server:
  port: ${PORT:8761}

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enableSelfPreservation: false
#   waitTimeInMsWhenSyncEmpty: 0

Khách hàng 1 cfg:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true

3
Tôi muốn dành thời gian để trả lời câu hỏi này. Nó phức tạp lắm. Một số câu trả lời nằm trong mã Netflix và câu trả lời khác là cấu hình. Tôi muốn câu trả lời của mình kết thúc như một phần của tài liệu Spring Cloud, nhưng nó có thể sẽ diễn ra sau Lễ Tạ ơn trừ khi các đồng nghiệp của tôi trả lời trước đó.
spencergibb

Đây là một chút thông tin cơ bản từ Netflix: github.com/Netflix/eureka/wiki/…
spencergibb

Dưới đây là một số nền tảng hơn: github.com/spring-cloud/spring-cloud-netflix/issues/373
spencergibb

8
@spencergibb này là gần 9 tháng và không có câu trả lời .. bất kỳ đầu vào?
Nick

1
@spencergibb Bây giờ đã hơn một năm. Vẫn còn cơ hội để nhận được câu trả lời rõ ràng bất cứ lúc nào? Một số loại quà tặng giáng sinh :)
OcuS

Câu trả lời:


62

Tôi nhận được câu hỏi tương tự như @codependent đã gặp, tôi đã tìm kiếm rất nhiều và thực hiện một số thử nghiệm, ở đây tôi đến để đóng góp một số kiến ​​thức về cách hoạt động của máy chủ và phiên bản Eureka.

Mỗi phiên bản cần phải gia hạn hợp đồng thuê của nó với Máy chủ Eureka với tần suất một lần mỗi 30 giây, có thể được xác định trong eureka.instance.leaseRenewalIntervalInSeconds.

Gia hạn (phút cuối cùng) : đại diện cho số lần gia hạn nhận được từ phiên bản Eureka trong phút trước

Ngưỡng gia hạn : số lần gia hạn mà máy chủ Eureka mong đợi nhận được từ cá thể Eureka mỗi phút.

Ví dụ, nếu registerWithEurekađược đặt thành sai , eureka.instance.leaseRenewalIntervalInSecondsđược đặt thành 30 và chạy 2 phiên bản Eureka. Hai cá thể Eureka sẽ gửi 4 lần gia hạn đến máy chủ Eureka mỗi phút, ngưỡng tối thiểu của máy chủ Eureka là 1 (được viết bằng mã), do đó ngưỡng là 5 (con số này sẽ nhân với một hệ số eureka.server.renewalPercentThresholdsẽ được thảo luận sau).

CHẾ ĐỘ TỰ BẢO QUẢN : nếu Số lần gia hạn (phút cuối) nhỏ hơn ngưỡng Gia hạn , chế độ tự bảo quản sẽ được kích hoạt.

Vì vậy, trong ví dụ trên, CHẾ ĐỘ TỰ BẢO QUẢN được kích hoạt, vì ngưỡng là 5, nhưng máy chủ Eureka chỉ có thể nhận 4 lần gia hạn / phút.

  1. Câu hỏi 1:

CHẾ ĐỘ TỰ BẢO QUẢN được thiết kế để tránh lỗi kết nối mạng kém. Khả năng kết nối giữa Eureka instance A và B là tốt, nhưng B không thể gia hạn hợp đồng thuê với máy chủ Eureka trong thời gian ngắn do trục trặc kết nối, tại thời điểm này, máy chủ Eureka không thể chỉ khởi chạy phiên bản B. Nếu có, ví dụ A sẽ không nhận được dịch vụ đã đăng ký từ máy chủ Eureka mặc dù B có sẵn. Vì vậy, đây là mục đích của CHẾ ĐỘ TỰ BẢO QUẢN, và tốt hơn là bạn nên bật chế độ này lên.

  1. Câu hỏi 2:

Ngưỡng tối thiểu 1 được viết trong mã. registerWithEurekađược đặt thành false nên sẽ không có thanh ghi cá thể Eureka nào, ngưỡng sẽ là 1.

Trong môi trường sản xuất, chúng tôi thường triển khai hai máy chủ Eureka và registerWithEurekasẽ được đặt thành true. Vì vậy, ngưỡng sẽ là 2 và máy chủ Eureka sẽ gia hạn thuê cho chính nó hai lần / phút, vì vậyRENEWALS ARE LESSER THAN THRESHOLD sẽ không có vấn đề gì.

  1. Câu hỏi 3:

Vâng, bạn đã đúng. eureka.instance.leaseRenewalIntervalInSecondsxác định số lần gia hạn được gửi đến máy chủ mỗi phút, nhưng nó sẽ nhân với một hệ số eureka.server.renewalPercentThresholdđược đề cập ở trên, giá trị mặc định là 0,85.

  1. Câu hỏi 4:

Có, điều đó là bình thường, vì giá trị ban đầu của ngưỡng được đặt thành 1. Vì vậy, nếu registerWithEureka được đặt thành sai, số lần gia hạn luôn dưới ngưỡng.

Tôi có hai gợi ý cho điều này:

  1. Triển khai hai máy chủ Eureka và bật registerWithEureka .
  2. Nếu bạn chỉ muốn triển khai trong môi trường demo / dev, bạn có thể đặt eureka.server.renewalPercentThresholdthành 0,49, vì vậy khi bạn khởi động một máy chủ Eureka, ngưỡng sẽ là 0.

Hi Nie Xing, bạn có biết ý nghĩa của Label là gì: "hết hạn thuê được kích hoạt:"
jabrena

Xin chào @jabrena, tôi nghĩ điều đó có nghĩa là hợp đồng thuê sẽ hết hạn nếu phiên bản không gia hạn hợp đồng thuê máy chủ eureka. Nó có thể liên quan đến eureka.instance.leaseExpirationDurationInSeconds mà giá trị là 90 giây theo mặc định. Nếu bạn đặt giá trị này thành 0 hoặc một số âm, nhãn có thể chuyển thành "Đã bật hết hạn hợp đồng thuê: Sai". Bạn có thể dùng thử.
Nie Xing

bạn có thể trả lời điều này stackoverflow.com/questions/48437752/…
Ankit Bansal

Không hoạt động. Threshold = 0, Renews = 0 vẫn kích hoạt cảnh báo.
SledgeHammer

Tôi đã vô hiệu hóa SelfPreservationMode nhưng vẫn nhận được thông báo này trên Eureka - EUREKA CÓ THỂ ĐÚNG ĐÚNG CÁC CẢI TIẾN KHIẾU NẠI TĂNG KHI KHÔNG CÓ. CÁC TIỀN GIA HẠN LÀ ÍT HƠN HỮU HẠN VÀ VÌ CÁC TIỆN NGHI KHÔNG HẾT HẠN CHỈ LÀ ĐƯỢC AN TOÀN. Nó không nên xảy ra phải không?
DHRUV BANSAL

31

Tôi đã tạo một bài đăng trên blog với các chi tiết của Eureka ở đây , sẽ điền vào một số chi tiết còn thiếu từ tài liệu Spring hoặc blog Netflix. Nó là kết quả của nhiều ngày gỡ lỗi và đào qua mã nguồn. Tôi hiểu rằng nên sao chép-dán hơn là liên kết đến một URL bên ngoài, nhưng nội dung quá lớn đối với một câu trả lời SO.


2
Cảm ơn bạn đã liên kết một bài viết rõ ràng như vậy. Nên đọc !!
codependent

2
Xin chào @Abhijit Sarkar, bài viết thật tuyệt vời. Tôi đã giải quyết nhiều nghi ngờ về cấu hình.
jabrena

0

Bạn có thể thử đặt giới hạn ngưỡng gia hạn trong thuộc tính máy chủ eureka của mình. Nếu bạn có khoảng 3 đến 4 Microservices để đăng ký trên eureka, thì bạn có thể đặt nó thành như sau:

eureka.server.renewalPercentThreshold=0.33
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.