Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

OpenFeign

什么是OpenFeign组件

最先出现的Feign组件是Netflix推出的Feign,但是现在Feign已经进入维护状态,所以Spring团队吸取Feign的精华推出了OpenFeign,为了减少程序猿的开发成本,所以这两个组件的使用方式是一样的

简介

OpenFeign其实就是一个Rest Client,和RestTemplate作用是一致的都是一个http客户端。

RestTemplate:Spring框架封装HttpClient对象

OpenFeign:伪HttpClient客户端对象 他可以使服务间通信变得更加简单 Feign默认集成了Ribbon 实现请求负载均衡

使用简单:写一个接口加一个注解,调用服务代码更加简单,自动完成数据传递传承中对象转换

为什么使用OpenFeign

1、RestTemplate使用问题:路径写死、不能自动转换响应结果为对应对象、必须集成ribbon实现负载均衡

2、OpenFeign组件解决了RestTemplate实现服务间通信所有问题

SpringCloud整合OpenFeign

下面样例建立两个服务category和product为例

当然首先就是在父项目下创建两个SpringBoot项目这里就不详细介绍了

主要的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--引入springbootweb-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入consul依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- 引入健康检查依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

好了下面开始配置OpenFeign

依旧是老套路,引入依赖(在这里我们是category调用product 所以我们要在调用放导入依赖)

1
2
3
4
5
<!--        加入openfeign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

修改配置文件(因为我日常挂着代理,经常导致访问超时,没有需求可以不加)

1
2
3
4
5
6
7
8
feign:
client:
config:
default:
#建立连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间
ConnectTimeOut: 5000
#指建立连接后从服务端读取到可用资源所用的时间
ReadTimeOut: 5000

添加注解

1
2
3
4
5
6
7
8
9
10
11
12
/**
* @author bestrookie
* @date 2021/8/6 10:23 上午
*/
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class CategoryApplication {
public static void main(String[] args) {
SpringApplication.run(CategoryApplication.class,args);
}
}

然后我们创建一个包,这个包的作用就是调用其他服务的接口

image-20210806140341765

然后在需要到的地方注入,使用即可

image-20210806140518514

是不是方便了很多,Feign也是集成了负载均衡,默认使用的依旧是轮询策略。

服务通信之间参数传递和响应处理

参数类型:1、传递零散类型 2、传递对象类型 3、数组或者集合类型参数

零散类型方式传递参数

queryString方式传递参数:?name=zhangsan

1
2
3
4
@GetMapping("/get")
public String getInfo(String name,Integer age){
return name+" "+age+" "+ port;
}

对应接口

1
2
@GetMapping("/get")
String getInfo(@RequestParam String name, @RequestParam Integer age);

注意:一定要加注解@RequestParam,如果是旧版还需要填写对应的value @RequestParam(value = "name"),而且value一定要和参数对应,,一般为了防止报错,最好是一步到位,不管旧版新版都填加上value对应的值

路径传递参数 url/zhangsan

1
2
3
4
5
    @GetMapping("test/{name}/{age}")
public String getAll(@PathVariable("name") String name, @PathVariable(value = "age") Integer age){
return name+" "+age+" "+port;
}
}

对应接口

1
2
@GetMapping("test/{name}/{age}")
String getAll(@PathVariable(value = "name") String name, @PathVariable(value = "age") Integer age);

注意:在接口声明时,必须添加注解@PathVarable并且value与参数对应,还需要和原来接口一致

传递对象

提示:两个服务都用到了一个实体类,所以我们通常将实体类创建在父项目中,这样所有的项目都可以访问这个实体类

创建一个实体

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @author bestrookie
* @date 2021/8/6 3:46 下午
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProductPojo {
private Integer id;
private String name;
private Double price;
private Date bir;
}

在product服务中创建接口

1
2
3
4
5
@PostMapping("post")
public String product(@RequestBody ProductPojo productPojo){
System.out.println(productPojo.toString());
return "ok";
}

在category服务中对应的接口

1
2
@PostMapping("post")
String product(@RequestBody ProductPojo productPojo);

在这里要注意使用@RequestBody,一般情况下是使用此注解完成使用对象的信息传递。

传递数组,集合类型

OpenFeign在传递数组类型参数时必须在声明时使用@RequestParam注解标识

例:

1
2
@GetMapping("/test")
String test(@RequestParam("ids") String[] ids);

评论