10.http客户端feign

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}")//Controller,请求路径
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) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2.利用Feign远程调用userservice服务
User user = userClient.selectById(order.getUserId());
//3.
order.setUser(user);
// 4.返回
return order;
}
}

1.5总结

Feign的使用步骤

  • 引入依赖
  • 启动类添加@EnableFeignClients注解
  • 编写FeignClient接口
  • 使用FeignClient中定义的方法代替RestTemplate

2.Feign的自定义配置,这里以日志级别示例

2.1方式一,配置文件方式

①全局生效:

feign:
client:
config:
default: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # 日志级别

②局部生效:

feign:
client:
config:
userservice: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
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)

posted @   给我手牵你走  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示