一起来学SpringCloud 声明式Http调用Feign
序言
作为Spring Cloud的子项目之一,Spring Cloud OpenFeign以将OpenFeign集成到Spring Boot应用中的方式,为微服务架构下服务之间的调用提供了解决方案。首先,利用了OpenFeign的声明式方式定义Web服务客户端;其次还更进一步,通过集成Ribbon或Eureka实现负载均衡的HTTP客户端。
此文章仅限入门 SpringCloud版本为 Greenwich
早期版本的 Feign
被 Spring 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
,与name
和value
互通 -
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;
}
}
此文章仅限入门,切记啊不会用找不到多去官网看文档!
上一篇: Windows ❀ 本地认证
下一篇: URL和URI浅理解