Образец проекта Java Spring Boot Microservices

Опубликовано: 5 Октября, 2022

В настоящее время микросервисы более популярны. Они могут быть написаны на любом языке. В этой статье давайте посмотрим на микросервисы Spring Boot. в этой статье мы рассмотрим базовый проект «сервис-образец-обмен-валюты», который имеет бизнес-логику и который может быть вызван в другом проекте « сервис-образец-обмен-валюты ». Оба являются проектами Maven, и давайте рассмотрим их один за другим.

Микросервис 1: образец сервиса обмена валюты

Структура проекта

пом.xml

XML




<?xml version="1.0" encoding="UTF-8"?>
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gfg.microservices</groupId>
    <artifactId>currency-exchange-sample-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>currency-exchange-sample-service</name>
    <description>Demo project for Spring Boot</description>
 
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RC2</spring-cloud.version>
    </properties>
 
    <dependencies>
       
        <!-- Starter for building web, including RESTful,
             applications using Spring MVC. -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <!-- The spring-boot-devtools module can be included in any
             project to provide additional development-time features -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <!-- H2 is an open-source lightweight Java database -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>             
            <scope>runtime</scope
        </dependency
        <!--  starter for using Spring Data JPA with Hibernate. -->
        <dependency
          <groupId>org.springframework.boot</groupId
          <artifactId>spring-boot-starter-data-jpa</artifactId
          <version>2.1.3.RELEASE</version
        </dependency>
        <!-- provides secured endpoints for monitoring
             and managing your Spring Boot application -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </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-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>
 
</project>

Давайте посмотрим важные файлы

CurrencyExchangeServiceSampleApplication.java

Java




import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
// It is equivalent to using @Configuration,
// @EnableAutoConfiguration and @ComponentScan with their
// default attributes:
public class CurrencyExchangeServiceSampleApplication {
 
    public static void main(String[] args)
    {
        SpringApplication.run(
            CurrencyExchangeServiceSampleApplication.class,
            args);
    }
}

Валютексчанжесамплеконтроллер.java

@GetMapping("/currency-exchange-sample/fromCurrency/{fromCurrency}/toCurrency/{toCurrency}") 
// where {fromCurrency} and {toCurrency} are path variable
// fromCurrency can be USD,EUR,AUD,INR and toCurrency can be the opposite of any fromCurrency

Java




import java.math.BigDecimal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
 
@SpringBootApplication
@RestController
// The @RestController annotation in Spring is essentially
// just a combination of
// @Controller and @ResponseBody. This annotation was added
// during Spring 4.0 to remove the redundancy of declaring
// the @ResponseBody annotation in your controller
public class CurrencyExchangeSampleController {
    @Autowired private Environment environment;
 
    @GetMapping(
        "/currency-exchange-sample/fromCurrency/{fromCurrency}/toCurrency/{toCurrency}")
    // where {fromCurrency} and {toCurrency} are path
    // variable
    // fromCurrency can be USD,EUR,AUD,INR and toCurrency
    // can be the opposite of any fromCurrency
    public ExchangeValue
    retrieveExchangeValue(@PathVariable String fromCurrency,
                          @PathVariable String toCurrency)
    {
        // Here we need to write all of our business logic
        BigDecimal conversionMultiple = null;
        ExchangeValue exchangeValue = new ExchangeValue();
        if (fromCurrency != null && toCurrency != null) {
            if (fromCurrency.equalsIgnoreCase("USD")
                && toCurrency.equalsIgnoreCase("INR")) {
                conversionMultiple = BigDecimal.valueOf(78);
            }
            if (fromCurrency.equalsIgnoreCase("INR")
                && toCurrency.equalsIgnoreCase("USD")) {
                conversionMultiple
                    = BigDecimal.valueOf(0.013);
            }
            if (fromCurrency.equalsIgnoreCase("EUR")
                && toCurrency.equalsIgnoreCase("INR")) {
                conversionMultiple = BigDecimal.valueOf(82);
            }
            if (fromCurrency.equalsIgnoreCase("AUD")
                && toCurrency.equalsIgnoreCase("INR")) {
                conversionMultiple = BigDecimal.valueOf(54);
            }
        }
        // setting the port
        exchangeValue = new ExchangeValue(
            1000L, fromCurrency, toCurrency,
            conversionMultiple);
        exchangeValue.setPort(Integer.parseInt(
            environment.getProperty("local.server.port")));
        return exchangeValue;
    }
}

ExchangeValue.java

Java




import java.math.BigDecimal;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
 
// @Entity annotation defines that a class can be mapped to
// a table
@Entity
 
// Representation of the table name
@Table(name = "Exchange_Value")
public class ExchangeValue {
    // The @Id annotation is inherited from
    // javax.persistence.Id, indicating the member field
    // below is the primary key of the current entity
    @Id @Column(name = "id") private Long id;
    @Column(name = "currency_from")
    private String fromCurrency;
    @Column(name = "currency_to") private String toCurrency;
    @Column(name = "conversion_multiple")
    private BigDecimal conversionMultiple;
    @Column(name = "port") private int port;
 
    public ExchangeValue() {}
 
    // generating constructor using fields
    public ExchangeValue(Long id, String fromCurrency,
                         String toCurrency,
                         BigDecimal conversionMultiple)
    {
        super();
        this.id = id;
        this.fromCurrency = fromCurrency;
        this.toCurrency = toCurrency;
        this.conversionMultiple = conversionMultiple;
    }
 
    // generating getters
    public int getPort() { return port; }
 
    public void setPort(int port) { this.port = port; }
 
    public Long getId() { return id; }
 
    public String getFrom() { return fromCurrency; }
 
    public String getTo() { return toCurrency; }
 
    public BigDecimal getConversionMultiple()
    {
        return conversionMultiple;
    }
}

приложение.свойства

spring.application.name=currency-exchange-sample-service
server.port=8000 #Representation of the port number . We can set different port number in run configuration also
spring.jpa.show-sql=true  #To display the SQL
spring.h2.console.enabled=true  
spring.datasource.platform=h2  #As we are using h2 datasource 
spring.datasource.url=jdbc:h2:mem:gfg 

данные.sql

insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port)  
values(10001,"USD", "INR" ,65,0);  
insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port)  
values(10002,"EUR", "INR" ,82,0);  
insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port)  
values(10003,"AUD", "INR" ,53,0);

По умолчанию он настроен для работы на порту 8000. Мы можем создать еще один экземпляр и запустить проект на порту 8001 следующими способами.

Поскольку это приложение весенней загрузки, его можно обычно запускать как приложение Java.

Если мы настроим запуск приложения на двух разных портах, мы получим следующие параметры:

Давайте выберем первый. Запустив приложение, в консоли видим следующее:

Из консоли мы видим, что он использует Tomcat по умолчанию, и проект работает на порту 8080. Поскольку мы использовали 3 сценария вставки, автоматически создается таблица и вставляются данные. Мы можем сделать следующее

http://localhost:8000/currency-exchange-sample/fromCurrency/USD/toCurrency/INR

При попадании по этому URL-адресу он будет перенаправлен на контроллер, а fromCurrency принимается как «USD», а toCurrency принимается как «INR».

Из-за этого,

// Below set of code is executed and hence we are seeing the result like above
if (fromCurrency != null && toCurrency != null) {
            if (fromCurrency.equalsIgnoreCase("USD") && toCurrency.equalsIgnoreCase("INR")) {
                conversionMultiple = BigDecimal.valueOf(78);
            }

Точно так же мы можем выполнить следующие URL-адреса:

http://localhost:8000/currency-exchange-sample/fromCurrency/EUR/toCurrency/INR
http://localhost:8000/currency-exchange-sample/fromCurrency/AUD/toCurrency/INR

Следовательно, в соответствии с потребностями нашего бизнеса, мы можем добавить бизнес-логику в файл контроллера. Давайте посмотрим, как вышеуказанный сервис вызывается в проекте конвертации валюты.

Микросервис 2: сервис-образец-конвертации валюты

Это также проект maven

пом.xml

XML