Feign简介

Feign是Netflix开发的声明式,模板化的HTTP客户端,其灵感来自Retrofit,JAXRS-2.0以及WebSocket.
Feign可帮助我们更加便捷,优雅的调用HTTP API。
在SpringCloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。
Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka,
从而让Feign的使用更加方便

Feign和Ribbon的联系
Ribbon是一个基于 HTTP 和 TCP 客户端 的负载均衡的工具。它可以 在客户端 配置
RibbonServerList(服务端列表),使用 HttpClient 或 RestTemplate 模拟http请求,步骤相当繁琐。
Feign 是在 Ribbon的基础上进行了一次改进,是一个使用起来更加方便的 HTTP 客户端。采用接口的
方式, 只需要创建一个接口,然后在上面添加注解即可 ,将需要调用的其他服务的方法定义成抽象方
法即可, 不需要自己构建http请求。然后就像是调用自身工程的方法调用,而感觉不到是调用远程方
法,使得编写客户端变得非常容易

整合Feign

pom.xml

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

启动类

 @SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {

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

Web层

 @RestController
@RequestMapping("/api/v1/order")
public class OrderController {


@Autowired(required = false)
private ProductOrderServiceImpl productOrderService;


@RequestMapping("/save")
public Object save(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId){

return productOrderService.save(userId, productId);
}

}

Bo类

/**
* 商品订单实体类
*/
public class ProductOrder implements Serializable {


private int id;

/**
* 商品名称
*/
private String productName;

/**
* 订单号
*/
private String tradeNo;

/**
* 价格,分
*/
private int price;


private Date createTime;


private int userId;

private String userName;


public int getUserId() {
return userId;
}

public void setUserId(int userId) {
this.userId = userId;
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getProductName() {
return productName;
}

public void setProductName(String productName) {
this.productName = productName;
}

public String getTradeNo() {
return tradeNo;
}

public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}

public int getPrice() {
return price;
}

public void setPrice(int price) {
this.price = price;
}

public Date getCreateTime() {
return createTime;
}

public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}

Fegin客户端

 /**
* 商品服务客户端
*/
@FeignClient(name = "product-service")
public interface ProductClient {


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


}

Service层

 @Service
public class ProductOrderServiceImpl {


@Autowired(required = false)
private ProductClient productClient;

public ProductOrder save(int userId, int productId) {

String response = productClient.findById(productId);

JsonNode jsonNode = JsonUtils.str2JsonNode(response);

ProductOrder productOrder = new ProductOrder();
productOrder.setCreateTime(new Date());
productOrder.setUserId(userId);
productOrder.setTradeNo(UUID.randomUUID().toString());
productOrder.setProductName(jsonNode.get("name").toString());
productOrder.setPrice(Integer.parseInt(jsonNode.get("price").toString()));
return productOrder;
}

}

Util类

 /**
* json工具类
*/
public class JsonUtils {

private static final ObjectMapper objectMappper = new ObjectMapper();

/**
* json字符串转JsonNode对象的方法
*/
public static JsonNode str2JsonNode(String str){
try {
return objectMappper.readTree(str);
} catch (IOException e) {
return null;
}
}


}

注:eureka-server和prduct-service参考前面的,直接启动

测试:

http://localhost:8781/api/v1/order/save?user_id=1&product_id=1

{
"id": 0,
"productName": "\"iphonex data from port=8771\"",
"tradeNo": "6b9b6530-a1f8-42d8-9a17-1beda890a91e",
"price": 9999,
"createTime": "2019-10-17T05:58:09.717+0000",
"userId": 1,
"userName": null
}
{
"id": 0,
"productName": "\"iphonex data from port=8773\"",
"tradeNo": "6b668929-4280-44cc-9c7c-401ca85e6550",
"price": 9999,
"createTime": "2019-10-17T06:32:16.971+0000",
"userId": 1,
"userName": null
}
{
"id": 0,
"productName": "\"iphonex data from port=8772\"",
"tradeNo": "3e1a4887-98e8-4910-93fb-4758c508c643",
"price": 9999,
"createTime": "2019-10-17T06:32:32.355+0000",
"userId": 1,
"userName": null
}

最新文章

  1. 通过JAVA程序测试闰年
  2. PHP Strom 配置less 并设置编译后在远程开发模式下自动上传css文件
  3. 在MyEclipse中配置Tomcat服务器
  4. Oracle计算时间差函数
  5. PHPCURL直接访问JSONRPC服务
  6. Spring Security(03)——核心类简介
  7. 前端css常用class命名id命名
  8. vue中mint-ui的filed的与blur事件结合实现检查用户输入是否正确
  9. Python全栈-magedu-2018-笔记9
  10. WordCount(java)
  11. Spring Boot 数据库连接池 Druid
  12. dedecms自定义表单时间时间戳值类型的转换方法
  13. Apache Kylin大数据分析平台的演进
  14. VSS_01
  15. 【ORACLE】 安装需要注意的问题(一)
  16. 简易jQuery插件
  17. OpenCV/CUDA/Qt 环境配置小结
  18. 仿美团ViewPager+GridView
  19. 关于jquery在页面初始化时radio控件选定默认值的问题
  20. mysql原理以及相关优化

热门文章

  1. Appium与Appium Desktop的区别
  2. shell管道与重定向
  3. ping通谷歌后发送QQ邮件通知
  4. linux下安装Elasticsearch
  5. Docker4-docker私库的搭建及常用方法-docker-registry方式
  6. Linux下beego及beego相关插件安装
  7. C++代码注入
  8. C# 读取控制台的Console.Write
  9. Docker学习1-CentOS 7安装Docker
  10. CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算?