前段日子,就有个想法,打算翻译一些关于SpringBoot的文档资料。后来在学习SpringBoot中,无意发现一本SpringBoot与SpringCloud微服务架构入门级的书籍,感觉不错,决定拿它作为我职业生涯翻译的第一本技术书。
《A Microservice Architecture with Spring Boot and Spring Cloud》,一个由SpringBoot与SpringCloud组成的微服务架构,该书籍来源Baeldung 网站,各位可以常去该网站浏览,里面有大量关于Spring家族的文档资料。
由于个人不是专业翻译,过程中难免有谬误之处,如果发现任何语句翻译错误,请在我的博客留言,我会尽快处理。
目录:
- 概述
- 资源
- REST API
- 安全配置
- SpringCloud配置
5.1服务配置
5.2服务发现
5.3网关服务
5.4REST APIs - 会话配置
- REST API测试
- 运行
- 总结
概述
在本指南中,我们将专注于建立一个简单且正常运行,由Spring Boot和Spring Cloud组建的微服务体系结构。
如果你想进一步深入到Spring Cloud,可点击查看我们的Spring Cloud文章。
我们要在这里根据书本内容开始构建的一个简单的应用程序。 我们从两个REST API开始:
- Book API
- Rating API
资源
首先,我们看看Boot类:
public class Book {
private long id;
private String title;
private String author;
// standard getters and setters
}
和Rating类,用来构建第二个API:
public class Rating {
private long id;
private Long bookId;
private int stars;
// standard getters and setters
}
REST API
现在,我们将构建两个简单的API - / books和/ rating。
首先,我们来查看/ books API:
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
@GetMapping
public List<Book> findAllBooks() {
return bookService.findAllBooks();
}
@GetMapping("/{bookId}")
public Book findBook(@PathVariable Long bookId) {
return bookService.findBookById(bookId);
}
@PostMapping
public Book createBook(@RequestBody Book book) {
return bookService.createBook(book);
}
@DeleteMapping("/{bookId}")
public void deleteBook(@PathVariable Long bookId) {
bookService.deleteBook(bookId);
}
@PutMapping("/{bookId}")
public Book updateBook(@RequestBody Book book, @PathVariable Long bookId) {
return bookService.updateBook(book, bookId);
}
@PatchMapping("/{bookId}")
public Book updateBook(@RequestBody Map<String, String> updates, @PathVariable Long bookId) {
return bookService.updateBook(updates, bookId);
}
}
同样地,看看/ ratings API和RantingController:
@RestController
@RequestMapping("/ratings")
public class RatingController {
@Autowired
private RatingService ratingService;
@GetMapping
public List<Rating> findRatingsByBookId(@RequestParam(required = false, defaultValue = "0") Long bookId) {
if(bookId.equals(0L)) {
return ratingService.findAllRatings();
}
return ratingService.findRatingsByBookId(bookId);
}
@PostMapping
public Rating createRating(@RequestBody Rating rating) {
return ratingService.createRating(rating);
}
@DeleteMapping("/{ratingId}")
public void deleteRating(@PathVariable Long ratingId) {
ratingService.deleteRating(ratingId);
}
@PutMapping("/{ratingId}")
public Rating updateRating(@RequestBody Rating rating, @PathVariable Long ratingId){
return ratingService.updateRating(rating, ratingId);
}
@PatchMapping("/{ratingId}")
public Rating updateRating(@RequestBody Map<String, String> updates, @PathVariable Long ratingId) {
return ratingService.updateRating(updates, ratingId);
}
}
请注意,在这里我们并不关注持久性 - 主要重点是让API接口暴露出来。
这些API中的每一个都有自己的单独的引导程序,而且其部署完全独立于其他任何东西。
当在本地部署时,API将可在以下位置获得:
http://localhost:8080/book-service/books
http://localhost:8080/rating-service/ratings