Feign远程调用

简介: Feign远程调用


Feign远程调用
注意看这里--->举例:假设当前order-service服务需要远程调用user服务

1、引入依赖

在order-service服务的pom文件中引入feign的依赖:


org.springframework.cloud
spring-cloud-starter-openfeign

2、添加注解

在order-service的启动类添加注解开启Feign的功能:

3、编写Feign的客户端

在order-service中新建一个接口,内容如下:

package cn.itcast.order.client;

@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
4、测试

修改order-service中的OrderService类中的queryOrderById方法,使用Feign客户端代替RestTemplate:

package cn.itcast.order.service;

import cn.itcast.feign.client.UserClient;
import cn.itcast.feign.pojo.User;
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class OrderService {

@Autowired
private OrderMapper orderMapper;

@Autowired
private RestTemplate restTemplate;

@Autowired
private UserClient userClient;

public Order queryOrderById(Long orderId) {
    // 订单查询
    Order order = orderMapper.findById(orderId);
    // 1.配置url

// String url = "http://localhost:8081/user/" + order.getUserId();
// String url = "http://userservice:8081/user/" + order.getUserId();
// 2.发起调用
// User user = restTemplate.getForObject(url, User.class);
// 使用Feign发起http请求,查询用户
User user = userClient.findById(order.getUserId());
// 封装user到order
order.setUser(user);
// 返回
return order;
}

}
日志文件配置

针对单个服务

feign:
client:
config:
userservice: # 针对某个微服务的配置
loggerLevel: FULL # 日志级别
针对所有服务

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

Feign最佳实践方式
注意看这里--->举例:假设当前order-service服务需要远程调用user服务

这种是将Feign单独抽取到一个模块中

1、抽取

首先创建一个module,命名为feign-api

2、引入依赖


org.springframework.cloud
spring-cloud-starter-openfeign


org.springframework.cloud
spring-cloud-openfeign-core
x
3、写入UserClient、User、DefaultFeignConfiguration

创建cn.itcast.feign包

UserClient

package cn.itcast.feign.client;

@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
User

package cn.itcast.feign.pojo;

import lombok.Data;

@Data
public class User {
private Long id;
private String username;
private String address;
}
DefaultFeignConfiguration

package cn.itcast.feign.config;

@Configuration
public class DefaultFeignConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC; // 日志级别为BASIC
}
}
4、在order-service的pom文件中引入feign-api依赖


com.itcast
feign-api
1.0

5、添加扫描包

这个要加载启动类上,谁用到这个feign-api,就在谁的启动类上加

方式一:

指定Feign应该扫描的包:

@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
方式二:

指定需要加载的Client接口(注意引包是:feign-api下的别引错了):

@EnableFeignClients(clients = {UserClient.class})
6、order-server使用Open Feign调用User

package cn.itcast.order.service;

import cn.itcast.feign.client.UserClient;
import cn.itcast.feign.pojo.User;
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class OrderService {

@Autowired
private OrderMapper orderMapper;

@Autowired
private UserClient userClient;

public Order queryOrderById(Long orderId){
    // 订单查询
    Order order = orderMapper.findById(orderId);
    // 利用Feign发起http请求,查询用户
    User user = userClient.findById(order.getUserId());
    // 封装user到order
    order.setUser(user);
    // 返回
    return order;
}

}

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
Java 容器
如何在SpringBoot项目中使用过滤器和拦截器
过滤器和拦截器是日常开发中常用技术,用于对特定请求进行增强处理,如插入自定义代码以实现特定功能。过滤器在请求到达 `servlet` 前执行,而拦截器在请求到达 `servlet` 后执行。`SpringBoot` 中的拦截器依赖于 `SpringBoot` 容器,过滤器则由 `servlet` 提供。通过实现 `Filter` 接口并重写 `doFilter()` 方法可实现过滤器;通过实现 `HandlerInterceptor` 接口并重写相应方法可实现拦截器。两者的主要区别在于执行时机的不同,需根据具体场景选择使用。
785 4
如何在SpringBoot项目中使用过滤器和拦截器
|
存储 算法 Java
HashMap 之底层数据结构和扩容机制
HashMap 之底层数据结构和扩容机制
1833 1
|
7月前
|
监控 网络协议 Java
Netty基础—1.网络编程基础一
本文详细介绍了网络通信的基础知识,涵盖OSI七层模型、TCP/IP协议族及其实现细节。首先解释了OSI模型各层功能,如物理层负责数据通路建立与传输,数据链路层提供无差错传输等。接着探讨了TCP/IP协议,包括TCP和UDP的特点、三次握手与四次挥手过程,以及如何通过确认应答和序列号确保数据可靠性。还分析了HTTP请求的传输流程和报文结构,并讨论了短连接与长连接概念。 此外,解析了Linux下的IO模型,包括阻塞IO、非阻塞IO、IO复用(select/poll/epoll)、信号驱动IO和异步IO的特点与区别,强调了epoll在高并发场景下的优势及其水平触发和边缘触发两种工作模式。
|
存储 算法 安全
HashMap的实现原理,看这篇就够了
关注【mikechen的互联网架构】,10年+BAT架构经验分享。深入解析HashMap,涵盖数据结构、核心成员、哈希函数、冲突处理及性能优化等9大要点。欢迎交流探讨。
HashMap的实现原理,看这篇就够了
可能是由于IntelliJ IDEA的某些设置或者插件冲突导致的
可能是由于IntelliJ IDEA的某些设置或者插件冲突导致的
1579 1
|
Java 数据库连接 mybatis
成功解决:文档根元素 “mapper“ 必须匹配 DOCTYPE 根 “null“
这篇文章介绍了解决MyBatis配置文件中出现的"文档根元素'mapper'必须匹配DOCTYPE根'null'"错误的步骤,通过添加正确的文件头和DOCTYPE声明到mapper.xml文件中来解决这个问题。
成功解决:文档根元素 “mapper“ 必须匹配 DOCTYPE 根 “null“
|
存储 NoSQL Java
苍穹外卖亮点再梳理 ||
苍穹外卖亮点再梳理 ||
918 4
|
传感器 监控 网络协议
MQTT 发布、订阅模式介绍
【2月更文挑战第17天】
1392 6
MQTT 发布、订阅模式介绍
|
自然语言处理 Java UED
Spring Boot中的国际化配置
Spring Boot中的国际化配置
|
消息中间件 供应链 Java
RabbitMQ入门指南(九):消费者可靠性
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了消费者确认机制、失败重试机制、失败处理策略、业务幂等性等内容。
631 0
RabbitMQ入门指南(九):消费者可靠性