前言
在微服务中,有多个服务:A、B、C等等。如果前端访问A服务做一个业务,其中一个环节是需要B服务的支持,也就是在A服务中,要调用B服务,这个时候,可以使用Feign来实现。假定A调用B,则A为客户端,B为服务端。服务端的写法,不用说了,就和Spring MVC中Contoller的代码写法一样。以下就介绍客户端的写法。
添加jar包
这里只是给出了feign的包,其他的依赖包根据项目而定:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
开启feign支持
起启动类上,加入注解:@EnableFeignClients。
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
@ComponentScan({"com.boco.fyk.controller.**", "com.boco.fyk.service.**", "com.boco.fyk.config.**", "com.boco.fyk.core.config.**"})
@MapperScan("com.boco.fyk.dao.**")
public class BasicApplication {
public static void main(String[] args) {
SpringApplication.run(BasicApplication.class, args);
}
}
定义Feign客户端
编写一个接口:
@FeignClient("fyk-business-cxf")
public interface QqOnlineFeignClient {
@GetMapping("/testQqOnline/qqCheckOnline")
public String qqCheckOnline(@RequestParam String qqCode);
}
这里,fyk-business-cxf就是Feign服务端的服务名(spring.application.name配置指定)。然后/testQqOnline/qqCheckOnline就是指定的是客户端要方位服务端的地址:如下,就是服务端的代码,Feign客户端要调的就是以下方法:
@RestController
@RequestMapping("/testQqOnline")
public class TestQqOnlineFeignService {
@GetMapping("qqCheckOnline")
public String qqCheckOnline(String qqCode) throws Exception {
String resultStr = qqOnLineService.qqCheckOnline(qqCode);
return resultStr;
}
}
测试结果
写好如下代码之后,就测试一下:
@RestController
@RequestMapping("testFeign")
public class TestFeignContoller {
@Autowired
private QqOnlineFeignClient qqOnlineFeignClient;
@GetMapping("test")
public String test(String qqCode) {
// do something
return qqOnlineFeignClient.qqCheckOnline(qqCode);
}
}
问题
在使用Feign的时候,会遇到一些问题,解决方案查看以下具体的文章:
- Feign客户服务端配置了server.servlet.context-path,客户端无法调用
- Feign客户端指定为Get方式,但是服务端接收的请求却为Post方式
- Feign客户端连接超时:feign.RetryableException: Read timed out executing xxxxxxxxxx
- 如果是在客户端和服务端都加了oauth2认证方式,那么客户端在调用客户端的时候,也要带上token,Feign带token的方式可以参见:基于security+oauth2的安全保护(三):资源服务