• Spring Cloud 如何实现服务间的调用 4.2.3


       如果存在多个服务时,要怎么通过注册中心来实现服务之间的调用呢?接下来将通过一个用户和订单之间的调用案例,来演示Eureka Server中服务之间的调用。

    搭建订单服务工程

      在父工程xcservice-springcloud中,创建Maven子模块xcservice-eureka-order
      (1)在pom.xml中,添加spring-cloud-starter-eureka依赖,其代码如下。
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
      (2)编写配置文件。在配置文件中添加Eureka服务实例的端口号、服务端地址等信息,如文件4-8所示。
      文件4-8 application.yml
    server:
      port: 7900 # 指定该Eureka实例的端口号
    
    eureka:
      instance:
        prefer-ip-address: true  # 是否显示主机的IP
        #instance-id: ${spring.cloud.client.ipAddress}:${server.port} #将Status中的显示内容也以“IP:端口号”的形式显示
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/ # 指定Eureka服务端地址
    
    spring:
      application:
        name: xcservice-eureka-order # 指定应用名称
      (3)创建订单实体类。
      文件4-9 Order.java
    package com.xc.xcserviceeurekaorder.po;
    
    public class Order {
    
        private String id;
        private Double price;
        private String receiverName;
        private String receiverAddress;
        private String receiverPhone;
        ...
    
    }
      (4)创建订单控制器类。
      文件4-10 OrderController.java
    package com.xc.xcserviceeurekaorder.controller;
    
    import com.xc.xcserviceeurekaorder.po.Order;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class OrderController {
    
        /**
         * 通过id查询订单
         */
        @GetMapping("/order/{id}")
        public String findOrderById(@PathVariable String id) {
            Order order = new Order();
            order.setId("123");
            order.setPrice(23.5);
            order.setReceiverAddress("beijing");
            order.setReceiverName("xiaoqiang");
            order.setReceiverPhone("13422343311");
            return order.toString();
        }
    
    }
      (5)在引导类中添加@EnableEurekaClient注解。

     编写用户服务功能

      (1)在xcservice-eureka-user工程的引导类中,创建RestTemplate的Spring实例,其代码如下:
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

      在上述代码中,RestTemplate是Spring提供的用于访问Rest服务的客户端实例,它提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。


      (2)创建用户控制器类
      文件4-11 UserController.java
    package com.xc.xcserviceeurekauser.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    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 UserController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        /**
         * http://localhost:8000/findOrdersByUser/1
         * 查找与用户相关的订单
         */
        @GetMapping("/findOrdersByUser/{id}")
        public String findOrdersByUser(@PathVariable String id) {
            // 假设用户只有一个订单,并且订单id为123
            int oid = 123;
            return restTemplate.getForObject("http://localhost:7900/order/" + oid, String.class);
        }
    
    }

      在上述代码中,当用户查询订单时,首先会通过用户id查询与用户相关的所有订单(由于这里主要是演示服务的调用,所以省略了查询方法,并且自定义了一个oid为123的订单,来模拟查询出的结果)。然后通过restTemplate对象的getForObject()方法调用了订单服务中的查询订单方法来查询订单id为123的订单信息。


      3. 启动服务应用,测试服务调用
      分别启动服务注册中心应用、订单服务应用和用户服务应用


      当通过浏览器访问地址http://localhost:8000/findOrdersByUser/1(1表示用户id)后,浏览器的显示效果。
    Order{id='123', price=23.5, receiverName='xiaoqiang', receiverAddress='beijing', receiverPhone='13422343311'}


  • 相关阅读:
    第八周作业
    第八周上机练习
    第七周作业
    第七次上机练习
    第六周作业
    4.9上机作业
    第五周作业
    第四次JAVA作业
    第四周作业
    第十六次作业
  • 原文地址:https://www.cnblogs.com/ooo0/p/11183324.html
Copyright © 2020-2023  润新知