您的位置:首页 - 文章 - Spring Cloud - 正文

SpringCould-Feign

Feign是一个声明式、模板化的HTTP客户端,feign整合了ribbon,具有负载均衡的能力。
跨域请求,feign结合eureka注册中心,把不同的服务项目注册到eureka中,通过feign客户端进行调用来解决负载均衡问题
feign采用的是基于接口的注解
feign整合了ribbon,具有负载均衡的能力
整合了Hystrix具有熔断的能力
添加pom依赖。

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

启动类添加@EnableFeignClients

package com.sxpcwlkj.order_server;
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 OrderServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServerApplication.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

定义一个接口@FeignClient(name=“xxx”)指定调用哪个服务

/**
 * 下单  用Feign实现
 * @param memberId
 * @param productId
 * @return
 */
@RequestMapping("addOrderTwo")
public Object setlstOrderTwo(int memberId, int productId) {
    Order order = orderService.addOrderTwo(memberId,productId);
    return order;
}

新增接口

/**
 * 创建订单
 * @return
 */
Order addOrderTwo(int memberId ,int productId);

接口实现方法

@Resource
private ProductClient productClient;
@Override
public Order addOrderTwo(int memberId ,int productId) {
    Order  order =new Order();
    order.setCodeNumber(UUID.randomUUID().toString()); //订单号
    order.setMemberId(memberId);                       //用户Id
    order.setProductId(productId);                     //商品Id
    String response = productClient.selectById(productId);
    System.out.println(response.toString());
    JsonNode jsonNode = JsonUtils.str2JsonNode(response);
    order.setName(jsonNode.get("name").toString());                                                  //商品名称
    order.setPice(new BigDecimal(jsonNode.get("pice").toString()));                                  //商品价格
    order.setNum(Integer.valueOf(jsonNode.get("num").toString()));                                   //商品库存
    return order;
}

重点:新增一个接口类:ProductClient

package com.sxpcwlkj.order_server.service.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * 商品服务客户端
 */
@FeignClient(name = "product-service")
public interface ProductClient {
    @GetMapping("/api/v1/product/selectById")
    String selectById(@RequestParam(value = "id") int id);
}

解析:
1.接口传参要和被掉服务api的格式一致 @RequestParam 如果有这里也要加上
2.@GetMapping("/api/v1/product/selectById")  则是接口Api映射地址
3.@FeignClient(name = "product-service")          则是访问哪个服务 更具服务名访问
4、路径
5、Http⽅法必须对应
6、使⽤requestBody,应该使⽤@PostMapping
7、多个参数的时候,通过@RequestParam("id") int id)⽅式调⽤

http://localhost:8781/api/v1/order/addOrderTwo?memberId=1&productId=1


请求超时处理
1、ribbon和feign两个的区别和选择
选择feign
默认集成了ribbon
写起来更加思路清晰和⽅便
采⽤注解⽅式进⾏配置,配置熔断等⽅式⽅便
2、超时配置
默认optons readtimeout是60,但是由于hystrix默认是1秒超时
#修改调⽤超时时间

#超时设置
feign:
  client:
    config:
      default:
        connectTimeout: 7000
        readTimeout: 7000

可以再商品Api增加一个延时

try {
           TimeUnit.SECONDS.sleep(5);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

不配置则 会报超时异常

本文原创,作者:西决,其版权均为品创网络所有。如需转载,请注明出处:https://www.sxpcwlkj.com/springcould-feign/

发表评论