Spring Cloud Alibaba------OpenFeign的使用

一,OpenFeign介绍

Spring Cloud OpenFeign 是声明式的服务调用工具,它整合了Ribbon 和Hystrix ,拥有负载均衡和服务容错功能

Feign 是声明式的服务调用工具,我们只需创建一个接口并用注解的方式来配置它,就可以实现对某个服务接口的调用,简化了直接使用RestTemplate 来调用服务接口的开发量。Feign 具备可插拔的注解支持,同时支持Feign 注解、JAX-RS注解及SpringMvc注解。当使用Feign时,Spring Cloud集成了Ribbon 和Eureka 以提供负载均衡的服务调用及基于Hystrix 的服务容错保护功能。

二,快速开始

1,引入依赖

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

2,配置OpenFeign 日志级别

日志的级别分为四种:

  • NONE :不记录任何日志信息,这是默认值。
  • BASIC :仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS :在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL :记录所有请求和响应的明细,包括头信息、请求体、元数据

日志的级别如果没有特殊要求,一般使用 NONE、BASIC 两个就好了,默认是NONE

配置方式:

  1. java代码

先创建一个配置类

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)
  1. 配置文件
# 针对某个微服务的配置  userservice:微服务名称  FULL:日志级别
feign.client.config.userservice.logger-level=FULL
# 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
#feign.client.config.default.logger-level=FULL

3, 超时配置

我们在通过 Feign 去调用接口,难免会遇到超时的问题,我们可以在 yml 文件设置超时属性,防止系统抛出超时异常

feign:
    client:
        config:
           # 全局配置(default 默认就是适用于全部微服务)
            default:
                connectTimeout: 100000
                readTimeout: 100000
            # 单独配置
            user-service:
                connectTimeout: 300000
                readTimeout: 300000

4,OpenFeign的其他配置

类型 作用 说明
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

5,编写对应的接口

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 表单

至此,就可以快乐使用了

你可能感兴趣的:(springCloud,java,spring,cloud,spring)