新聞中心
審校 | 孫淑娟

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比祁縣網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式祁縣網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務覆蓋祁縣地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。
在超快系列的第二部分中,你將學習一個新的數(shù)據(jù)庫,該數(shù)據(jù)庫可以使你的微服務在Java世界中快速擴展!
第一部分可參看:??Java 中的超快微服務: 當Microstream遇上Open Liberty??
當我們談論創(chuàng)建可擴展的應用程序時,微服務已成為一個流行語。但這足夠了嗎?答案是否定的,與任何軟件架構(gòu)決策一樣,它也有一個權(quán)衡和幾個挑戰(zhàn)。對于我們Java開發(fā)人員來說,這兩種工具的組合使我們的工作更輕松:Microstream和MicroProfile。本文將介紹如何結(jié)合Microstream和 Wildfly 來創(chuàng)建一個性能穩(wěn)定且速度極快的微服務應用程序。
使用 Wildfly 的微服務
作為面對分布式系統(tǒng)的第一步,微服務為軟件工程師帶來了挑戰(zhàn)。在Java世界中,有幾種工具可以使我們的生活更輕松,尤其是MicroProfile。
MicroProfile 的目標是針對微服務架構(gòu)優(yōu)化企業(yè)版Java。它基于Java EE / Jakarta EE標準以及專門用于微服務的API,例如REST Client、 Configuration、 Open API等。
Wildfly是一個功能強大,模塊化和輕量級的應用程序服務器,可幫助你構(gòu)建令人驚嘆的應用程序。
使用Microstream實現(xiàn)數(shù)據(jù)持久化速度
當我們談論微服務時,我們談論的是分布式系統(tǒng)及其帶來的挑戰(zhàn),這在持久性層中也是一樣的。
不幸的是,我們沒有足夠的文章來談論它。當你對業(yè)務有很多不確定的信息時,我們應該有一個模型,甚至是無模式數(shù)據(jù)庫。盡管如此,持久性層仍然存在很多問題,主要是因為它難以更改。
制作可擴展應用程序的秘訣之一是無狀態(tài),但我們在持久性層中負擔不起它。首先,數(shù)據(jù)庫旨在保存信息及其狀態(tài)。
使數(shù)據(jù)持久化層更高效的解決方案之一是直接與 Java 實體集成為圖表,這就是Microstream所做的。
Microstream使用純Java實現(xiàn)了超快速的內(nèi)存數(shù)據(jù)處理。它提供微秒級查詢時間、低延遲數(shù)據(jù)訪問、巨大的數(shù)據(jù)吞吐量和工作負載。因此,它節(jié)省了大量的CPU功率,二氧化碳排放和數(shù)據(jù)中心的成本。
顯示代碼
讓我們將兩者結(jié)合起來,制作一個Ultra-Fast Microservices。我們將選擇一個簡單的演示來展示兩者如何結(jié)合。在此示例中,我們將創(chuàng)建一個簡單的 CRUD,其中包含產(chǎn)品、名稱和評級,并將其導出為 REST API。
第一步是創(chuàng)建MicroProfile骨架:它毫不費力且流暢,主要是因為我們可以使用可視化MicroProfile啟動器。將 Microprofile 版本 4.1 與 Java 11 和 Wildfly 一起設(shè)置,如下圖所示:
我們已有了應用程序的骨架。下一步是添加Microstream并使兩者協(xié)同工作。幸運的是,有一個庫可以通過CDI擴展集成兩者。因此,借助此API,任何具有CDI和MicroProfile Config的應用程序都可以工作。
1.
2.one.microstream
3.microstream-integrations-cdi
4.LAST_VERSION_HERE
5.
框架已設(shè)置,讓我們從代碼開始。模型是中心部分。它是一個平滑的示例,我們將創(chuàng)建一個包含幾個字段的產(chǎn)品實體。使用Microstream的主要建議是使用不可變實體。因此,我們將創(chuàng)建一個產(chǎn)品作為不可變實體。
1.public class Product {
2. private final long id;
3. private final String name;
4. private final String description;
5. private final int rating;
6.
7. @JsonbCreator
8. public Product(
9. @JsonbProperty("id") final long id,
10. @JsonbProperty("name") final String name,
11. @JsonbProperty("description") final String description,
12. @JsonbProperty("rating") final int rating){
13. //...
14. }
15.
16.}JSON注釋只告知MicroProfile如何將實體序列化為JSON。下一步是定義產(chǎn)品集合,我們稱之為庫存。庫存類是具有多種操作方法的一組產(chǎn)品。此類是實體與Microstream引擎之間的鏈接。與Microstream 的連接將使用Storage 注解。
1.import java.util.Collections;
2.import java.util.HashSet;
3.import java.util.Objects;
4.import java.util.Optional;
5.import java.util.Set;
6.import java.util.function.Predicate;
7.
8.import one.microstream.integrations.cdi.types.Storage;
9.
10.
11.@Storage
12.public class Inventory {
13. private final Setproducts = new HashSet<>();
14.
15. public void add(final Product product) {
16. Objects.requireNonNull(product, "product is required");
17. this.products.add(product);
18. }
19.
20. public SetgetProducts() {
21. return Collections.unmodifiableSet(this.products);
22. }
23.
24. public OptionalfindById(final long id) {
25. return this.products.stream().filter(this.isIdEquals(id)).limit(1).findFirst();
26. }
27.
28. public void deleteById(final long id) {
29. this.products.removeIf(this.isIdEquals(id));
30.
31. }
32.
33. private PredicateisIdEquals(final long id) {
34. return p -> p.getId() == id;
35. }
36.
37. @Override
38. public boolean equals(Object o) {
39. if (this == o) return true;
40. if (o == null || getClass() != o.getClass()) return false;
41. Inventory inventory = (Inventory) o;
42. return Objects.equals(products, inventory.products);
43. }
44.
45. @Override
46. public int hashCode() {
47. return Objects.hash(products);
48. }
49.
50. @Override
51. public String toString() {
52. return "Inventory{" +
53. "products=" + products +
54. '}';
55. }
56.}
集合準備就緒后,讓我們創(chuàng)建存儲庫。要使用我們的 Inventory 類,我們可以使用 CDI 中的 Inject 注釋。我們需要將此操作提交到將要更改此集合的每個操作。對于任何可以更改清單的方法,都有Store注解為我們自動處理它。
1.public interface ProductRepository
2.{
3. CollectiongetAll();
4.
5. Product save(Product item);
6.
7. OptionalfindById(long id);
8.
9. void deleteById(long id);
10.}
11.
12.
13.@ApplicationScoped
14.public class ProductRepositoryStorage implements ProductRepository {
15. private static final Logger LOGGER = Logger.getLogger(ProductRepositoryStorage.class.getName());
16.
17. @Inject
18. private Inventory inventory;
19.
20. @Override
21. public CollectiongetAll() {
22. return this.inventory.getProducts();
23. }
24.
25. @Override
26. @Store
27. public Product save(final Product item) {
28. this.inventory.add(item);
29. return item;
30. }
31.
32. @Override
33. public OptionalfindById(final long id) {
34. LOGGER.info("Finding the item by id: " + id);
35. return this.inventory.findById(id);
36. }
37.
38. @Override
39. @Store
40. public void deleteById(final long id) {
41. this.inventory.deleteById(id);
42. }
43.}
最后一步是將此產(chǎn)品公開為 Rest API。然后,我們將使用Jakarta EE API返回MicroProfile:JAX-RS。接下來,我們將使用 MicroProfile 創(chuàng)建 Open API 文檔。
1.@RequestScoped
2.@Path("products")
3.@Consumes(MediaType.APPLICATION_JSON)
4.@Produces(MediaType.APPLICATION_JSON)
5.public class ProductController
6.{
7. @Inject
8. private ProductRepository repository;
9.
10. // TODO don't worried about pagination
11. @GET
12. public CollectiongetAll()
13. {
14. return this.repository.getAll();
15. }
16.
17. @GET
18. @Path("{id}")
19. @Operation(summary = "Find a product by id", description = "Find a product by id")
20. public Product findById(@PathParam("id") final long id)
21. {
22. return this.repository.findById(id).orElseThrow(
23. () -> new WebApplicationException("There is no product with the id " + id, Response.Status.NOT_FOUND));
24. }
25.
26. @POST
27. public Response insert(final Product product)
28. {
29. return Response.status(Response.Status.CREATED).entity(this.repository.save(product)).build();
30. }
31.
32. @DELETE
33. @Path("{id}")
34. public Response delete(@PathParam("id") final long id){
35. this.repository.deleteById(id);
36. return Response.status(Response.Status.NO_CONTENT).build();
37. }
38.
39.}
就是這樣!我們可以測試運行的應用程序并檢查結(jié)果。
1.mvn clean package
2.java -jar target/wildfly-example-bootable.jar
3.
4.curl --location --request POST 'http://localhost:8080/products/' \
5.--header 'Content-Type: application/json' \
6.--data-raw '{"id": 1, "name": "banana", "description": "a fruit", "rating": 5}'
7.
8.curl --location --request POST 'http://localhost:8080/products/' \
9.--header 'Content-Type: application/json' \
10.--data-raw '{"id": 2, "name": "watermelon", "description": "watermelon sugar ahh", "rating": 4}'
我們最終在Wildfly和Microstream之間實現(xiàn)了集成。本教程展示了兩者如何協(xié)同工作,并為你提供了一種應對持久性問題的新工具:Microstream。事實上,當你想要創(chuàng)建微服務來超快地運行它時,Microstream和Wildfly是很好的盟友。
譯者介紹
朱鋼,社區(qū)編輯,2021年IT影響力專家博主,阿里云專家博主,2019年CSDN博客之星20強,2020年騰訊云+社區(qū)優(yōu)秀作者,11年一線開發(fā)經(jīng)驗,曾參與獵頭服務網(wǎng)站架構(gòu)設(shè)計,企業(yè)智能客服以及大型電子政務系統(tǒng)開發(fā),主導某大型央企內(nèi)部防泄密和電子文檔安全監(jiān)控系統(tǒng)的建設(shè),目前在北京圖伽健康從事醫(yī)療軟件研發(fā)工作。
原文標題:??Ultra-fast Microservices: When Microstream Meets Wildfly??,作者:Otavio Santana
本文名稱:超快微服務:當Microstream遇上Wildfly
文章位置:http://m.5511xx.com/article/dpiispg.html


咨詢
建站咨詢
