接上条博客的项目: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项目
注意需要勾选的服务
目前包结构
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("生产者实例名") //指定生产者实例名
package com.jk.service;
import org.springframework.cloud.openfeign.FeignClient;
//@FeignClient("生产者实例名") //指定生产者实例名称,在生产者的配置文件中
@FeignClient("springcloud-user-reg")
public interface UserService {
}
5.接着创建Controller
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
成功了!,看下打印台!调用成功
完成