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

Posted ooo0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud 如何实现服务间的调用相关的知识,希望对你有一定的参考价值。

   如果存在多个服务时,要怎么通过注册中心来实现服务之间的调用呢?接下来将通过一个用户和订单之间的调用案例,来演示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)后,浏览器的显示效果。
Orderid=‘123‘, price=23.5, receiverName=‘xiaoqiang‘, receiverAddress=‘beijing‘, receiverPhone=‘13422343311‘

 



以上是关于Spring Cloud 如何实现服务间的调用的主要内容,如果未能解决你的问题,请参考以下文章

服务治理:Spring Cloud Eureka

服务治理:Spring Cloud Eureka

五分钟带你玩转spring cloud alibaba实战!组件化的服务间的调用

五分钟带你玩转spring cloud alibaba实战!组件化的服务间的调用

gRPC在Spring Cloud中的应用

Spring Cloud 源码解读之 如何配置好OpenFeign的各种超时时间!