1、OpenFeign是什么?

Feign是一个声明式WebService客户端,使用Feign能让编写Web Service客户端更加简单,它的使用方法是定义一个服务接口然后在上面添加注解 。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡

有了Eureka,RestTemplate,Ribbon,我们就可以愉快地进行服务间调用了,但是使用RestTemplate还是不方便,我们每次都要进行这样的调用。

  1. @Autowired
  2. private RestTemplate restTemplate;
  3. // 这里是提供者A的ip地址,但是如果使用了 Eureka 那么就应该是提供者A的名称
  4. private static final String SERVICE_PROVIDER_A = "http://localhost:8081";
  5. @PostMapping("/judge")
  6. public boolean judge(@RequestBody Request request) {
  7. String url = SERVICE_PROVIDER_A + "/service1";
  8. // 是不是太麻烦了???每次都要 url、请求、返回类型的
  9. return restTemplate.postForObject(url, request, Boolean.class);
  10. }

这样每次都调用 RestRemplateAPI 是否太麻烦,我能不能像调用原来代码一样进行各个服务间的调用呢?

聪明的小朋友肯定想到了,那就用 映射 呀,就像域名和IP地址的映射。我们可以将被调用的服务代码映射到消费者端,这样我们就可以 “无缝开发” 啦。

OpenFeign也是运行在消费者端的,使用Ribbon进行负载均衡,所以OpenFeign直接内置了Ribbon。

在导入Open Feign之后我们就可以愉快编写Consumer端代码了。

  1. // 使用 @FeignClient 注解来指定提供者的名字
  2. @FeignClient(value = "eureka-client-provider")
  3. public interface TestClient {
  4. // 这里一定要注意需要使用的是提供者那端的请求相对路径,这里就相当于映射了
  5. @RequestMapping(value = "/provider/xxx",
  6. method = RequestMethod.POST)
  7. CommonResponse<List<Plan>> getPlans(@RequestBody planGetRequest request);
  8. }

然后我们在 Controller 就可以像原来调用 Service 层代码一样调用它了。

  1. @RestController
  2. public class TestController {
  3. // 这里就相当于原来自动注入的 Service
  4. @Autowired
  5. private TestClient testClient;
  6. // controller 调用 service 层代码
  7. @RequestMapping(value = "/test", method = RequestMethod.POST)
  8. public CommonResponse<List<Plan>> get(@RequestBody planGetRequest request) {
  9. return testClient.getPlans(request);
  10. }
  11. }

2、能干嘛?

1、Feign能干什么

Feign编写Java Http客户端变得更容器

前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模板化的调用方法,但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多次调用,所以通常都会针对每个微服务自行封装一些客户端类来保证这些依赖服务的调用,所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),

2、Feign集成了Ribbon

利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。

3、Feign和OpenFeign两者区别?

image.png

4、OpenFeign的使用步骤

1、接口+注解(微服务调用接口+@FeignClient)

2、新建cloud-consumer-feign-order80,Feign用在消费端。

3、POM

  1. <dependencies>
  2. <!--openfeign-->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-starter-openfeign</artifactId>
  6. </dependency>
  7. <!--eureka client-->
  8. <dependency>
  9. <groupId>org.springframework.cloud</groupId>
  10. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  11. </dependency>
  12. <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  13. <dependency>
  14. <groupId>com.atguigu.springcloud</groupId>
  15. <artifactId>cloud-api-commons</artifactId>
  16. <version>${project.version}</version>
  17. </dependency>
  18. <!--web-->
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-actuator</artifactId>
  26. </dependency>
  27. <!--一般基础通用配置-->
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-devtools</artifactId>
  31. <scope>runtime</scope>
  32. <optional>true</optional>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.projectlombok</groupId>
  36. <artifactId>lombok</artifactId>
  37. <optional>true</optional>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-test</artifactId>
  42. <scope>test</scope>
  43. </dependency>
  44. </dependencies>

4、YML

  1. server:
  2. port: 80
  3. eureka:
  4. client:
  5. register-with-eureka: false
  6. service-url:
  7. defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
  8. #设置feign客户端超时时间(OpenFeign默认支持ribbon)
  9. ribbon:
  10. #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
  11. ReadTimeout: 5000
  12. #指的是建立连接后从服务器读取到可用资源所用的时间
  13. ConnectTimeout: 5000
  14. logging:
  15. level:
  16. # feign日志以什么级别监控哪个接口
  17. com.atguigu.springcloud.service.PaymentFeignService: debug

5、主启动

@EnableFeignClients

6、业务类

业务逻辑接口+@FeignClient配置调用provider服务
新建PaymentFeignService接口并新增注解@FeignClient
控制层Controller
image.png

image.png