feign集成实现服务间的接口调用
feign说明:
feign整合了Ribbon(负载均衡)和Hystrix(熔断器),因此在SpringCloud微服务中,可以使用feign来替代Ribbon和Hystrix使用。
微服务中,feign的客户端可以单独放在一个子模块中,其中只需要写好一个feign客户端即可,feign客户端可以发http请求,从而调用其他服务的接口。
名词定义:
消费者:需要调用别的服务的一方;
生产者:服务被调用的一方;
都需要在注册中心eureka中注册。
1.生产者的服务接口准备(service的业务等省略)
就是需要被调用的接口方法:
@Autowired
private SearchService searchService;
@PostMapping("/saveCourseDocToES")
public AjaxResult saveCourseDocToES(@RequestBody CourseDoc courseDoc){
return searchService.saveCourseDocToES(courseDoc);
}
2.生产者(feign模块)导入feign的依赖包
既然是微服务,可以单独建一个模块,与要调用的服务模块(生产者)平级,放feign的客户端(通过feign客户端的http请求调用其他服务的接口)。
<!-- 导入feign的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3.编写FeignClient客户端(直接copy需要被调用的服务接口,不要方法体)
---- 客户端中的方法,和需要被调用的服务接口方法一一对应,不需要写方法体,此处只是将这个方法的调用,转成给对应服务名(此处是"SEARCH-SERVER")的http请求发出,找到真正的要调用的服务接口方法
/**
* 对应消费端通过feign客户端调用了客户端的方法,
* feign客户端根据调用的方法上的请求路径,发出http请求
*/
@FeignClient(value = "SEARCH-SERVER")
//@RequestMapping("")
public interface CourseDocFeignClient {
//此处不能用@Postmapping简写,需要用@RequestMapping
@RequestMapping(value = "/es/saveCourseDocToES",method = RequestMethod.POST)
AjaxResult saveCourseDocToES(@RequestBody CourseDoc courseDoc);
}
4.消费者端的启动类上,加上注解@EnableFeignClients
1.pom中引入feign客户端的包;
<dependency>
<groupId>cn.itsource.hb</groupId>
<artifactId>hrm-search-feign</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2.开启feign客户端接口:
@SpringBootApplication
@EnableEurekaClient //开启注册
@EnableCaching //开启缓存
@EnableFeignClients //开启feign接口注解
public class CourseServerApp1060 {
public static void main(String[] args) {
SpringApplication.run(CourseServerApp1060.class);
}
}
5.业务调用
1.需要调用服务的地方,直接注入FeignClient客户端;
2.用客户端对象直接调用对应的接口方法;
3.Feign客户端会根据被调用的方法,发出对应的http请求,调用真正需要被调用的服务中的接口方法;
@Autowired
private CourseDocFeignClient courseDocFeignClient;
-----------------------------------------
//调用对应的feign客户端,保存数据到索引库
courseDocFeignClient.saveCourseDocToES(courseDoc);