苦行僧DH

博客园 首页 新随笔 联系 订阅 管理

1、Feign介绍

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。

Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。

Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。

上面的可能太官方了,我们来看看白话文:

现在我们有两个服务,A和B,我们A需要去调用B的功能请求,但是我们如果手动实现,可以使用例如HttpClient等工具也可以实现,但缺点也很致命,例如当服务地址发生改变、请求数据很多、返回数据过于复杂等,而且我们手动网络请求代码会很繁杂,很大的增加了开发的难度,所以我们可以使用Feign这个HTTP客户端框架,它可以自动的到注册中心中拉取我们需要调用的服务的地址,然后我们通过定义接口的形式将被调用端的controller方法定义给复制过来,然后feign就会自动的解析,并在请求的时候封装参数和返回解析数据等。

使用Feign举个例子:
	服务A有一个请求方法,且A已在注册中心注册,服务名为A:
		@GetMapping("/a/sayHello")
		public Map<String,String> sayHello(){
			Map<String,String> resultMap = new HashMap<String,String>();
			resultMap.put("msg","SUCCESS");
			resultMap.put("data","Hello你好哇!");
			return resultMap;
		}
	然后我们需要在服务B去调用服务A:
		1、首先加入依赖
		2、启动类加入@EnableFeignClients代表本服务可以为Feign客户端
		3、定义接口AClient,用于调用服务A的请求方法,我们定义接口,实际的实现是Feign做的。
		4、定义接口的内容:
            @FeignClient("A") /*此处需要加入此注解并写入A的服务名*/
            @Component
            public interface VodClient {
                /**
                 * A的sayHello请求
                 */
                @GetMapping("/a/sayHello")
                Map<String,String> sayHello();
            }
       	5、然后我们在B服务的任意地方需要其调用A的sayHello请求的话,只需要在代码中将VodClient注入到你的代码中即可。
       		虽然我们定义的是接口,但是具体实现Feign会完成,**这就是我们用Feign的理由**。

2、基本使用

1、引入依赖:

<!--Spring Cloud依赖版本-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Hoxton.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--  -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、在客户端启动类上加入注解

@EnableFeignClients

3、创建Client接口

/**
 * xxx服务的客户端
 */
@FeignClient("需要调用的服务的名称") /*开启客户端注解*/
@Component	/*装载到Spring,可不加,有时候ide认为你这个类没装载到Spring,那你就加上,将就一下ide*/
public interface VodClient {
    /*
    	此处:
    		我们接口方法的定义要和服务端的controller完全一致,当然如果是swagger注解就不要了,还有要注意的
    		是如果是restful风格,那么@PathVariable比如要指定参数名。
    */
    @PostMapping("/vod/upload")
    R upload(MultipartFile file);
}

4、调用

在需要使用服务的地方将我们定义的Client接口注入即可。

5、注意

1、调用的服务必须要存在于注册中心

2、注册中心可以使用nacos,Eureka、Zookeeper等

3、注意client中路径不要写错

4、Feign是基于Ribbon实现的,具体的集群服务寻找其合适服务,负载均衡都是由ribbon实现,feign只是将调用方式封装为接口的方式

5、注册中心可以看我上一篇博客:https://www.cnblogs.com/daihang2366/p/13647365.html

posted on 2020-09-17 09:22  苦行僧DH  阅读(197)  评论(0编辑  收藏  举报