目录
1、背景
用feign
简化服务调用,消费者无需再通过RestTemplate
访问服务
- 要求:消费者使用feign client调用提供者的接口
- 技术栈:
feign client
- 目的:了解feign client的使用和优点
2、项目更新
生产者无需改动,消费者更改
a、导入openfeign启动器依赖
- 子项目
pom.xml
<!--利用feign调用提供者的接口-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
b、启动类添加注解(开启Feign功能)
@EnableFeignClients
:开启feign功能,告诉框架扫描所有使用注解@FeignClient
定义的feign客户端
c、编写客户端(UserClient接口)
UserClient.java
@FeignClient("服务提供者的服务名称")
:声明当前类是一个Feign客户端,并指定生产者的服务名- 类似mapper,会通过反射创建实现类来调用生产者路径并完成增删改查功能,因此我们只需写好接口即可
- 注意:
FeignClient
里的@PathVariable("name")
里的name不能省略默认,否则会报异常。这一点和Controller里不一致,Controller里的可以省略默认。
package com.prlc.comsumerservice.client;
import com.prlc.comsumerservice.entity.User;
import java.util.List;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
/**
* <pre>
* classname UserClient
* description
* </pre>
*
* @author pengruolan
* @date 2021/4/12 0:25
**/
//声明当前类是一个Feign客户端,并指定生产者的服务名
@FeignClient("provider-service-prl")
public interface UserClient {
@GetMapping("/provider/users") /* 实际地址:http://provider-service-prl/users */
List<User> query();
@GetMapping("/provider/user/{id}")
User queryById(@PathVariable("id") Integer id);
@PostMapping("/provider/user/c")
void createUser(User user);
@PutMapping("/provider/user/u/{id}")
void updateUser(@PathVariable("id") Integer id, User user);
@DeleteMapping("/provider/user/d/{id}")
void deleteUser(@PathVariable("id") Integer id);
}
d、编写处理器(ConsumerFeignController类)
ConsumerFeignController.java
package com.prlc.comsumerservice.controller;
import com.prlc.comsumerservice.client.UserClient;
import com.prlc.comsumerservice.entity.User;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <pre>
* classname ConsumerFeignController
* description
* </pre>
*
* @author pengruolan
* @date 2021/4/12 0:34
**/
@RestController
@RequestMapping("/consumer")
public class ConsumerFeignController {
@Autowired
private UserClient userClient;
@GetMapping("/users")
List<User> query() {
return userClient.query();
}
@GetMapping("/user/{id}")
User queryById(@PathVariable("id") Integer id) {
return userClient.queryById(id);
}
@PostMapping("/user/c")
void createUser(User user) {
userClient.createUser(user);
}
@PutMapping("/user/u/{id}")
void updateUser(@PathVariable("id") Integer id, User user) {
user.setId(id);
userClient.updateUser(id, user);
}
@DeleteMapping("/user/d/{id}")
void deleteUser(@PathVariable("id") Integer id) {
userClient.deleteUser(id);
}
}
3、测试
4、感悟
- Feign,伪装者
- Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样,不必再自己拼接sql、拼接参数等操作,Feign会为我们完成这些操作,避免编写大量重复代码
- Feign主要作用:自动根据参数拼接http请求地址(内部对生产者的请求地址)