http客户端feign
RestTemplate方式调用存在的问题
先来看我们以前利用RestTemplate发起远程调用的代码:String url = "http://userservice/user/" + order.getUserld();
User user = restTemplate.getForObject(url, User.class);
存在下面的问题:代码可读性差,编程体验不统一参数复杂URL难以维护
Feign是一个声明式的http客户端,官方地址: https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
1.定义和使用Feign客户端,实现远程调用
1.1引入依赖
| <dependency> |
| <groupId>org.springframework.cloud</groupId> |
| <artifactId>spring-cloud-starter-openfeign</artifactId> |
| </dependency> |
1.2在order-service启动类添加注解开启feign的功能
| @MapperScan("cn.itcast.order.mapper") |
| @SpringBootApplication |
| @EnableFeignClients() |
| public class OrderApplication { |
| |
| public static void main(String[] args) { |
| SpringApplication.run(OrderApplication.class, args); |
| } |
| |
| } |
1.3编写Feign客户端
| @FeignClient("userservice") |
| public interface UserClient { |
| @GetMapping("user/{id}") |
| User selectById(@PathVariable("id") Long id); |
| } |
| |
主要是基于SpringMVC的注解来声明远程调用的信息,比如:
服务名称: userservice
请求方式: GET请求路径: /user/[id)
请求参数: Long id
返回值类型: User
1.4 用Feign客户端代替RestTemplate
| |
| @Service |
| public class OrderService { |
| |
| @Autowired(required = false) |
| private OrderMapper orderMapper; |
| |
| @Autowired(required = false) |
| private UserClient userClient; |
| |
| public Order queryOrderById(Long orderId) { |
| |
| Order order = orderMapper.findById(orderId); |
| |
| User user = userClient.selectById(order.getUserId()); |
| |
| order.setUser(user); |
| |
| return order; |
| } |
| } |
1.5总结
Feign的使用步骤
- 引入依赖
- 启动类添加@EnableFeignClients注解
- 编写FeignClient接口
- 使用FeignClient中定义的方法代替RestTemplate
2.Feign的自定义配置,这里以日志级别示例
2.1方式一,配置文件方式
①全局生效:
| feign: |
| client: |
| config: |
| default: |
| loggerLevel: FULL |
②局部生效:
| feign: |
| client: |
| config: |
| userservice: |
| loggerLevel: FULL |
2.2java代码的方式,先声明一个bean
| public class FeignClientConf { |
| |
| @Bean |
| public Logger.Level loggerLevel(){ |
| return Logger.Level.BASIC; |
| } |
| } |
而后如果是全局配置,则把它放到@EnableFeignClients这个注解中:
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
如果是局部配置,则把它放到@FeignClient这个注解中:
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构