欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一起来学SpringCloud 声明式Http调用Feign

程序员文章站 2024-02-14 12:51:58
...

序言

​ 作为Spring Cloud的子项目之一,Spring Cloud OpenFeign以将OpenFeign集成到Spring Boot应用中的方式,为微服务架构下服务之间的调用提供了解决方案。首先,利用了OpenFeign的声明式方式定义Web服务客户端;其次还更进一步,通过集成Ribbon或Eureka实现负载均衡的HTTP客户端。

此文章仅限入门 SpringCloud版本为 Greenwich

​ 早期版本的 FeignSpring Cloud 团队集成在 spring-cloud-netflix 子项目下,但如今 Spring Cloud 团队将 Spring Cloud Feign 独立成一个单独的 spring-cloud-openfeign 项目

使用

导入依赖

<dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-openfeign</artifactId>
      </dependency>
</dependencies>

然后是yml

server:
  port: 7001
spring:
  application:
    name: spring-cloud-action-server-order
eureka:
  instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8761/eureka/

然后是主函数

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ATestApplication {
    public static void main(String[] args) {
        SpringApplication.run(ATestApplication.class, args);
    }
}

我们知道Ribbon 使用RestTemplate 那样的调用,但是那样调用的话非常的不方便,也略显丑陋,那么我们使用的Feign就完全可以解决这样的问题了,让调用Http请求像调用本地服务那样简单。

我们声明一个接口

@FeignClient(name = "spring-cloud-action-server-order", decode404 = true)
//@FeignClient(name = "products", url = "http://localhost:7002/getProducts")
//@FeignClient(value = "product", serviceId = "spring-cloud-action-server-order", path = "/getProducts", decode404 = true)
public interface ProductService {
   //这里的的
    @GetMapping("/getProducts")
    String getProducts();
}
  • name:指定 FeignClient 的名称,该属性会作为微服务的名称,用于服务发现
  • value:同 name 字段互通
  • serviceId:指定服务ID,每个注册到注册中心上的客户端都会有对应的 serviceId 一般是 spring.application.name,与 namevalue 互通
  • url: 一般用于调试,可以指定一个详细地址(http://localhost:7002/getProducts)
  • path: 请求统一路径,可以看成 @RequestMapping("/products")
  • decode404:404 错误时,调用 decoder 进行解码,否则抛出 FeignException
  • fallback:发生错误时,回调 hystrix 类/方法(后面会详细介绍)

然后在Controller中这样使用即可。

@RestController
public class OrderController {

    @Autowired
    private ProductService productService;

    @GetMapping
    public String query() {
        return serverBService.query();
    }
}

是不是很方便。

Feign拦截器

​ 使用Spring Cloud时,通常会用 Feign 来调用远程服务,比如远程服务的权限验证,需要在 header 中传递 token之类的。在方法中显示传递又过于麻烦了,这时候就可以考虑使用 Feign 提供的RequestInterceptor 接口,只要实现了该接口,那么Feign每次做远程调用之前都可以被它拦截下来在进行包装。

只需要实现一个 RequestInterceptor 即可。

@Configuration
public class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("token", "jwt");
    }
}

比如你在调试 具有jwt token传输的服务的时候,为了方便测试一般可以自己附加一个这样就方便多了。

在服务的另外一端就可以通过 这样获取到了

@RestController
public class ProductController {
    @GetMapping("/getProducts")
    public String getProducts(@RequestHeader String token) {
        return token;
    }
}

此文章仅限入门,切记啊不会用找不到多去官网看文档!