如何使用Java Spring Boot 创建一个微服务项目 二?
上一篇我们已经链接了 如何使用Java Spring Boot 创建一个微服务项目 一?这一篇我们接着实现第二部分
微服务2:货币兑换样本服务
这也是一个maven项目
pom.xml
代码语言:javascript复制<?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
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/>
</parent>
<groupId>com.gfg.microservices</groupId>
<artifactId>currency-conversion-sample-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>currency-conversion-servicce</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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</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>
主要重要的java文件
CurrencyConversionSampleServiceApplication.java
代码语言:javascript复制import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CurrencyConversionSampleServiceApplication {
public static void main(String[] args) {
SpringApplication.run(CurrencyConversionSampleServiceApplication.class, args);
}
}
CurrencyConversionSampleBean.java
代码语言:javascript复制import java.math.BigDecimal;
public class CurrencyConversionSampleBean {
// We need to set all the fields that is going to
// received in response
private Long id;
private String from;
private String to;
private BigDecimal ConversionMultiple;
private BigDecimal quantity;
private BigDecimal totalCalculatedAmount;
private int port;
// default constructor
public CurrencyConversionSampleBean() {}
// creating constructor
public CurrencyConversionSampleBean(
Long id, String from, String to,
BigDecimal conversionMultiple, BigDecimal quantity,
BigDecimal totalCalculatedAmount, int port)
{
super();
this.id = id;
this.from = from;
this.to = to;
ConversionMultiple = conversionMultiple;
this.quantity = quantity;
this.totalCalculatedAmount = totalCalculatedAmount;
this.port = port;
}
// creating setters and getters
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)
{
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; }
}
CurrencyConversionSampleController.java
代码语言:javascript复制package com.gfg.microservices.currencyconversionservice;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
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 CurrencyConversionSampleController {
@GetMapping(
"/currency-converter-sample/fromCurrency/{fromCurrency}/toCurrency/{toCurrency}/quantity/{quantity}")
public CurrencyConversionSampleBean
convertCurrency(@PathVariable String fromCurrency,
@PathVariable String toCurrency,
@PathVariable BigDecimal quantity)
{
// setting variables to currency exchange service
Map<String, String> uriVariables = new HashMap<>();
// urlParams should match properly
uriVariables.put("fromCurrency", fromCurrency);
uriVariables.put("toCurrency", toCurrency);
// 调用货币兑换示例服务
// http://localhost:8000/currency-exchange-sample/fromCurrency/{fromCurrency}/toCurrency/{toCurrency}
// 是从第一部分调用的服务。它的响应已经接收,并通过 CurrencyConversionSampleBean 我们获取了结果回来
ResponseEntity<CurrencyConversionSampleBean>
responseEntity
= new RestTemplate().getForEntity(
"http://localhost:8000/currency-exchange-sample/fromCurrency/{fromCurrency}/toCurrency/{toCurrency}",
CurrencyConversionSampleBean.class,
uriVariables);
CurrencyConversionSampleBean response
= responseEntity.getBody();
// 创建一个新的响应Bean并获取响应,将其放入Bean中。因此,输出Bean应包含从响应接收到的所有字段。
return new CurrencyConversionSampleBean(
response.getId(), fromCurrency, toCurrency,
response.getConversionMultiple(), quantity,
quantity.multiply(
response.getConversionMultiple()),
response.getPort());
}
}
也就是说这个项目是在端口8100上启动的。现在我们可以执行以下URLS
代码语言:javascript复制http://localhost:8100/currency-converter-sample/fromCurrency/USD/toCurrency/INR/quantity/1000
当这个服务被调用时,它会依次调用。
假设:
currency-exchange-sample 正在端口 8000 中运行,并产生所需的响应
代码语言:javascript复制http://localhost:8000/currency-exchange-sample/fromCurrency/USD/toCurrency/INR
然后逻辑写成
代码语言:javascript复制ResponseEntity<CurrencyConversionSampleBean>respnotallow=new RestTemplate().getForEntity("http://localhost:8000/currency-exchange-sample/fromCurrency/{fromCurrency}/toCurrency/{toCurrency}",CurrencyConversionSampleBean.class, uriVariables);
CurrencyConversionSampleBean response=responseEntity.getBody();
// 创建一个新的响应 bean 并获取响应并将其放入 Bean 中
// 因此输出 bean 应该具有从响应接收到的所有字段
返回新的CurrencyConversionSampleBean(response.getId(),fromCurrency,toCurrency,response.getConversionMultiple(),数量,quantity.multiply(response.getConversionMultiple()),response.getPort());
我们看到totalCalculatedAmount 为78 * 1000,即78000。我们从第一个URL 中获取“conversionMultiple”,并将其与此处的数量值相乘。非常理想的是,我们不需要将交换服务逻辑引入到该应用程序中,即第 1 部分项目可以分开,第 2 部分项目可以在此处调用第 1 部分 URL。因此微服务可以单独运行,其他服务可以使用它们。其余可检查的网址
例子1
代码语言:javascript复制http://localhost:8100/currency-converter-sample/fromCurrency/EUR/toCurrency/INR/quantity/5000
这会依次调用
代码语言:javascript复制http://localhost:8000/currency-exchange-sample/fromCurrency/EUR/toCurrency/INR
输出
例子2
代码语言:javascript复制http://localhost:8100/currency-converter-sample/fromCurrency/AUD/toCurrency/INR/quantity/2000
这会依次调用
代码语言:javascript复制http://localhost:8000/currency-exchange-sample/fromCurrency/AUD/toCurrency/INR