paint-brush
Cách rút ngắn URL: Hướng dẫn từng bước về Java và Springtừ tác giả@marinsborg
3,999 lượt đọc
3,999 lượt đọc

Cách rút ngắn URL: Hướng dẫn từng bước về Java và Spring

từ tác giả marinsborg2022/06/06
Read on Terminal Reader
Read this story w/o Javascript

dài quá đọc không nổi

Trình rút ngắn URL được triển khai với Java và Spring Boot. Hướng dẫn bao gồm mọi thứ - các yêu cầu chức năng và phi chức năng, chuyển đổi base64 là gì, cách tạo một dự án mới và cách triển khai tất cả các bước cho trình rút gọn URL. Cuối cùng là giải thích cách làm đặc dung dịch.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Cách rút ngắn URL: Hướng dẫn từng bước về Java và Spring
marinsborg HackerNoon profile picture


Việc triển khai dịch vụ rút gọn URL không phải là một nhiệm vụ phức tạp và nó thường là một phần của các cuộc phỏng vấn thiết kế hệ thống . Trong bài đăng này, tôi sẽ cố gắng giải thích quá trình thực hiện dịch vụ. Công cụ rút gọn URL là một dịch vụ được sử dụng để tạo các liên kết ngắn từ các URL rất dài.


Thông thường, các liên kết ngắn có kích thước bằng một phần ba hoặc thậm chí một phần tư URL gốc, điều này giúp chúng ta dễ dàng nhập, trình bày hoặc tweet hơn. Nhấp vào liên kết ngắn, người dùng sẽ được tự động chuyển hướng đến URL ban đầu. Có rất nhiều dịch vụ rút ngắn URL có sẵn trực tuyến, như tiny.cc, bitly.com, cutt.ly, v.v.


Học thuyết

Trước khi thực hiện, bạn nên viết ra những gì cần thực hiện dưới dạng các yêu cầu chức năng và phi chức năng.


Yêu cầu chức năng

  • Người dùng cần có thể nhập một URL dài. Dịch vụ của chúng tôi sẽ lưu URL đó và tạo một liên kết ngắn.
  • Nhấp vào liên kết ngắn sẽ chuyển hướng người dùng đến URL dài ban đầu.
  • Người dùng nên có tùy chọn để nhập ngày hết hạn. Sau khi ngày đó trôi qua, liên kết rút gọn sẽ không hợp lệ.
  • Người dùng nên tạo tài khoản để sử dụng dịch vụ. Các dịch vụ có thể có giới hạn sử dụng cho mỗi người dùng (tùy chọn)
  • Người dùng được phép tạo liên kết ngắn của riêng mình- Dịch vụ phải có chỉ số, ví dụ: các liên kết được truy cập nhiều nhất (tùy chọn)


những yêu cầu phi lý

  • Dịch vụ phải hoạt động 100% thời gian
  • Việc chuyển hướng không được kéo dài hơn hai giây


Chuyển đổi URL

Giả sử rằng chúng ta muốn có một liên kết ngắn với độ dài tối đa là 7. Điều quan trọng nhất trong trình rút gọn URL là thuật toán chuyển đổi. Chuyển đổi URL có thể được thực hiện theo nhiều cách khác nhau và mỗi cách đều có ưu và nhược điểm.


Một cách để tạo liên kết ngắn là băm URL gốc bằng một số hàm băm (ví dụ: MD5 hoặc SHA-2 ). Khi sử dụng hàm băm, chắc chắn rằng các đầu vào khác nhau sẽ dẫn đến các đầu ra khác nhau. Kết quả của hàm băm dài hơn bảy ký tự, vì vậy chúng tôi sẽ cần lấy bảy ký tự đầu tiên. Tuy nhiên, trong trường hợp này, có thể xảy ra va chạm vì bảy ký tự đầu tiên đã có thể được sử dụng như một liên kết ngắn. Sau đó, chúng tôi lấy bảy ký tự tiếp theo, cho đến khi chúng tôi tìm thấy một liên kết ngắn không được sử dụng.


Cách thứ hai để tạo liên kết ngắn là sử dụng UUID . Xác suất để một UUID bị trùng lặp không phải là 0, nhưng nó đủ gần với 0 để không đáng kể. Vì một UUID có 36 ký tự, điều đó có nghĩa là chúng ta gặp vấn đề tương tự như trên. Chúng ta nên lấy bảy ký tự đầu tiên và kiểm tra xem sự kết hợp đó đã được sử dụng chưa.


Tùy chọn thứ ba sẽ là chuyển đổi các số từ cơ số 10 sang cơ số 62. Cơ số là một số chữ số hoặc ký tự có thể được sử dụng để biểu diễn một số cụ thể. Cơ số 10 là các chữ số [0-9] mà chúng ta sử dụng trong cuộc sống hàng ngày và cơ số 62 là [0-9] [az] [AZ]. Điều này có nghĩa là, ví dụ, một số trong cơ số 10 có bốn chữ số sẽ giống như một số trong cơ số 62 nhưng có hai ký tự.


Sử dụng cơ sở 62 trong chuyển đổi URL với độ dài tối đa là bảy ký tự cho phép chúng tôi có 62 ^ 7 giá trị duy nhất cho các liên kết ngắn.


Vậy cơ số 62 chuyển đổi hoạt động như thế nào?

Chúng tôi có một số cơ số 10 mà chúng tôi muốn chuyển đổi thành cơ số 62. Chúng tôi sẽ sử dụng thuật toán sau:


 while(number > 0) remainder = number % 62 number = number / 62 attach remainder to start of result collection


Sau đó, chúng ta chỉ cần ánh xạ các số từ tập hợp kết quả vào cơ số 62 Bảng chữ cái = [0,1,2,…, a, b, c…, A, B, C,…].


Hãy xem cách này hoạt động như thế nào với một ví dụ thực tế. Trong ví dụ này, hãy chuyển đổi 1000 từ cơ số 10 thành cơ số 62.


 1st iteration: number = 1000 remainder = 1000 % 62 = 8 number = 1000 / 62 = 16 result list = [8] 2nd iteration: number = 16 remainder = 16 % 62 = 16 number = 16 / 62 = 0 result list = [16,8] There is no more iterations since number = 0 after 2nd iteration


Ánh xạ [16,8] với cơ số 62 sẽ là g8. Điều này có nghĩa là 1000base10 = g8base62.


Việc chuyển đổi từ cơ số 62 sang cơ số 10 cũng rất đơn giản:


 i = 0 while(i < inputString lenght) counter = i + 1 mapped = base62alphabet.indexOf(inputString[i]) // map character to number based on its index in alphabet result = result + mapped * 62^(inputString lenght - counter) i++


Ví dụ thực tế:


 inputString = g8 inputString length = 2 i = 0 result = 0 1st iteration counter = 1 mapped = 16 // index of g in base62alphabet is 16 result = 0 + 16 * 62^1 = 992 2nd iteration counter = 2 mapped = 8 // index of 8 in base62alphabet is 8 result = 992 + 8 * 62^1 = 1000


Thực hiện

Lưu ý: Toàn bộ giải pháp đều có trên Github của tôi. Tôi đã triển khai dịch vụ này bằng cách sử dụng Spring Boot và MySQL.


Chúng tôi sẽ sử dụng tính năng tự động tăng dần của cơ sở dữ liệu của chúng tôi. Số tự động tăng dần sẽ được sử dụng cho chuyển đổi cơ số 62. Bạn có thể sử dụng bất kỳ cơ sở dữ liệu nào khác có tính năng tăng tự động.


Đầu tiên, hãy truy cập Spring initializr và chọn Spring Web và MySql Driver. Sau đó, nhấp vào nút Tạo và tải xuống tệp zip. Giải nén tệp và mở dự án trong IDE yêu thích của bạn. Mỗi khi tôi bắt đầu một dự án mới, tôi muốn tạo một số thư mục để phân chia mã của mình một cách hợp lý. Các thư mục của tôi trong trường hợp này là controller, entity, service, repository, dto và config.


Bên trong thư mục thực thể, hãy tạo một lớp Url.java với bốn thuộc tính: id, longUrl, createdDate, expiresDate.


Lưu ý rằng không có thuộc tính liên kết ngắn. Chúng tôi sẽ không lưu các liên kết ngắn. Chúng tôi sẽ chuyển đổi thuộc tính id từ cơ sở 10 sang cơ sở 62 mỗi khi có yêu cầu GET. Bằng cách này, chúng tôi đang tiết kiệm không gian trong cơ sở dữ liệu của mình.


Thuộc tính LongUrl là URL mà chúng ta nên chuyển hướng đến khi người dùng truy cập vào một liên kết ngắn. Ngày được tạo chỉ để xem khi nào longUrl được lưu (không quan trọng) và hết hạn


Tiếp theo, hãy tạo một BaseService .java trong thư mục dịch vụ. BaseService chứa các phương thức để chuyển đổi từ cơ sở 10 sang cơ sở 62 và ngược lại.


 private static final String allowedString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private char[] allowedCharacters = allowedString.toCharArray(); private int base = allowedCharacters.length;


Như tôi đã đề cập trước đây, nếu chúng ta muốn sử dụng chuyển đổi cơ số 62, chúng ta cần có bảng chữ cái cơ số 62, trong trường hợp này, được gọi là allowCharacters. Ngoài ra, giá trị của biến cơ sở được tính từ độ dài của các ký tự được phép trong trường hợp chúng ta muốn thay đổi các ký tự được phép.


Phương thức mã hóa lấy một số làm đầu vào và trả về một liên kết ngắn. Phương thức giải mã lấy một chuỗi (liên kết ngắn) làm đầu vào và trả về một số. Các thuật toán nên được thực hiện như đã giải thích ở trên.


Sau đó, bên trong thư mục kho lưu trữ, chúng ta hãy tạo tệp UrlRepository .java , đây chỉ là một phần mở rộng của JpaRepository và nó cung cấp cho chúng ta rất nhiều phương thức như 'findById', 'save', v.v. Chúng ta không cần thêm bất cứ thứ gì khác đến điều này.


Sau đó, hãy tạo một tệp UrlController.java trong thư mục bộ điều khiển. Bộ điều khiển phải có một phương thức POST để tạo liên kết ngắn và một phương thức GET để chuyển hướng đến URL ban đầu.


 @PostMapping("create-short") public String convertToShortUrl(@RequestBody UrlLongRequest request) { return urlService.convertToShortUrl(request); } @GetMapping(value = "{shortUrl}") public ResponseEntity<Void> getAndRedirect(@PathVariable String shortUrl) { var url = urlService.getOriginalUrl(shortUrl); return ResponseEntity.status(HttpStatus.FOUND) .location(URI.create(url)) .build(); }


Phương thức POST có UrlLongRequest làm phần thân yêu cầu của nó. Nó chỉ là một lớp với các thuộc tính longUrl và expiresDate.


Phương thức GET lấy một URL ngắn làm biến đường dẫn, sau đó lấy và chuyển hướng đến URL ban đầu. Ở đầu bộ điều khiển, UrlService được đưa vào như một phần phụ thuộc, điều này sẽ được giải thích tiếp theo.


UrlService .java là nơi chứa hầu hết logic và là dịch vụ được bộ điều khiển sử dụng.


ConvertToShortUrl được sử dụng bởi phương thức POST từ bộ điều khiển. Nó chỉ tạo một bản ghi mới trong cơ sở dữ liệu và nhận một ID. Sau đó, ID được chuyển đổi thành liên kết ngắn cơ sở 62 và được trả về bộ điều khiển.


GetOriginalUrl là một phương thức được sử dụng bởi phương thức GET từ bộ điều khiển. Đầu tiên, nó chuyển đổi một chuỗi thành cơ số 10 và kết quả của đó là một id. Sau đó, nó nhận một bản ghi từ cơ sở dữ liệu với id đó và ném một ngoại lệ nếu nó không tồn tại. Sau đó, nó trả về URL ban đầu cho bộ điều khiển.


'Chủ đê nâng cao

Trong phần này, tôi sẽ nói về tài liệu swagger , dày đặc ứng dụng, bộ đệm ứng dụng và sự kiện đã lên lịch MySql.


Giao diện người dùng Swagger

Mỗi khi bạn phát triển một API, bạn nên ghi lại nó theo một cách nào đó. Tài liệu giúp các API dễ hiểu và dễ sử dụng hơn. API cho dự án này được ghi lại bằng giao diện người dùng Swagger.

Swagger UI cho phép mọi người trực quan hóa và tương tác với các tài nguyên của API mà không cần có bất kỳ logic triển khai nào.


Nó được tạo tự động, với tài liệu trực quan giúp dễ dàng triển khai back-end và tiêu thụ phía máy khách.


Có một số bước mà chúng tôi cần thực hiện để đưa giao diện người dùng Swagger vào dự án.

Đầu tiên, chúng ta cần thêm các phụ thuộc Maven vào tệp pom.xml:


 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>


Để tham khảo, bạn có thể xem toàn bộ tệp pom.xml tại đây . Sau khi thêm các phụ thuộc Maven, đã đến lúc thêm cấu hình Swagger. Bên trong thư mục config, chúng ta cần tạo một lớp mới - SwaggerConfig .java


 @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket apiDocket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(metadata()) .select() .apis(RequestHandlerSelectors.basePackage("com.amarin")) .build(); } private ApiInfo metadata(){ return new ApiInfoBuilder() .title("Url shortener API") .description("API reference for developers") .version("1.0") .build(); } }


Ở đầu lớp, chúng ta cần thêm một vài chú thích.

@Configuration chỉ ra rằng một lớp khai báo một hoặc nhiều phương thức @Beans và có thể được xử lý bởi vùng chứa Spring để tạo ra các định nghĩa bean và yêu cầu dịch vụ cho các bean đó trong thời gian chạy.


@ EnableSwagger2 chỉ ra rằng hỗ trợ Swagger nên được bật.


Tiếp theo, chúng ta nên thêm Docket bean cung cấp cấu hình API chính với các giá trị mặc định hợp lý và các phương thức thuận tiện để cấu hình.


Phương thức apiInfo () lấy đối tượng ApiInfo nơi chúng ta có thể cấu hình tất cả thông tin API cần thiết - nếu không, nó sử dụng một số giá trị mặc định. Để làm cho mã sạch hơn, chúng ta nên tạo một phương thức private sẽ cấu hình và trả về đối tượng ApiInfo và chuyển phương thức đó làm tham số của phương thức apiInfo () . Trong trường hợp này, nó là phương thức metadata () .


Phương thức apis () cho phép chúng tôi lọc các gói đang được tài liệu hóa.


Giao diện người dùng Swagger được định cấu hình và chúng tôi có thể bắt đầu ghi lại API của mình. Bên trong UrlController , trên mọi điểm cuối, chúng ta có thể sử dụng chú thích @ApiOperation để thêm mô tả. Tùy thuộc vào nhu cầu của bạn, bạn có thể sử dụng một số chú thích khác.


Cũng có thể ghi lại các DTO bằng cách sử dụng @ApiModelProperty , cho phép bạn thêm các giá trị được phép, mô tả, v.v.


Bộ nhớ đệm

Theo Wikipedia, [cache] (https://en.wikipedia.org/wiki/Cache_ (điện toán) là một thành phần phần cứng hoặc phần mềm lưu trữ dữ liệu để các yêu cầu trong tương lai đối với dữ liệu đó có thể được phục vụ nhanh hơn; dữ liệu được lưu trữ trong bộ nhớ cache có thể là kết quả của quá trình tính toán trước đó hoặc bản sao dữ liệu được lưu trữ ở nơi khác.


Loại bộ nhớ đệm được sử dụng thường xuyên nhất là bộ nhớ đệm trong bộ nhớ lưu trữ dữ liệu được lưu trong bộ nhớ đệm trong RAM. Khi dữ liệu được yêu cầu và tìm thấy trong bộ nhớ cache, nó sẽ được cung cấp từ RAM thay vì từ cơ sở dữ liệu. Bằng cách này, chúng tôi tránh gọi phần phụ trợ tốn kém khi người dùng yêu cầu dữ liệu.

Công cụ rút gọn URL là một loại ứng dụng có nhiều yêu cầu đọc hơn yêu cầu ghi, có nghĩa là nó là một ứng dụng lý tưởng để sử dụng bộ nhớ đệm.


Để kích hoạt bộ nhớ đệm trong ứng dụng Spring Boot, chúng ta chỉ cần thêm chú thích @EnableCaching trong lớp UrlShortenerApiApplication .


Sau đó, trong bộ điều khiển , chúng ta cần đặt chú thích @Cachable ở trên phương thức GET. Chú thích này tự động lưu trữ kết quả của phương thức được gọi là bộ đệm. Trong chú thích @Cachable, chúng tôi đặt tham số giá trị là tên của bộ đệm và tham số khóa là khóa bộ đệm.


Trong trường hợp này, đối với khóa bộ nhớ cache, chúng tôi sẽ sử dụng 'shortUrl' vì chúng tôi chắc chắn rằng nó là duy nhất. Các tham số đồng bộ hóa được đặt thành true để đảm bảo chỉ một luồng duy nhất đang xây dựng giá trị bộ nhớ cache.


Và đó là nó - bộ nhớ cache của chúng tôi đã được thiết lập và khi chúng tôi tải URL lần đầu tiên với một số liên kết ngắn, kết quả sẽ được lưu vào bộ nhớ cache và bất kỳ lệnh gọi bổ sung nào đến điểm cuối có cùng một liên kết ngắn sẽ truy xuất kết quả từ bộ nhớ cache thay vì từ cơ sở dữ liệu.


Tài liệu hóa

Dockerization là quá trình đóng gói ứng dụng và các phụ thuộc của nó trong vùng chứa [Docker] (https://en.wikipedia.org/wiki/Docker_ (phần mềm). Sau khi định cấu hình vùng chứa Docker, chúng ta có thể dễ dàng chạy ứng dụng trên bất kỳ máy chủ hoặc máy tính hỗ trợ Docker.

Điều đầu tiên chúng ta cần làm là tạo một Dockerfile.


Dockerfile là một tệp văn bản chứa tất cả các lệnh mà người dùng có thể gọi trên dòng lệnh để lắp ráp một hình ảnh.


 FROM openjdk:13-jdk-alpine COPY ./target/url-shortener-api-0.0.1-SNAPSHOT.jar /usr/src/app/url-shortener-api-0.0.1-SNAPSHOT.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/usr/src/app/url-shortener-api-0.0.1-SNAPSHOT.jar"]


FROM - Đây là nơi chúng tôi đặt hình ảnh cơ sở cho cơ sở xây dựng. Chúng tôi sẽ sử dụng OpenJDK v13, một phiên bản mã nguồn mở và miễn phí của Java. Bạn có thể tìm thấy các hình ảnh khác cho hình ảnh cơ sở của mình tại trung tâm Docker , đây là nơi để chia sẻ hình ảnh docker.


COPY - Lệnh này sao chép tệp từ hệ thống tệp cục bộ (máy tính của bạn) sang hệ thống tệp của vùng chứa theo đường dẫn mà chúng tôi đã chỉ định. Chúng tôi sẽ sao chép tệp JAR từ thư mục đích vào thư mục / usr / src / app trong vùng chứa. Tôi sẽ giải thích việc tạo tệp JAR sau một chút.


EXPOSE - Lệnh thông báo cho Docker rằng vùng chứa lắng nghe các cổng mạng được chỉ định trong thời gian chạy. Giao thức mặc định là TCP và bạn có thể chỉ định xem bạn có muốn sử dụng UDP hay không.


ENTRYPOINT - Hướng dẫn này cho phép bạn định cấu hình một vùng chứa sẽ chạy dưới dạng tệp thực thi. Ở đây chúng ta cần chỉ rõ Docker sẽ chạy hết ứng dụng như thế nào.


Lệnh để chạy một ứng dụng từ tệp .jar là


 java -jar <app_name>.jar


vì vậy chúng tôi đặt 3 từ đó trong một mảng và thế là xong.


Bây giờ chúng ta đã có Dockerfile, chúng ta nên xây dựng hình ảnh từ nó. Nhưng giống như tôi đã đề cập trước đây, trước tiên chúng ta cần tạo tệp .jar từ dự án của mình để lệnh COPY trong Dockerfile có thể hoạt động bình thường. Để tạo .jar có thể thực thi, chúng ta sẽ sử dụng maven .


Chúng tôi cần đảm bảo rằng chúng tôi có Maven bên trong pom .xml của chúng tôi. Nếu thiếu Maven, chúng ta có thể bổ sung


 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>


Sau đó, chúng ta chỉ nên chạy lệnh


 mvn clean package


Sau khi hoàn tất, chúng ta có thể xây dựng hình ảnh Docker. Chúng ta cần đảm bảo rằng chúng ta đang ở trong cùng một thư mục chứa Dockerfile để có thể chạy lệnh này


 docker build -t url-shortener:latest .

-t được sử dụng để gắn thẻ một hình ảnh. Trong trường hợp của chúng tôi, điều đó có nghĩa là tên của kho lưu trữ sẽ là url-shortener và thẻ sẽ là thẻ mới nhất. Gắn thẻ được sử dụng để tạo phiên bản cho hình ảnh. Sau khi lệnh đó được thực hiện, chúng ta có thể đảm bảo rằng chúng ta đã tạo một hình ảnh bằng lệnh

 docker images

Điều đó sẽ cho chúng ta một cái gì đó như thế này

Bước cuối cùng, chúng ta nên xây dựng hình ảnh của mình. Tôi nói hình ảnh bởi vì chúng tôi cũng sẽ chạy máy chủ MySQL trong một vùng chứa docker. Vùng chứa cơ sở dữ liệu sẽ được cách ly với vùng chứa ứng dụng. Để chạy máy chủ MySQL trong bộ chứa docker chỉ cần chạy


 $ docker run --name shortener -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 3306:3306 mysql:8


Bạn có thể xem tài liệu về trung tâm Docker .


Khi chúng ta có một cơ sở dữ liệu đang chạy bên trong một vùng chứa, chúng ta cần định cấu hình ứng dụng của mình để kết nối với máy chủ MySQL đó. Inside application.properties đặt spring.datasource.url để kết nối với vùng chứa 'shortener'.


Vì chúng tôi đã thực hiện một số thay đổi đối với dự án của mình, nên bắt buộc phải đóng gói dự án của chúng tôi thành tệp .jar bằng cách sử dụng Maven và xây dựng lại hình ảnh Docker từ Dockerfile.


Bây giờ chúng ta có một hình ảnh Docker, chúng ta cần chạy vùng chứa của mình. Chúng tôi sẽ làm điều đó với lệnh


 docker run -d --name url-shortener-api -p 8080:8080 --link shortener url-shortener


-d có nghĩa là vùng chứa Docker chạy trong nền của thiết bị đầu cuối của bạn. –Name cho phép bạn đặt tên cho vùng chứa của mình


-p host-port: docker-port - Đây chỉ đơn giản là ánh xạ các cổng trên máy tính cục bộ của bạn với các cổng bên trong vùng chứa. Trong trường hợp này, chúng tôi đã để lộ cổng 8080 bên trong một container và quyết định ánh xạ nó thành cổng địa phương 8080 của chúng tôi.


–Liên kết với điều này, chúng tôi liên kết vùng chứa ứng dụng của mình với vùng chứa cơ sở dữ liệu để cho phép các vùng chứa phát hiện ra nhau và chuyển an toàn thông tin về vùng chứa này sang vùng chứa khác.

Điều quan trọng cần biết là lá cờ này hiện là một di sản và nó sẽ bị loại bỏ trong tương lai gần. Thay vì các liên kết, chúng ta sẽ cần tạo một mạng để tạo điều kiện giao tiếp giữa hai vùng chứa.


url-shortener - là tên của hình ảnh docker mà chúng tôi muốn chạy.


Và với điều này, chúng tôi đã hoàn tất - trong trình duyệt, hãy truy cập http: // localhost: 8080 / swagger-ui.html

Giờ đây, bạn có thể xuất bản hình ảnh của mình lên DockerHub và dễ dàng chạy ứng dụng của mình trên bất kỳ máy tính hoặc máy chủ nào.


Có hai điều nữa tôi muốn nói để cải thiện trải nghiệm Docker của chúng tôi. Một là bản dựng nhiều giai đoạn và phần còn lại là trình soạn thảo cố định.


Xây dựng nhiều giai đoạn

Với các bản dựng nhiều giai đoạn , bạn có thể sử dụng nhiều câu lệnh FROM trong Dockerfile của mình. Mỗi lệnh FROM có thể sử dụng một cơ sở khác nhau và mỗi lệnh bắt đầu một giai đoạn mới của quá trình xây dựng. Bạn có thể sao chép có chọn lọc các hiện vật từ giai đoạn này sang giai đoạn khác, bỏ lại mọi thứ bạn không muốn trong hình ảnh cuối cùng.


Các bản dựng nhiều giai đoạn rất tốt cho chúng tôi để tránh tạo các tệp .jar theo cách thủ công mỗi khi chúng tôi thực hiện một số thay đổi đối với mã của mình. Với các bản dựng nhiều giai đoạn, chúng ta có thể xác định một giai đoạn của bản dựng sẽ thực hiện lệnh gói Maven và giai đoạn còn lại sẽ sao chép kết quả từ bản dựng đầu tiên vào hệ thống tệp của vùng chứa Docker.


Bạn có thể xem Dockerfile hoàn chỉnh tại đây .


Docker-soạn

Soạn là một công cụ để xác định và chạy các ứng dụng Docker nhiều vùng chứa. Với Soạn thư, bạn sử dụng tệp YAML để định cấu hình các dịch vụ của ứng dụng. Sau đó, với một lệnh duy nhất, bạn tạo và khởi động tất cả các dịch vụ từ cấu hình của mình.


Với docker -omp, chúng tôi sẽ đóng gói ứng dụng và cơ sở dữ liệu của mình vào một tệp cấu hình duy nhất và sau đó chạy mọi thứ cùng một lúc. Bằng cách này, chúng tôi tránh chạy vùng chứa MySQL và sau đó liên kết nó với vùng chứa ứng dụng mỗi lần.


Docker- compo .yml khá dễ hiểu - trước tiên, chúng tôi định cấu hình vùng chứa MySQL bằng cách thiết lập hình ảnh mysql v8.0 và thông tin đăng nhập cho máy chủ MySQL. Sau đó, chúng tôi cấu hình vùng chứa ứng dụng bằng cách thiết lập các thông số xây dựng vì chúng tôi cần xây dựng một hình ảnh thay vì kéo nó như đã làm với MySQL. Ngoài ra, chúng ta cần thiết lập rằng vùng chứa ứng dụng phụ thuộc vào vùng chứa MySQL.


Bây giờ chúng ta có thể chạy toàn bộ dự án chỉ với một lệnh:


 docker-compose up


Sự kiện đã lên lịch của MySQL

Phần này là tùy chọn nhưng tôi nghĩ ai đó có thể thấy phần này hữu ích. Tôi đã nói về ngày hết hạn của liên kết ngắn có thể do người dùng xác định hoặc một số giá trị mặc định. Đối với vấn đề này, chúng tôi có thể đặt một sự kiện đã lên lịch bên trong cơ sở dữ liệu của mình. Sự kiện này sẽ chạy x phút một lần và sẽ xóa bất kỳ hàng nào khỏi cơ sở dữ liệu có ngày hết hạn thấp hơn thời gian hiện tại. Đơn giản như thế. Điều này hoạt động tốt trên một lượng nhỏ dữ liệu trong cơ sở dữ liệu.


Bây giờ tôi cần cảnh báo bạn về một số vấn đề với giải pháp này.


  • Đầu tiên - Sự kiện này sẽ xóa các bản ghi khỏi cơ sở dữ liệu nhưng nó sẽ không xóa dữ liệu khỏi bộ đệm. Giống như chúng tôi đã nói trước đây, bộ nhớ cache sẽ không nhìn vào bên trong cơ sở dữ liệu nếu nó có thể tìm thấy dữ liệu phù hợp ở đó. Vì vậy, ngay cả khi dữ liệu không còn tồn tại trong cơ sở dữ liệu vì chúng tôi đã xóa nó, chúng tôi vẫn có thể lấy nó từ bộ nhớ cache.
  • Thứ hai - Trong tập lệnh ví dụ của tôi, tôi đặt sự kiện đó chạy 2 phút một lần. Nếu cơ sở dữ liệu của chúng ta trở nên khổng lồ thì có thể xảy ra trường hợp sự kiện không hoàn thành việc thực thi trong khoảng thời gian lập lịch của nó, kết quả có thể là nhiều trường hợp sự kiện thực thi đồng thời.


Sự kết luận

Tôi hy vọng rằng bài đăng này đã giúp bạn một chút để có được ý tưởng chung về cách tạo dịch vụ rút gọn URL. Bạn có thể lấy ý tưởng này và cải thiện nó. Viết ra một số yêu cầu chức năng mới và cố gắng thực hiện chúng. Nếu bạn có bất kỳ câu hỏi nào, bạn có thể gửi chúng dưới bài đăng này.