Feign是一个声明式的Web服务客户端(Web服务客户端就是Http客户端),让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可。
其一般是在项目中进行声明使用。我认为这样做的缺点是使feign与项目强耦合。
我认为将feign提出做为一个单独module来处理是一个相对较好的解决方案。
以下是相关的代码:
1、pom中增加以下依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
2、定义client
@FeignClient(value = "userservice") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); } client中相关的类也要声明 @Data public class User { private Long id; private String username; private String address; }
3、配置feign的日志输出级别(这步可以视情况而定)
public class DefaultFeignConfiguration { @Bean public Logger.Level logLevel(){ return Logger.Level.BASIC; } } Logger.Level包括: NONE,BASIC,HEADERS,FULL 四种;
4、引入该module
在需要使用feign的module中增加pom配置:
<!--引入feign的统一api-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
</dependency>
Application类中添加@EnableFeignClients(clients = {UserClient.class})注解
当定义的feignclient不在springbootapplication的扫描包范围时,这些feignclient无法使用。有两种解决方案:
a、 方案一:指定feignClient所在包。全部扫描 @EnableFeignClients(basePackage="cn.itcast.feign.clients")
b、 方案二:指定feignclient字节码。可以指定多个,用到哪个指定哪个
@EnableFeignClients(clients={UserClient.class,XXX.class})
如只用一个可以这样写:
@EnableFeignClients(clients=UserClient.class)