微服务使用RestTemplate进行服务调用

在微服务项目中,进行在一个服务调用其他服务方法时,通常是采用feign去调用,因为调用起来比较简单直接,通过注解以及一些简单的操作就可以了,这里主要对通过RestTemplate调用服务做一个简单的记录。

目录

添加配置类

具体操作

在启动类添加注解

添加配置类

首先需要注入RestTemplate对象,需要在配置类进行配置。

@Configuration
public class Config {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    
}

具体操作

在实现类中注入RestTemplateDiscoveryClient类,然后通过DiscoveryClient去获取服务的信息,比如服务地址、服务端口等,然后通过RestTemplate去实现调用操作。具体代码如下。

服务提供者

@RestController
@RequestMapping("/goods")
public class GoodsController {

    @Autowired
    private GoodsService goodsService;


    @GetMapping ("/updateGoods/{id}")
    public R updateGoods(@PathVariable Integer id){
        return goodsService.updateGoods(id);
    }


}

服务消费者

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;

    @Override
    @Transactional(rollbackFor=Exception.class)
    public R insertOrder(Order order){
        //根据服务名去获取服务信息
        ServiceInstance service = discoveryClient.getInstances("goods-service").get(0);
        //根据服务名去获取服务信息
        ServiceInstance service2 = discoveryClient.getInstances("coupon-service").get(0);
        //获取服务地址
        String url = service.getHost() + ":" + service.getPort();
        String url2 = service2.getHost() + ":" + service2.getPort();
        System.out.println("---------------调用商品服务进行库存更新--------------------");
        //调用商品服务
        Object forObject = restTemplate.getForObject("http://" + url + "/goods/updateGoods/" + order.getGoodsId() + "?id=" + order.getGoodsId(), Object.class);
        Map map = (Map) forObject;
        if (String.valueOf(map.get("code")).equals("201")){
            System.out.println("---------------商品没有库存啦-----------------");
            return R.fail(201,"商品没有库存啦");
        }
        System.out.println("---------------调用商品服务成功-----------------------");
        System.out.println("---------------调用优惠券服务,修改优惠券信息--------------------");
        //调用优惠券服务
        Object forObject1 = restTemplate.getForObject("http://" + url2 + "/coupon/updateCoupon/" + order.getCouponId() + "?id=" + order.getGoodsId(), Object.class);
        Map map2 = (Map)forObject1;
        if (String.valueOf(map2.get("code")).equals("201")){
            System.out.println("---------------优惠券已经使用过了----------------");
            return R.fail(201,"优惠券已经使用过了");
        }
        System.out.println("---------------调用优惠券服务成功-----------------------");
        order.setPrice(order.getGoodsPrice() * order.getCouponDiscount());
        int i = orderMapper.insertOrder(order);
        return i > 0 ? R.ok(order) : R.fail("失败");
    }
}

如果调用其他服务方法需要返回结果时,会返回一个Object对象,如果需要获取里面的属性的值,可以把它转成Map,然后通过get(属性名)获取值。

在启动类添加注解

最后则是需要在启动类上添加@EnableDiscoveryClient注解

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableAspectJAutoProxy(exposeProxy = true)
public class OrderApplication {

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

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Apache ServiceComb Java Chassis 是一个开箱即用Java语言微服务SDK,含服务契约、编程模型、运行模型与通信模型四个部分,具备负载均衡、容错熔断、限流降级、调用链追踪等全面微服务治理能力,服务治理能力与业务逻辑隔离。 它包含如下特性: 多种开发风格,REST(JAX-RS、Spring MVC)和RPC; 多种通信协议, HTTP over Vert.x、Http Over Servlet、Highway等; 统一一致的服务提供者、服务消费者处理链,以及基于契约的开箱即用的服务治理能力。 软件特点: 高性能 Java Chassis 网络层基于 Vert.x 实现, 支持开发者使用响应式编程, 开发者在使用熟悉的REST风格设计业务接口的时候,也能够获取到非常高性能的吞吐量。同时还提供了Highway协议,满足更高性能场景的要求。 原生支持OpenAPI Java Chassis 的接口开发、服务治理都基于 Swagger ,并通过接口语义检查,使得接口定义符合 OpenAPI 规范。 灵活的开发方式 开发者可以使用 SpringMVC/JAX-RS/transparent RPC 任意一种方式定义服务端接口, 并使用RPC/RestTemplate 等方式访问这些接口. 得益于Java Chassis的通信层与开发方式分离的设计,开发者可以在 Rest over Vertx/Rest over Servlet/Highway等通信模式下自由切换。 开箱即用的服务治理能力 Java Chassis 提供了大量开箱即用的服务治理能力,包括服务发现、熔断容错、负载均衡、流量控制等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值