美文网首页
spring boot微服务-第三部分:创建货币兑换服务

spring boot微服务-第三部分:创建货币兑换服务

作者: sstraybitd | 来源:发表于2020-03-09 12:51 被阅读0次

    货币兑换服务

    货币兑换服务(Currency Conversion Service CCS)能计算出将一定数量的货币转化为另一种货币的数量。它使用汇率服务(Forex Service,Fs,上一节介绍的服务)得到汇率。因此CCS是一个消费服务.

    访问这个服务的请求和返回结果如下所示:

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

    上述请求是10000元欧元可以转换为多少卢比(750000卢比)。通信过程如下图所示


    image.png

    代码

    • 创建bean
      用于返回结果
    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;
      }
    
    • 使用RestTemplate创建Rest客户端
      调用FS服务并且处理返回的结果
    @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());
      }
    
    
    • 配置文件
      application.properties
    spring.application.name=currency-conversion-service
    server.port=8100
    
    {
      id: 10002,
      from: "EUR",
      to: "INR",
      conversionMultiple: 75,
      quantity: 10000,
      totalCalculatedAmount: 750000,
      port: 8000,
    }
    

    改进

    • 创建代理(feign proxy)
      调用Rest Api而不直接使用URL的方式
    import org.springframework.cloud.openfeign.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);
    }
    

    说明

    1. @FeignClient(name="forex-service" url="localhost:800")
      声明这是一个代理,name指示代理的服务名称,url是代理的URL
    2. @GetMapping("/currency-exchange/from/{from}/to/{to}")
      服务的URI
    • 在控制器中使用代理
    @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());
      }
    
    • 开启代理功能
    @SpringBootApplication
    @EnableFeignClients("com.zhg.springboot.microservice.example.currencyconversion")
    @EnableDiscoveryClient
    public class SpringBootMicroserviceCurrencyConversionApplication {
    
      public static void main(String[] args) {
        SpringApplication.run(SpringBootMicroserviceCurrencyConversionApplication.class, args);
      }
    }
    
    {
      id: 10002,
      from: "EUR",
      to: "INR",
      conversionMultiple: 75,
      quantity: 10000,
      totalCalculatedAmount: 750000,
      port: 8000,
    }
    

    完整代码

    • 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.zhg.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.RELEASE</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.M8</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-openfeign</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>
    
    • CurrencyConversionBean.java
    package com.zhg.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;
      }
    
    }
    
    • CurrencyConversionController.java
    package com.zhg.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());
      }
    
    }
    
    • CurrencyExchangeServiceProxy.java
    package com.zhg.springboot.microservice.example.currencyconversion;
    
    import org.springframework.cloud.openfeign.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);
    }
    
    • SpringBootMicroserviceCurrencyConversionApplication.java
    package com.zhg.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微服务-第三部分:创建货币兑换服务

          本文链接:https://www.haomeiwen.com/subject/pnoudhtx.html