Spring Cloud入门实战(三) Feign--声明式Rest调用

Feign简介

Feign是Netflix开发的声明式、模板化的HTTP客户端。它可以帮我们更快捷的调用HTTP API。
使用起来非常简单,创建接口,加上注解就能使用。dubbo里面要调用其他服务的接口,首先要在提供服务的服务里面把接口用dubboservice暴露出来,然后要使用的地方还要引入,需要配置,很麻烦,虽然可以用注解,但是还是觉得不方便,而Feign写个接口,弄个注解就可以使用了,就很方便。

整合Feign

上一节 的Ribbon项目中或者新建一个项目添加Feign的依赖。

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

创建一个Feign接口。添加@FeignClient注解。

@FeignClient(name = "eureka-client") //name 指定了要调用哪个微服务的接口
@Service
public interface UserFeignClient {

    @RequestMapping("/{id}") //这个value要和服务提供者接口value一样 ,就是根据这个找到请求的
    String getUserInfo(@PathVariable Long id); //接口名称尽量和需要调用的接口一致(不一致也没关系),参数要一致
}

然后在调用的时候换成用FeignClient调用。

@RestController
public class UserController {
    
    @Autowired
    private UserFeignClient userFeignClient;

    @RequestMapping("/user/{id}")
    public String getUserInfo(@PathVariable Long id){

//        return restTemplate.getForObject("http://eureka-client/"+id,String.class);
        return userFeignClient.getUserInfo(id); //换成这样的调用方式。
    }
}

重启服务,调用成功。

Feign的请求日志

很多情况下,需要了解Feign的处理请求的细节。这样就可以用到Feign的请求日志了

Feign对日志的处理非常灵活,可以为每个Feign客户端指定日志记录策略,每个Feign客户端都会创建一个logger,默认情况下,logger的名称是Feign的接口完整类名。Feign的日志打印只会对DEBUG级别做出响应。
可以为每个客户端配置自己的日志级别logger.level有以下几个值

  • NONE:不记录日志(默认)
  • BASIC:仅记录请求方法、URL、响应状态代码以及执行时间。
  • HEADERS:记录BASIC级别基础的请求和响应的header。
  • FULL:记录请求和响应的header,body和元数据。

新增一个配置类。

@Configuration
public class FeignLogConfiguration {

    //import feign.Logger;
    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

修改yml配置文件。

logging:
  level:
    com.springcloud.ribbon.feign.UserFeignClient: DEBUG # 这里就是UserFeignClient的引用路径

然后在之前的UserFeignClient 加上configuration = FeignLogConfiguration.class
在这里插入图片描述
启动,访问接口。
在这里插入图片描述
就能看到效果了。修改日志的级别就是在配置类里修改就行。

使用Feign构造多参数请求

get请求的多参数

方法一:@RequestParam 注解,有几个参数加几个。

@FeignClient(name = "eureka-client",configuration = FeignLogConfiguration.class)
@Service
public interface UserFeignClient {
    @RequestMapping("/get")
    String getUser(@RequestParam("id") Long id, @RequestParam("username") String username);
}

方法二:用Map构建

@FeignClient(name = "eureka-client",configuration = FeignLogConfiguration.class)
@Service
public interface UserFeignClient {
    @RequestMapping("/get")
    String getUser2(@RequestParam HashMap<String,Object> map);
}

post请求包含多个参数

这就更简单了,直接构建对象就行。

@FeignClient(name = "eureka-client",configuration = FeignLogConfiguration.class)
@Service
public interface UserFeignClient {
    @RequestMapping("/post")
    String getUser2(@RequestBody User user);
}
发布了41 篇原创文章 · 获赞 9 · 访问量 2526

猜你喜欢

转载自blog.csdn.net/weiwei_six/article/details/103755784