SpringCloud框架+Feign技术框架整合

接上条博客的项目:https://blog.csdn.net/SpringCYB/article/details/89147639

什么是Feign?

当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻。

那么有没有更好的解决方案呢?答案是确定的有,Netflix已经为我们提供了一个框架:Feign。

Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。

而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Hystrix(关于Hystrix我们后面再讲),可以让我们不再需要显式地使用这两个组件。

总起来说,Feign具有如下特性:

  • 可插拔的注解支持,包括Feign注解和JAX-RS注解;
  • 支持可插拔的HTTP编码器和解码器;
  • 支持Hystrix和它的Fallback;
  • 支持Ribbon的负载均衡;
  • 支持HTTP请求和响应的压缩。

这看起来有点像我们springmvc模式的Controller层的RequestMapping映射。这种模式是我们非常喜欢的。Feign是用@FeignClient来映射服务的。

1.在springcloud父级项目下创建一个springboot项目

SpringCloud框架+Feign技术框架整合

注意需要勾选的服务

SpringCloud框架+Feign技术框架整合

目前包结构

SpringCloud框架+Feign技术框架整合

2.在他的配置类配置Feign客户端

server:
  port: 8767

spring:
  application:
    name: springcloud-feign

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

3.在它的启动类上加注解
        @EnableEurekaClient
        @EnableFeignClients
        如果启动类不在根目录则需要扫面包(basePackages = "com.jk.*")

package com.jk.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableEurekaClient
//扫描包
@EnableFeignClients("com.jk.*")
//@ComponentScan("com.jk.*")
public class SpringcloudFeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudFeignApplication.class, args);
    }

}

4.创建service接口,并加上注解
  @FeignClient("生产者实例名") //指定生产者实例名

SpringCloud框架+Feign技术框架整合

package com.jk.service;


import org.springframework.cloud.openfeign.FeignClient;

//@FeignClient("生产者实例名") //指定生产者实例名称,在生产者的配置文件中
@FeignClient("springcloud-user-reg")
public interface UserService {
    
}

5.接着创建Controller

SpringCloud框架+Feign技术框架整合

6.在生产者的Controller中写一个方法,发布接口

    /**
     * feign技术
     */
    @GetMapping("select")
    @ResponseBody
    public String select(){
        System.out.println("frign调用成功..");
        return "success";
    }

7.feign消费者的service接口调用生产者发布的接口

package com.jk.service;


import org.springframework.cloud.openfeign.FeignClient;

//@FeignClient("生产者实例名") //指定生产者实例名称,在生产者的配置文件中
@FeignClient("springcloud-user-reg")
public interface UserService {
    //调用provider生产者发布的接口
    // 定义抽象方法,抽象方法没有方法体
	// 方法的定义和生产者controller中的方法保持一致
	// 包括请求的方式,传入的参数,方法定义和返回参数
	// @GetMapping("/selectUser/{id}")
	// public User selectUser(@PathVariable("id") Integer userId);
    @GetMapping("select")
    public String select();
}

8.feign消费者的Controller中

    @GetMapping("select")
    public String select(){
        String resule = userService.select();
        return resule;
    }

9.在配置类加上@ComponentScan("com.jk.*")注解扫描

10.启动项目访问接口看看是否成功调用Feign

SpringCloud框架+Feign技术框架整合

成功了!,看下打印台!调用成功

SpringCloud框架+Feign技术框架整合

完成