Layanan microser dengan Spring Boot. Bagian 3. Membuat microservice konversi mata uang

Ini adalah bagian ketiga dari serangkaian artikel tentang dasar-dasar arsitektur layanan-mikro, di mana Anda akan belajar cara membuat layanan-mikro untuk konversi mata uang.

Dalam seri artikel ini, Anda akan menjadi terbiasa dengan konsep layanan microser dan belajar bagaimana membuat layanan microser menggunakan Spring Boot dan Spring Cloud.

Panduan ini akan membantu Anda mempelajari dasar-dasar arsitektur layanan mikro. Kami juga akan mulai melihat implementasi microservice dasar dengan Spring Boot.

Kami akan membuat sepasang layanan microser dan membuatnya berkomunikasi satu sama lain menggunakan Eureka (Server Penamaan Eureka) dan server nama Ribbon untuk menyeimbangkan beban di sisi klien.

Artikel ini adalah bagian dari seri Spring Boot Microservices:


Kamu akan belajar


  • Cara membuat microservice menggunakan Spring Boot.
  • Cara menggunakan RestTemplate untuk membuat layanan REST.
  • Cara menggunakan Feign untuk membuat layanan REST.
  • Manfaat Feign dibandingkan RestTemplate.

Tinjauan Sumberdaya


Layanan Konversi Mata Uang (CCS) dapat mengkonversi banyak mata uang ke mata uang lain. Ini menggunakan layanan Forex untuk mendapatkan nilai tukar mata uang saat ini. CCS adalah konsumen layanan.

Contoh permintaan dan respons ditunjukkan di bawah ini:

GET to http://localhost:8100/currency-converter/from/EUR/to/INR/quantity/10000 

 { id: 10002, from: "EUR", to: "INR", conversionMultiple: 75, quantity: 10000, totalCalculatedAmount: 750000, port: 8000, } 

Permintaan di atas memungkinkan Anda untuk menentukan nilai 10.000 euro dalam rupee India.
TotalCalculatedAmount adalah 750.000 INR. Diagram di bawah ini menunjukkan hubungan antara CCS dan FS.



Struktur Kode Proyek


Tangkapan layar berikut menunjukkan struktur proyek yang akan kita buat.



Beberapa elemen proyek:

  • SpringBootMicroserviceCurrencyConversionApplication.java adalah kelas aplikasi Spring Boot yang dibuat menggunakan Spring Initializer. Kelas ini bertindak sebagai titik peluncuran aplikasi.
  • pom.xml - berisi semua dependensi yang diperlukan untuk membuat proyek ini. Kami akan menggunakan Spring Boot Starter Web.
  • CurrencyConversionBean.java - Kacang untuk menyimpan respons yang ingin kami kirim.
  • CurrencyExchangeServiceProxy.java - ini akan menjadi Proksi Feign untuk menelepon layanan Forex.
  • CurrencyConversionController.java - Kontroler Spring REST yang menyediakan layanan konversi mata uang. Ini akan menggunakan CurrencyExchangeServiceProxy untuk memanggil layanan Forex.

Alat yang Anda butuhkan


  • Maven 3.0+ - alat bangun
  • IDE favorit Anda. Kami menggunakan Eclipse.
  • JDK 1.8+

Proyek Maven Siap dengan Sampel Kode


Repositori Github memiliki semua contoh kode.

Membuat proyek menggunakan Spring Initializr


Membuat microservice dengan Spring Initializr mudah dilakukan.

Spring Initializr adalah alat yang hebat untuk membuat proyek Boot Musim Semi Anda dengan cepat.

Dengan bantuan Spring Initializr, Anda dapat membuat berbagai proyek.



Langkah-langkah berikut harus diambil untuk membuat proyek pengembangan layanan web:

1. Luncurkan Spring Initializr dan ketikkan yang berikut:

  • Ketik com.in28minutes.springboot.microservice.example.currencyconversion sebagai grup.
  • Ketik spring-boot-microservice-currency-conversion sebagai artefak.
  • Pilih dependensi berikut: Web , DevTools , Feign

2. Klik Hasilkan Proyek .

3. Impor proyek ke Eclipse: File -> Impor -> Proyek Maven yang Ada.

Ingatlah untuk mencantumkan Feign dalam dependensi.

Membuat CurrencyConversionBean


Ini adalah kacang sederhana untuk membuat jawaban.

 public class CurrencyConversionBean { private Long id; private String from; private String to; private BigDecimal conversionMultiple; private BigDecimal quantity; private BigDecimal totalCalculatedAmount; private int port; public CurrencyConversionBean() { } public CurrencyConversionBean(Long id, String from, String to, BigDecimal conversionMultiple, BigDecimal quantity, BigDecimal totalCalculatedAmount, int port) { super(); this.id = id; this.from = from; this.to = to; this.conversionMultiple = conversionMultiple; this.quantity = quantity; this.totalCalculatedAmount = totalCalculatedAmount; this.port = port; } 

Menerapkan Klien REST dengan RestTemplate


Kode di bawah ini menunjukkan implementasi klien REST untuk memanggil layanan Forex dan memproses respons. Seperti yang Anda lihat, untuk membuat panggilan layanan sederhana, Anda perlu menulis banyak kode.

 @RestController public class CurrencyConversionController { private Logger logger = LoggerFactory.getLogger(this.getClass()); @GetMapping("/currency-converter/from/{from}/to/{to}/quantity/{quantity}") public CurrencyConversionBean convertCurrency(@PathVariable String from, @PathVariable String to, @PathVariable BigDecimal quantity) { Map<String, String> uriVariables = new HashMap<>(); uriVariables.put("from", from); uriVariables.put("to", to); ResponseEntity<CurrencyConversionBean> responseEntity = new RestTemplate().getForEntity( "http://localhost:8000/currency-exchange/from/{from}/to/{to}", CurrencyConversionBean.class, uriVariables); CurrencyConversionBean response = responseEntity.getBody(); return new CurrencyConversionBean(response.getId(), from, to, response.getConversionMultiple(), quantity, quantity.multiply(response.getConversionMultiple()), response.getPort()); } 

Konfigurasikan nama aplikasi dan porta


/spring-boot-microservice-currency-conversion-service/src/main/resources/application.properties

 spring.application.name=currency-conversion-service server.port=8100 

Pengujian layanan mikro


Luncurkan aplikasi Spring Boot dengan menjalankan SpringBootMicroserviceCurrencyConversionApplication.java

 GET to http://localhost:8100/currency-converter/from/EUR/to/INR/quantity/10000 

 { id: 10002, from: "EUR", to: "INR", conversionMultiple: 75, quantity: 10000, totalCalculatedAmount: 750000, port: 8000, } 

Membuat Feign Proxy


Feign memberikan alternatif terbaik untuk RestTemplate untuk memanggil REST API.

/spring-boot-microservice-currency-conversion-service/src/main/java/com/in28minutes/springboot/microservice/example/currencyconversion/CurrencyExchangeServiceProxy.java

 package com.in28minutes.springboot.microservice.example.currencyconversion; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient(name="forex-service" url="localhost:8000") public interface CurrencyExchangeServiceProxy { @GetMapping("/currency-exchange/from/{from}/to/{to}") public CurrencyConversionBean retrieveExchangeValue (@PathVariable("from") String from, @PathVariable("to") String to); } 

Pertama-tama kita mendefinisikan proxy sederhana:

  • @FeignClient (name = "forex-service" url = "localhost: 8100") - menyatakan bahwa ini adalah klien Feign, dan URL tempat layanan Forex berada adalah localhost: 8100
  • @GetMapping ("/ pertukaran mata uang / dari / {dari} / ke / {ke}") - URI layanan yang ingin kami gunakan

Menggunakan Feign Proxy dalam Kontroler Layanan Microsoft


Melakukan panggilan melalui proxy sangat sederhana. Anda akan melihat ini beraksi dalam kode di bawah ini. Yang harus kami lakukan adalah menghubungkan proxy secara otomatis dan menggunakannya untuk memanggil metode.

 @Autowired private CurrencyExchangeServiceProxy proxy; @GetMapping("/currency-converter-feign/from/{from}/to/{to}/quantity/{quantity}") public CurrencyConversionBean convertCurrencyFeign(@PathVariable String from, @PathVariable String to, @PathVariable BigDecimal quantity) { CurrencyConversionBean response = proxy.retrieveExchangeValue(from, to); logger.info("{}", response); return new CurrencyConversionBean(response.getId(), from, to, response.getConversionMultiple(), quantity, quantity.multiply(response.getConversionMultiple()), response.getPort()); } 

Mengaktifkan Klien Feign


Sebelum kita dapat menggunakan Feign, kita harus mengaktifkannya menggunakan anotasi @EnableFeignClients dalam paket yang sesuai di mana proxy klien didefinisikan.

 @SpringBootApplication @EnableFeignClients("com.in28minutes.springboot.microservice.example.currencyconversion") @EnableDiscoveryClient public class SpringBootMicroserviceCurrencyConversionApplication { public static void main(String[] args) { SpringApplication.run(SpringBootMicroserviceCurrencyConversionApplication.class, args); } } 

Menguji Layanan Microsoft Menggunakan Feign


 GET to http://localhost:8100/currency-converter-feign/from/EUR/to/INR/quantity/10000 


 { id: 10002, from: "EUR", to: "INR", conversionMultiple: 75, quantity: 10000, totalCalculatedAmount: 750000, port: 8000, } 

Ringkasan


Kami menciptakan dua layanan microser dan membangun koneksi di antara mereka.



Namun, kami mengkodekan URL untuk FS ke CCS. Ini berarti bahwa ketika instance FS baru diluncurkan, kami tidak memiliki cara untuk mendistribusikan beban di antara mereka. Pada bagian selanjutnya, kami akan mengaktifkan penyetelan beban sisi klien menggunakan Ribbon.

Kode contoh lengkap

/spring-boot-microservice-currency-conversion-service/pom.xml


 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.in28minutes.springboot.microservice.example.currency-conversion</groupId> <artifactId>spring-boot-microservice-currency-conversion</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-boot-microservice-currency-conversion</name> <description>Microservices with Spring Boot and Spring Cloud - Currency Conversion Service</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.M3</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.M2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </project> 

/spring-boot-microservice-currency-conversion-service/src/main/java/com/in28minutes/springboot/microservice/example/currencyconversion/CurrencyConversionBean.java


 package com.in28minutes.springboot.microservice.example.currencyconversion; import java.math.BigDecimal; public class CurrencyConversionBean { private Long id; private String from; private String to; private BigDecimal conversionMultiple; private BigDecimal quantity; private BigDecimal totalCalculatedAmount; private int port; public CurrencyConversionBean() { } public CurrencyConversionBean(Long id, String from, String to, BigDecimal conversionMultiple, BigDecimal quantity, BigDecimal totalCalculatedAmount, int port) { super(); this.id = id; this.from = from; this.to = to; this.conversionMultiple = conversionMultiple; this.quantity = quantity; this.totalCalculatedAmount = totalCalculatedAmount; this.port = port; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } public String getTo() { return to; } public void setTo(String to) { this.to = to; } public BigDecimal getConversionMultiple() { return conversionMultiple; } public void setConversionMultiple(BigDecimal conversionMultiple) { this.conversionMultiple = conversionMultiple; } public BigDecimal getQuantity() { return quantity; } public void setQuantity(BigDecimal quantity) { this.quantity = quantity; } public BigDecimal getTotalCalculatedAmount() { return totalCalculatedAmount; } public void setTotalCalculatedAmount(BigDecimal totalCalculatedAmount) { this.totalCalculatedAmount = totalCalculatedAmount; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } } 

/spring-boot-microservice-currency-conversion-service/src/main/java/com/in28minutes/springboot/microservice/example/currencyconversion/CurrencyConversionController.java


 package com.in28minutes.springboot.microservice.example.currencyconversion; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class CurrencyConversionController { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private CurrencyExchangeServiceProxy proxy; @GetMapping("/currency-converter/from/{from}/to/{to}/quantity/{quantity}") public CurrencyConversionBean convertCurrency(@PathVariable String from, @PathVariable String to, @PathVariable BigDecimal quantity) { Map<String, String> uriVariables = new HashMap<>(); uriVariables.put("from", from); uriVariables.put("to", to); ResponseEntity<CurrencyConversionBean> responseEntity = new RestTemplate().getForEntity( "http://localhost:8000/currency-exchange/from/{from}/to/{to}", CurrencyConversionBean.class, uriVariables); CurrencyConversionBean response = responseEntity.getBody(); return new CurrencyConversionBean(response.getId(), from, to, response.getConversionMultiple(), quantity, quantity.multiply(response.getConversionMultiple()), response.getPort()); } @GetMapping("/currency-converter-feign/from/{from}/to/{to}/quantity/{quantity}") public CurrencyConversionBean convertCurrencyFeign(@PathVariable String from, @PathVariable String to, @PathVariable BigDecimal quantity) { CurrencyConversionBean response = proxy.retrieveExchangeValue(from, to); logger.info("{}", response); return new CurrencyConversionBean(response.getId(), from, to, response.getConversionMultiple(), quantity, quantity.multiply(response.getConversionMultiple()), response.getPort()); } } 

/spring-boot-microservice-currency-conversion-service/src/main/java/com/in28minutes/springboot/microservice/example/currencyconversion/CurrencyExchangeServiceProxy.java


 package com.in28minutes.springboot.microservice.example.currencyconversion; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient(name="forex-service" url="localhost:8000") public interface CurrencyExchangeServiceProxy { @GetMapping("/currency-exchange/from/{from}/to/{to}") public CurrencyConversionBean retrieveExchangeValue (@PathVariable("from") String from, @PathVariable("to") String to); } 

/spring-boot-microservice-currency-conversion-service/src/main/java/com/in28minutes/springboot/microservice/example/currencyconversion/SpringBootMicroserviceCurrencyConversionApplication.java


 package com.in28minutes.springboot.microservice.example.currencyconversion; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; @SpringBootApplication @EnableFeignClients("com.in28minutes.springboot.microservice.example.currencyconversion") public class SpringBootMicroserviceCurrencyConversionApplication { public static void main(String[] args) { SpringApplication.run(SpringBootMicroserviceCurrencyConversionApplication.class, args); } } 

/spring-boot-microservice-currency-conversion-service/src/main/resources/application.properties


 spring.application.name=currency-conversion-service server.port=8100 

/spring-boot-microservice-currency-conversion-service/src/test/java/com/in28minutes/springboot/microservice/example/currencyconversion/SpringBootMicroserviceCurrencyConversionApplicationTests.java


 package com.in28minutes.springboot.microservice.example.currencyconversion; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class SpringBootMicroserviceCurrencyConversionApplicationTests { @Test public void contextLoads() { } } 

Source: https://habr.com/ru/post/id485094/


All Articles