微服务day04-基于Feign的远程调用

这篇具有很好参考价值的文章主要介绍了微服务day04-基于Feign的远程调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.Feign的认识

是http客户端,因为使用RestTemplate存在一些问题:代码可读性差,参数配置费事,不够优雅…

String url="http://userservice/user/"+order.getUserId();
User user=restTemplate.getForObject(url,User.class);

Feign是一个声明式的HTTP客户端,可以帮助我们发送更加方便的发送HTTP请求。

1.1 Feign的使用

1.导入依赖
在order-service中导入依赖

	<!-- fiegn客户端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

2.开启注解
在oder-service启动类上加上注解@EnableFeignClients

3.编写Feign客户端
在cn.itcast.order包下添加接口clients.UserClient,在接口上添加注解@FeignClient(“userservice”),并且括号里边声明你要请求的服务,之后编写接口函数,类似Controller。

@FeignClient("userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
    
}

4.注释掉原来的RestTemplate相关代码,改造service中代码

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private UserClient userClient;

//    @Autowired
//    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.Feign远程调用
        User user=userClient.findById(order.getUserId());
        // 3.配置orderj
        order.setUser(user);
        // 4.返回
        return order;
    }
}

配置成功之后结果图:
微服务day04-基于Feign的远程调用,springcloud,微服务,架构,云原生,java,spring,spring cloud

1.2 自定义Feign配置

Feign支持许多自定配置,比如:

类型 作用 说明
feign.Logger.Level 修改日志级别 包含四种不同的级别:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder 响应结果的解析器 http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder 请求参数编码 将请求参数编码,便于通过http请求发送
feign. Contract 支持的注解格式 默认是SpringMVC的注解
feign. Retryer 失败重试机制 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

配置日志方式一
基于配置文件修改feign的日志级别可以针对单个服务:

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

也可以针对所有服务:

# feign日志级别配置
feign:
  client:
    config:
      default: # 针对全局的配置
        loggerLevel: FULL # FULL:这是最详细的日志级别,Feign 会输出所有请求和响应的详细信息

日志级别生效结果:
微服务day04-基于Feign的远程调用,springcloud,微服务,架构,云原生,java,spring,spring cloud
配置日志方式二
也可以基于Java代码来修改日志级别,先声明一个类,然后声明一个Logger.Level的对象:

public class DefaultFeignConfiguration  {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC; // 日志级别为BASIC
    }
}

如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 

如果是局部生效,则把它放到对应的@FeignClient这个注解中:

@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class) 

比如:

@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

1.3 Feign性能调优

Feign性能调优主要有2点:

  • 1.改变Feign的底层客户端实现

  • 2.改变Feign的日志级别为Basic/None*

Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池

因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection。

1.1 在order-service的pom文件中引入Apache的HttpClient依赖:

<!--httpClient的依赖 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

1.2 配置连接池,在order-service的application.yml中添加配置:

# feign自定义配置
feign:
  client:
    config:
      default:
#        loggerLevel: FULL
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

1.4 Feign最佳实践分析

由于Feign的客户端与服务提供者的controller代码非常相似,因此应当可以有某种办法简化这种代码的重复编写。
微服务day04-基于Feign的远程调用,springcloud,微服务,架构,云原生,java,spring,spring cloud
微服务day04-基于Feign的远程调用,springcloud,微服务,架构,云原生,java,spring,spring cloud
有2种方式:

  • 定义API接口并基于springMVC注解做声明;(紧耦合不推荐)
  • 将Feign抽取成独立的模块,并把与接口有关的POJO,默认的Feign配置都放在这个模块中,提供给所有消费者使用(松耦合,推荐使用)。例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包,即可直接使用。

Feign抽取成独立的模块实现方式:

  • 创建一个module,命名为feign-api,然后引入feign的starter依赖

微服务day04-基于Feign的远程调用,springcloud,微服务,架构,云原生,java,spring,spring cloud

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 将order-service中的UserClient,User,DefaultFeignConfiguration移动到feign-api项目中

微服务day04-基于Feign的远程调用,springcloud,微服务,架构,云原生,java,spring,spring cloud

  • 在order-service中引入feign-api的依赖
<dependency>
    <groupId>cn.itcast.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>
  • 修改order-service中与上述3个组件有关的import部分

修改之后,发现UserClient对象爆红,提示“无法装配,未找到UserClient类型的Bean”,这是因为OrderApplication默认扫描cn.itcast.order下的包,而UserClient在被移动放到Feign-api模块之下,位于cn.itcast.feign包中,不会被OrderApplication扫描到,因而无法在spring容器中找到对应的Bean;
微服务day04-基于Feign的远程调用,springcloud,微服务,架构,云原生,java,spring,spring cloud
此时可以通过@EnableFeignClients(client=UserClient.class)(详细指定需要加载的Client接口)或者
指定需要加载的Client接口@EnableFeignClients(basePackages = “cn.itcast.feign.clients”)(加载了整个包进来)

  • 启动order-servcie与user-service微服务,效果如下:

微服务day04-基于Feign的远程调用,springcloud,微服务,架构,云原生,java,spring,spring cloud文章来源地址https://www.toymoban.com/news/detail-840832.html

到了这里,关于微服务day04-基于Feign的远程调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务Day3——Nacos配置管理\Feign远程调用\Gateway网关

    当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

    2024年02月16日
    浏览(42)
  • Spring Cloud Day2 Nacos配置管理、Feign远程调用与Gateway服务网关

    Nacos除了可以做注册中心,同样可以做配置管理来使用。 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以

    2024年02月10日
    浏览(66)
  • SpringCloud --- Feign远程调用

    先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: 代码可读性差,编程体验不统一 参数复杂URL难以维护 Feign是一个声明式的http客户端,官方地址:GitHub - OpenFeign/feign: Feign makes writing java http clients easier 其作用就是帮助我们优雅的实现http请求的发送,解决

    2024年02月05日
    浏览(39)
  • SpringCloud(七) Feign远程调用

    目录 一, RestTemplate远程调用存在的问题 二, Feign的远程调用 2.1 什么是Fegin 2.2 Feign的使用(代替RestTemplate) 1. 引入依赖 2. 添加注解  3. 编写Feign的客户端 4. 测试 5. 总结  2.3 自定义配置 1. 配置文件方式  2. Java代码方式  三, Feign使用优化 3.1 使用连接池 1. 引入依赖 2. 配置连接池

    2024年02月06日
    浏览(40)
  • SpringCLoud——Feign的远程调用

    来看一下之前我们使用RestTemplate调用时编写的Contrriller代码: //        2. 利用RestTemplate发起HTTP请求 //        2.1 url 地址         String url = \\\"http://userserver/user/\\\" + order.getUserId(); //        2.2 发送http请求,实现远程调用         User user = restTemplate.getForObject(url,

    2024年02月07日
    浏览(39)
  • SpringCloud Alibaba(一)微服务简介+Nacos的安装部署与使用+Nacos集成springboot实现服务注册+Feign实现服务之间的远程调用+负载均衡+领域划分

    目录 一.认识微服务 1.0.学习目标 1.1.单体架构 单体架构的优缺点如下: 1.2.分布式架构 分布式架构的优缺点: 1.3.微服务 微服务的架构特征: 1.4.SpringCloud 1.5Nacos注册中心 1.6.总结 二、Nacos基本使用安装部署+服务注册 (一)linux安装包方式单节点安装部署 1. jdk安装配置 2. na

    2024年02月09日
    浏览(47)
  • SpringCloud 核心组件Feign【远程调用&自定义配置】

    目录 1,Feign远程调用 1.1:Feign概述 1.2:Feign替代RestTemplate         1):引入依赖         2):添加注解         3):编写Feign的消费服务,提供服务         4):测试         5):总结 1.3:自定义配置 1.3.1:配置文件方式 1.3.2:Java代码方式 Feign是一款Java语言编写的

    2023年04月08日
    浏览(78)
  • SpringCloud(一) 服务架构的演变及注册RestTemplate实现服务的远程调用

    目录 一, 服务架构的演变 1.1 单体架构 1.2 分布式架构 1.3 微服务 1.4 SpringCloud 二, 服务拆分和远程调用 2,1 服务拆分原则 2.2 服务拆分示例 2.3 创建相应数据库  2.4 实现远程调用示例 1, 更改需求 2, 注册RestTemplate实现远程调用  2.5 服务消费者和提供者 将业务的所有功能集中在一

    2024年02月08日
    浏览(39)
  • SpringCloud微服务环境中,使用Feign跨服务调用Api

    在微服务中,很多时候都需要调用其他小组的服务接口,这里记录一下使用Feign调用其他服务的过程。 第一步,导入依赖:  第二步,被调用服务编写接口:  第三步,调用服务端启动类上添加@EnableFeignClients  第四步,编写调用API接口,接口上添加@FeignClient注解,注解的na

    2024年02月10日
    浏览(40)
  • 【SpringCloud Alibaba】(四)使用 Feign 实现服务调用的负载均衡

    在上一文中,我们实现了服务的自动注册与发现功能。但是还存在一个很明显的问题:如果用户微服务和商品微服务在服务器上部署多份的话,之前的程序无法实现服务调用的负载均衡功能。 本文就带着大家一起实现服务调用的负载均衡功能 负载均衡:将原本由一台服务器

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包