您的位置:首页 - 文章 - 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/

发表评论