Spring Cloud OpenFeign 是声明式的服务调用工具,它整合了Ribbon 和Hystrix ,拥有负载均衡和服务容错功能
Feign 是声明式的服务调用工具,我们只需创建一个接口并用注解的方式来配置它,就可以实现对某个服务接口的调用,简化了直接使用RestTemplate 来调用服务接口的开发量。Feign 具备可插拔的注解支持,同时支持Feign 注解、JAX-RS注解及SpringMvc注解。当使用Feign时,Spring Cloud集成了Ribbon 和Eureka 以提供负载均衡的服务调用及基于Hystrix 的服务容错保护功能。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
日志的级别分为四种:
日志的级别如果没有特殊要求,一般使用 NONE、BASIC 两个就好了,默认是NONE
配置方式:
先创建一个配置类
package cuit.epoch.pymjl.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
/**
* 在启动类的注解@EnableFeignClients上指定
* 局部生效就在@FeignClient中指定,不能加@Configuration注解
*
* @author Pymjl
* @version 1.0
* @date 2022/9/1 13:17
**/
public class OpenFeignConfig {
@Bean
public Logger.Level feignLogLevel() {
// 日志级别为BASIC
return Logger.Level.FULL;
}
}
如果要全局生效,将其放到 启动类的@EnableFeignClients 这个注解中
@SpringBootApplication
@EnableFeignClients(defaultConfiguration = OpenFeignConfig.class)
public class OpenFeignApplication {
public static void main(String[] args) {
SpringApplication.run(OpenFeignApplication.class, args);
}
}
如果是局部生效,则把它放到对应的@FeignClient 这个注解中
@FeignClient(value = "user-service",configuration = OpenFeignConfig.class)
# 针对某个微服务的配置 userservice:微服务名称 FULL:日志级别
feign.client.config.userservice.logger-level=FULL
# 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
#feign.client.config.default.logger-level=FULL
我们在通过 Feign 去调用接口,难免会遇到超时的问题,我们可以在 yml 文件设置超时属性,防止系统抛出超时异常
feign:
client:
config:
# 全局配置(default 默认就是适用于全部微服务)
default:
connectTimeout: 100000
readTimeout: 100000
# 单独配置
user-service:
connectTimeout: 300000
readTimeout: 300000
类型 | 作用 | 说明 |
---|---|---|
feign.Logger.Level | 修改日志级别 | 包含四种不同的级别:NONE、BASIC、HEADERS、FULL |
feign.codec.Decoder | 响应结果的解析器 | http远程调用的结果做解析,例如解析json字符串为java对象 |
feign.codec.Encoder | 请求参数编码 | 将请求参数编码,便于通过http请求发送 |
feign. Contract | 支持的注解格式 | 默认是SpringMVC的注解 |
feign. Retryer | 失败重试机制 | 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试 |
一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的@Bean覆盖默认Bean即可
常用的配置如下:
feign:
hystrix:
enabled: true #在Feign中开启Hystrix
compression:
request:
enabled: false #是否对请求进行GZIP压缩
mime-types: text/xml,application/xml,application/json #指定压缩的请求数据类型
min-request-size: 2048 #超过该大小的请求会被压缩
response:
enabled: false #是否对响应进行GZIP压缩
logging:
level: #修改日志级别
com.macro.cloud.service.UserService: debug
1.先在服务提供者正常的编写service 代码,然后将service 注入进controller 完成controller 的编写
/**
* 用户控制器
*/
@RestController
@RequestMapping("user")
public class SysUserController {
@Autowired
private SysUserService sysUserService;
@GetMapping(value="/findByName")
public HttpResult findByName(@RequestParam String name) {
return HttpResult.ok(sysUserService.findByName(name));
}
}
2.在消费者端编写对应的FeignClient ,和我们平常的service接口没太大的区别,只是在上面加上对应的SpringMVC注解
/**注意value 的值要和nacos 中的服务提供者的名字相同*/
@FeignClient(value = "mall-admin")
public interface SysUserClient {
/**
* 注册
*
* @return {@code CommonResult}
*/
@GetMapping("/user/findByName")
HttpResult findByName(@RequestParam("name")String name);
}
3.然后编写对应的消费者controller
@RestController
@RequestMapping("aaa")
public class aaa {
@Resource
SysUserClient sysUserClient;
@GetMapping(value="/bbb")
public HttpResult save(@RequestParam String name) {
return HttpResult.ok(sysUserClient.findByName(name));
}
}
6,传递参数
注解 | 参数形式 |
---|---|
@RequestHeader(“param”) | 如果有中文,要进行 URL 编码 放在请求的 Head 头中 |
@RequestParam(“param” | GET 请求 |
@PathVariable(“param”) | 请求路径上 |
@RequestBody | POST 请求的 JSON |
Form 表单 |
至此,就可以快乐使用了