SpringCloud 服务调用 Feign

朱雀 2022-03-15 11:52 467阅读 0赞

这节我们来实现下服务调用,之前在Ribbon中实现的时候,发现调用其他的服务还是需要通过RestTemplate来调用,现在既然所有的服务都注册到了SpringCloud中,那么我们是否有其他的方式呢。

SpringCloud提供了Feign,直接通过服务名称和对应接口进行调用,这样,就像调用项目自己的服务内容一样

(一)简介

Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并使用Spring Web中默认使用的HttpMessageConverters。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。

(二)实现

工程依旧是基于之前的工程继续实现,之前的项目Spring Eureka实现,Spring Cloud Ribbon实现

在项目中建立新的module,和之前建立项目一样,只是配置中增加Feign

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhcnJ5cHR0ZXI_size_16_color_FFFFFF_t_70

我这边工程名字是SPRING-FEIGN-SERVICE

对应新增的pom.xml内容是:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

在项目的启动类上加上注解@EnableDiscoveryClient加入SpringCloud Eureka服务端,加上注解@EnableFeignClients声明为声明性REST客户端:Feign

  1. package com.springcloudfeign.feign;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. import org.springframework.cloud.openfeign.EnableFeignClients;
  6. @SpringBootApplication
  7. @EnableDiscoveryClient
  8. @EnableFeignClients
  9. public class FeignApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(FeignApplication.class, args);
  12. }
  13. }

然后建立一个FeignDemoService的接口:

  1. package com.springcloudfeign.feign.service;
  2. import org.springframework.cloud.openfeign.FeignClient;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. @FeignClient(value = "SPRING-CLIENT-01")
  6. public interface FeignDemoService {
  7. @RequestMapping(value = "getInfo/show" , method = RequestMethod.GET)
  8. String getPortTwo();
  9. }

接口上方加上@FeignClient(value = “SPRING-CLIENT-01”)说明这个接口调用的是之前微服务项目SPRING-CLIENT-01的服务,然后通过 @RequestMapping(value = “getInfo/show” , method = RequestMethod.GET)声明调用的是SPRING-CLIENT-01中web中/getInfo/show这个接口。

增加FeignController:

  1. package com.springcloudfeign.feign.web;
  2. import com.springcloudfeign.feign.service.FeignDemoService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController("/")
  7. public class FeignController {
  8. @Autowired
  9. FeignDemoService feignDemoService ;
  10. @GetMapping("getInfoTwo")
  11. public String getInfoTwo()
  12. {
  13. return feignDemoService.getPortTwo();
  14. }
  15. }

这里写完之后 feignDemoService下会有红线提示,但不要紧,可以直接执行。

配置文件application.properties内容:

  1. server.port = 10010
  2. eureka.client.serviceUrl.defaultZone= http://localhost:12345/eureka/
  3. spring.application.name= SPRING-FEIGN-SERVICE
  4. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testmysql
  5. spring.datasource.username=root
  6. spring.datasource.password=123456
  7. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  8. spring.datasource.max-idle=10
  9. spring.datasource.max-wait=10000
  10. spring.datasource.min-idle=5
  11. spring.datasource.initial-size=5

然后启动之前的CLOUD-SERVER,以端口号10001,10002依次启动SPRING-CLIENT-01服务,启动Ribbon服务,再启动这个Feign服务。我这边端口号配置的是10010,在postman或者浏览器中输入:

  1. http://localhost:10010/getInfoTwo

多刷几次,可以看到分别调用了两个接口的的SPRING-CLIENT-01服务。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhcnJ5cHR0ZXI_size_16_color_FFFFFF_t_70 1

20190302155100804.png

执行的结果和ribbon不同,是依次调用两个端口

本次代码github地址:源码地址

发表评论

表情:
评论列表 (有 0 条评论,467人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringCloud 服务调用 Feign

    这节我们来实现下服务调用,之前在Ribbon中实现的时候,发现调用其他的服务还是需要通过RestTemplate来调用,现在既然所有的服务都注册到了SpringCloud中,那