Bootstrap

服务间通信(RPC)的方式

一、FeignClient

1.导入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>4.1.0</version>
</dependency>

 2.在启动类加入注解

@EnableFeignClients
public class S99UserApplication {

    public static void main(String[] args) {
        SpringApplication.run(S99UserApplication.class, args);
    }

}

3.编写代码

  • 新建一个UserController,使用RestController注解,因为要返回数据。
  • 编写一个数据接口,方便调用。
  • 因为要通过用户来调用订单的数据,所以在用户类里定义一个接口(interface),并且使用FeignClient注解指定要调用的服务名称。
  • 在这个接口里定义一个RequestMapping,注意,这里的路径要和被调用服务的数据的路径一致。
  • 在UserController里用Autowired注解装配接口。
  • 调用
@RestController
public class UserController
{

    @Autowired
    OrderService orderService;

    @RequestMapping("/getUsers")
    public Map getUserInfo()
    {
        Map users=new HashMap();
        users.put("姓名","小满");
        users.put("学号","123345");
        users.put("订单",orderService.getOrders());
        return users;
    }
}

@FeignClient("S99-Order")
public interface OrderService
{
    @RequestMapping ("/ord")
    Map getOrders();
}

 二、RestTemplate

1.在启动类注册RestTemplate到IOC容器,并开启负载均衡

@SpringBootApplication
@EnableDiscoveryClient//开启服务发现功能
public class S99OrderApplication
{

    //注册RestTemplate到ioc容器
    @Bean
    @LoadBalanced//开启负载均衡
    RestTemplate restTemplate()
    {
        return new RestTemplate();
    }

    public static void main(String[] args)
    {
        SpringApplication.run(S99OrderApplication.class, args);
    }

}

 2.编写代码

@RestController
public class OrderController
{
    //@Resource
    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/ord")
    public Map getUserInfo()
    {
        String produrl="http://S99-Products/prods";//!!!!!!
        Map prods = restTemplate.getForObject(produrl, Map.class);
        Map ords=new HashMap();
        ords.put("订单编号","1");
        ords.put("产品",prods);
        return ords;
    }
}

 值得注意的是,produrl这里不能指定具体的地址,容易导致服务崩溃!!!

 三、结果查看

 

;