0
点赞
收藏
分享

微信扫一扫

Spring Cloud 学习3. 声明式服务调用(Feign)

钎探穗 2022-06-28 阅读 55

Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。

Feign整合了Ribbon和Hystrix(关于Hystrix我们后面再讲),可以让我们不再需要显式地使用这两个组件。此外,Spring Cloud还对Feign提供了Spring MVC注解的支持,也使得我们在Web中可以使用同一个HttpMessageConverter。

Feign特征
- 可插拔的注解支持,包括Feign注解和JAX-RS注解;
- 支持可插拔的HTTP编码器和解码器;
- 支持Hystrix和它的Fallback;
- 支持Ribbon的负载均衡;
- 支持HTTP请求和响应的压缩。

demo

添加依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>twostepsfromjava.cloud</groupId>
<artifactId>twostepsfromjava-cloud-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../parent</relativePath>
</parent>

<artifactId>mall-web</artifactId>
<name>Spring Cloud Sample Projects: Mall</name>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
</project>

启动类

/**
* TwoStepsFromJava Cloud -- Mall Web Project
*
* @author CD826(CD826Dong@gmail.com)
* @since 1.0.0
*/
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}

接口调用类

/**
* Product Service
*
* @author CD826(CD826Dong@gmail.com)
* @since 1.0.0
*/
@FeignClient("PRODUCT-SERVICE")
public interface ProductService {

@RequestMapping(value = "/products", method = RequestMethod.GET)
List<Product> findAll();

@RequestMapping(value = "/products/{itemCode}", method = RequestMethod.GET)
Product loadByItemCode(@PathVariable("itemCode") String itemCode);

}

说明: 假如你的Service是单独编译一个jar包,那么在使用@EnableFeignClients注解时需要指定basePackages的值,如:

@EnableFeignClients(basePackages = "io.twostepsfromjava.cloud.**")
@EnableDiscoveryClient
@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}

controller

/**
* Product Controller
*
* @author CD826(CD826Dong@gmail.com)
* @since 1.0.0
*/
@RestController
@RequestMapping("/products")
public class ProductController {
@Autowired
private ProductService productService;

@RequestMapping(method = RequestMethod.GET)
public List<Product> list() {
return this.productService.findAll();
}

@RequestMapping(value = "/{itemCode}", method = RequestMethod.GET)
public Product detail(@PathVariable String itemCode) {
return this.productService.loadByItemCode(itemCode);
}
}

配置文件

server.port=8080

spring.application.name=MALL-WEB

eureka.client.service-url.defaultZone=http://localhost:8260/eureka

本文代码未测试。

举报

相关推荐

0 条评论