文章目录
- 一、 什么是 Feign
- 二、 什么是声明式,有什么作用,解决什么问题?
- 三、Feign入门案例
-
- 1.设计需求
- 2.服务结构
- 3.编写service服务
-
- 3.1 创建项目
- 3.2 添加依赖
- 3.3 声明接口
- 4.编写provider服务
-
- 4.1 创建项目
- 4.2 添加依赖
- 4.3 配置文件设置
- 4.4 服务实现
- 4.5 启动类
- 5.编写consumer服务
-
- 5.1 创建项目
- 5.2 添加依赖
- 5.3 配置信息
- 5.4 创建接口
- 5.5 创建控制器
- 5.6 创建启动器
- 5.7 启动测试
一、 什么是 Feign
Feign是一种声明式、模板化的HTTP客户端(仅在 consumer 中使用)。
二、 什么是声明式,有什么作用,解决什么问题?
声明式调用就像调用本地方法一样调用远程方法;无感知远程 http 请求。
- Spring Cloud 的声明式调用, 可以做到使用 HTTP 请求远程服务时能就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。
- 它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的Http Client 构造请求再解析返回数据。
- 它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。
三、Feign入门案例
1.设计需求
我们模拟一个分布式电商系统中消费者通过注册中心(eureka)获取提供者提供的获取商品信息的服务的场景。
2.服务结构
组件说明
| 服务 | 说明 |
|---|---|
| eureka集群 | 注册中心,提供服务的注册和发现 |
| service服务 | 声明service接口,定义方法,provider和consumer都需要依赖此服务 |
| 而且接口中的方法需要使用到SpringMVC的主键 | |
| provider服务 | 提供商品信息查询服务,需要依赖service服务 |
| consumer服务 | 服务消费者,需要依赖service服务, |
| 同时通过feign调用provider的服务获取商品信息 |
3.编写service服务
3.1 创建项目
创建一个普通的SpringBoot项目,因为要在接口中使用SpringMVC的主键,所以我们就直接创建了一个SpringBoot项目
3.2 添加依赖
因为需要使用@RequestMapping主键,所以添加如下依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.3 声明接口
在接口声明服务的功能,同时在本服务中声明pojo类,就不再单独创建pojo项目了。
/**
* @program: springcloud-feign-prodcut-service
* @description: 商品信息的pojo类
* @author: 波波烤鸭
* @create: 2019-06-07 09:22
*/
public class Product {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Product() {
}
@Override
public String toString() {
return "Product{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public Product(Integer id, String name) {
this.id = id;
this.name = name;
}
}
服务接口
/**
* 公共服务的接口
*/
@RequestMapping("/product")
public interface ProductService {
/**
* 查询所有商品的方法
* @return
*/
@GetMapping("/findAll")
public List<Product> findAll();
}
最后将服务打包即可
4.编写provider服务
provider提供商品信息的查询服务,同时需要在eureka中注册,具体实现如下:
4.1 创建项目
4.2 添加依赖
注意需要添加service服务的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 注意:需要添加 service服务的依赖 -->
<dependency>
<groupId>com.dpb</groupId>
<artifactId>springcloud-feign-prodcut-service</artifactId>
<version>1.0.1-RELEASE</version>
</dependency>
</dependencies>
4.3 配置文件设置
添加服务名称,端口及eureka注册中心的信息
spring.application.name=shop-product-provider
server.port=9091
#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://dpb:123456@eureka1:8761/eureka/,http://dpb:123456@eureka2:8761/eureka/
4.4 服务实现
控制器中实现service中的接口
/**
* @program: springcloud-feign-product-provider
* @description: 服务提供者的控制器
* @author: 波波烤鸭
* @create: 2019-06-07 09:44
*/
@RestController
public class ProductController implements ProductService{
/**
* 此处不用再添加@RequestMapping注解,重写的方法在接口中定义的有
* @return
*/
@Override
public List<Product> findAll() {
List<Product> list = new ArrayList<>();
list.add(new Product(1, "电视"));
list.add(new Product(2, "电脑"));
list.add(new Product(3, "冰箱"));
list.add(new Product(4, "洗衣机"));
return list;
}
}
4.5 启动类
添加eureka客户端的注解,然后启动服务
@EnableEurekaClient
@SpringBootApplication
public class SpringcloudFeignProductProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudFeignProductProviderApplication.class, args);
}
}
5.编写consumer服务
5.1 创建项目
5.2 添加依赖
需要添加service服务的依赖以及feign的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- 添加 Feign 坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!-- 注意:需要添加 service服务的依赖 -->
<dependency>
<groupId>com.dpb</groupId>
<artifactId>springcloud-feign-prodcut-service</artifactId>
<version>1.0.1-RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
5.3 配置信息
spring.application.name=shop-product-consumer
server.port=9090
#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://dpb:123456@eureka1:8761/eureka/,http://dpb:123456@eureka2:8761/eureka/
5.4 创建接口
本接口继承自service中的接口,添加@FeignClient接口,指定provider的服务名称。
@FeignClient(name="shop-product-provider")
public interface ProductConsumerService extends ProductService {
}
5.5 创建控制器
/**
* @program: springcloud-feign-prodcut-consumer
* @description: 消费者提供服务
* @author: 波波烤鸭
* @create: 2019-06-07 10:47
*/
@RestController
public class ProductController {
@Autowired
ProductConsumerService consumerService;
/**
* Consumer 中的查询所有商品的方法
* @return
*/
@RequestMapping(value="/list",method= RequestMethod.GET)
public List<Product> getAll(){
return this.consumerService.findAll();
}
}
5.6 创建启动器
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class SpringcloudFeignProdcutConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudFeignProdcutConsumerApplication.class, args);
}
}
5.7 启动测试
分别启动provider和consumer,然后访问consumer的服务,如下