• Feign初始


    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

  • 相关阅读:
    Web项目的WEB-INF目录使用说明以及重定向与转发
    HTTP中的重定向和请求转发的区别
    001杰信-创建MyEclipse与maven项目
    009Maven_建立私服——报错问题
    008Maven_建立私服
    007Maven_在Myeclipse创建web项目
    006Maven_在Myeclipse创建java项目
    005Maven_Myeclipse和Maven整合
    微服务架构下分布式事务方案
    推荐:Java性能优化系列集锦
  • 原文地址:https://www.cnblogs.com/daihang2366/p/13683328.html
Copyright © 2020-2023  润新知