SpringCloud微服务——feign集成实现服务间的接口调用

feign集成实现服务间的接口调用

feign说明:
feign整合了Ribbon(负载均衡)和Hystrix(熔断器),因此在SpringCloud微服务中,可以使用feign来替代Ribbon和Hystrix使用。
微服务中,feign的客户端可以单独放在一个子模块中,其中只需要写好一个feign客户端即可,feign客户端可以发http请求,从而调用其他服务的接口。

名词定义:
消费者:需要调用别的服务的一方;
生产者:服务被调用的一方;
都需要在注册中心eureka中注册。

SpringCloud微服务——feign集成实现服务间的接口调用_第1张图片
SpringCloud微服务——feign集成实现服务间的接口调用_第2张图片

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);

你可能感兴趣的:(分布式,java,其他)