设为首页 - 加入收藏
您的当前位置:主页 > 科技新闻 > 正文

Spring Cloud中微服务之间相互调用的常见方式

来源:网络整理 点击: 时间:2019-09-15

服务调用场景:

(1)订单微服务调用商品微服务,完成订单创建业务

(2)涉及的微服务:mall-goods商品微服务、mall-order订单微服务

(3)微服务的调用关系(依赖关系)如下图所示:

Spring Cloud中微服务之间相互调用的常见方式

1、使用Feign调用

(1)在mall-order订单微服务中,定义一个GoodsFeignpackage cn.org.xcore.mall.order.feign;

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "GOODS-SERVICE") http:// 调用的服务

public interface GoodsFeign {

@GetMapping("/goods/get_goods_list") http:// 调用的接口

String searchGoods();

@GetMapping("/goods/find") http:// 调用的接口

String getGoods();

}

(2)在mall-order订单微服务的控制器中,注入GoodsFeignpackage cn.org.xcore.mall.order.controller;

import cn.org.xcore.mall.order.feign.UserFeign;

import cn.org.xcore.mall.order.feign.GoodsFeign;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

@RestController

@RequestMapping("/order")

public class OrderController {

http:// 使用Feign

@Autowired

private GoodsFeign goodsFeign;

@GetMapping("/get_goods4")

public Object findGoods4() {

String response = goodsFeign.searchGoods();

return response;

}

}

2、使用LoadBalancerClient调用

在mall-order订单微服务的控制器中,注入一个LoadBalancerClient实例,然后通过该实例调用其它微服务的接口:package cn.org.xcore.mall.order.controller;

import cn.org.xcore.mall.order.feign.UserFeign;

import cn.org.xcore.mall.order.feign.GoodsFeign;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

@RestController

@RequestMapping("/order")

public class OrderController {

http:// 使用LoadBalancerClient

@Autowired

private LoadBalancerClient loadBalancerClient;

@GetMapping("/get_goods3")

public Object findGoods3() {

ServiceInstance serviceInstance = loadBalancerClient.choose("GOODS-SERVICE"); http:// 服务名称

String url = String.format("http:http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort())+"/goods/get_goods_list";

RestTemplate restTemplate = new RestTemplate();

String response = restTemplate.getForObject(url, String.class);

return response;

}

}

3、使用@LoadBalanced 加持的 RestTemplate调用

(1)声明一个RestTemplate Beanpackage cn.org.xcore.mall.order.config;

import org.springframework.boot.web.client.RestTemplateBuilder;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.client.RestTemplate;

/**

* springboot 1.3- 及以下版本中,会默认提供一个RestTemplate Bean实例

* springboot 1.4+ 及以上版本中,需要手动创建一个RestTemplate的配置,否则在@Autowired 注入时会报错

*/

@Configuration

public class RestTemplateConfig{

@Bean

@LoadBalanced http:// 方式-2:使用@LoadBalanced

public RestTemplate restTemplate(RestTemplateBuilder builder){

return builder.build();

}

}

(2)在mall-order订单微服务控制器中,注入有@LoadBalanced加持的restTemplate实例package cn.org.xcore.mall.order.controller;

import cn.org.xcore.mall.order.feign.UserFeign;

import cn.org.xcore.mall.order.feign.GoodsFeign;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

@RestController

@RequestMapping("/order")

public class OrderController {

http:// 使用@LoadBalanced加持的RestTemplate

@Autowired

private RestTemplate restTemplate; http:// RestTemplate的配置见:/config/RestTemplateConfig.java

@GetMapping("/get_goods2")

public Object findGoods2() {

String response = restTemplate.getForObject("http:http://GOODS-SERVICE/goods/get_goods_list", String.class);

return response;

}

}

4、使用原生的 RestTemplate调用

在mall-order订单微服务中,直接使用原生的RestTemplate调用商品微服务mall-goods:package cn.org.xcore.mall.order.controller;

import cn.org.xcore.mall.order.feign.UserFeign;

import cn.org.xcore.mall.order.feign.GoodsFeign;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

@RestController

@RequestMapping("/order")

public class OrderController {

http:// 使用原生的RestTemplate调另一个微服务的接口,或者使用HttpClient

@GetMapping("/get_goods1")

public Object findGoods1() {

RestTemplate restTemplate = new RestTemplate();

String response = restTemplate.getForObject("http:http://localhost:9001/goods/get_goods_list", String.class);

return response;

}

}

这种原生的RestTemplate不具备负载均衡功能,因此尽量不要使用。

5、使用原生的 HttpClients调用

网友评论:

美女图片

网站地图 | 热门标签

免责声明:本站内容均来自网络或网友投稿,如有侵权请联系管理员,我们会第一时间为您处理或者删除侵权内容!谢谢您的合作!联系邮箱:3488061@qq.com

Copyright © 2016 010新事网 All Rights Reserved.京ICP备12027043号-1

Top