21 服务调用Feign高级

Posted

tags:

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

参考技术A 从Spring Cloud Edgware开始,Feign支持使用属性自定义Feign。对于一个指定名称的Feign Client(例如该Feign Client的名称为 feignName ),Feign支持如下配置项:

Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数 即可开启请求与响应的压缩功能:

同时,我们也可以对请求的数据类型,以及触发压缩的大小下限进行设置:

注:上面的数据类型、压缩大小下限均为默认值。

在开发或者运行阶段往往希望看到Feign请求过程的日志记录,默认情况下Feign的日志是没有开启的。 要想用属性配置方式来达到日志效果,只需在 application.yml 中添加如下内容即可:

SpringCloud之服务调用(feign)

前言

前一篇介绍了使用Ribbon的RestTemplate进行服务调用的使用方式。除了这种方式进行服务调用以外还可以通过Feign进行调用,本篇文章就是简单介绍一下如何使用Feign进行服务调用。根据前一篇文章所用项目进行修改。

Feign使用流程

1.pom文件引入依赖

        <!--feign依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

备注:根据feign版本的不同,名称可能不一样,可以到官方进行查看feign的maven。
2.入口添加@EnableFeignClients

package com.ckmike.order_service;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {

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

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

3.编写商品服务客户端接口

package com.ckmike.order_service.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @ClassName ProductClient商品服务客户端
 * @Description TODO:描述该接口职责
 * @Author ckmike
 * @Date 18-11-22 下午4:10
 * @Version 1.0
 * @Copyright ckmike
 **/
@FeignClient(name="product-service")
public interface ProductClient {

    @GetMapping("/api/v1/product/find")
    String findById(@RequestParam(value = "id") int id);
}

备注:商品服务客户端接口的路由必须与商品服务对应路由保持一致。

订单服务接口实现

package com.ckmike.order_service.service.impl;

import com.ckmike.order_service.domain.ProductOrder;
import com.ckmike.order_service.service.OrderService;
import com.ckmike.order_service.service.ProductClient;
import com.ckmike.order_service.utils.JsonUtil;
import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Date;
import java.util.Map;
import java.util.UUID;

/**
 * OrderServiceImpl 简要描述
 * <p> TODO:描述该类职责 </p>
 *
 * @author ckmike
 * @version 1.0
 * @date 18-11-7 下午11:55
 * @copyright ckmike
 **/
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private ProductClient productClient;

    @Override
    public ProductOrder saveForRibbon(int userId, int productId) {
        // 获取商品信息
        Map<String,Object> obj = restTemplate.getForObject("http://product-service/api/v1/product/find?id="+productId,Map.class);

        ProductOrder productOrder = new ProductOrder();
        productOrder.setCreateTime(new Date());
        productOrder.setUserId(userId);
        productOrder.setTradeNo(UUID.randomUUID().toString());

        productOrder.setPrice(Double.parseDouble(obj.get("price").toString()));

        productOrder.setProductName(obj.get("name").toString());
        return productOrder;
    }

    @Override
    public ProductOrder saveForFeign(int userId, int productId) {
        String response = this.productClient.findById(productId);
        JsonNode obj = JsonUtil.str2JsonNode(response);

        ProductOrder productOrder = new ProductOrder();
        productOrder.setCreateTime(new Date());
        productOrder.setUserId(userId);
        productOrder.setTradeNo(UUID.randomUUID().toString());

        productOrder.setPrice(Double.parseDouble(obj.get("price").toString()));

        productOrder.setProductName(obj.get("name").toString());
        return productOrder;
    }
}

截图

启动EurekaServer、ProductService、OrderService.
技术分享图片

访问接口:
http://ckmikepc.lan:8781/api/v1/order/saveforfeign?user_id=1&product_id=1
技术分享图片

总结一下:
Feign是通过Ribbon实现的,具体可以查看相应的代码。更多详细信息请查看Feign相应文档,会对你理解Feign的使用和实现有很大帮助。在学会如何使用feign后,建议阅读一下Feign的源码,看看别人是怎么写出这种东西的。

以上是关于21 服务调用Feign高级的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud---Feign服务调用

SpringCloud之服务调用(feign)

第4篇:微服务之间的调用-feign

feign服务间调用超时时间

Feign来调用服务

SpringCloud-笔记5-中服务间两种调用方式-Feign