开发自救手册 开发自救手册
首页
  • Java指南

    • 手册的初衷以及适用人群
    • 介绍
    • JAVA涉及技术总览
  • 技术场景

    • 线上代码覆盖率监控
  • cpp自救指南
  • go指南
  • 真正的面经系列
  • 经历分享
  • 相关文章

    • 25届实习内推
  • 微服务
友情链接
  • 团队介绍
  • 如何加入
GitHub (opens new window)
首页
  • Java指南

    • 手册的初衷以及适用人群
    • 介绍
    • JAVA涉及技术总览
  • 技术场景

    • 线上代码覆盖率监控
  • cpp自救指南
  • go指南
  • 真正的面经系列
  • 经历分享
  • 相关文章

    • 25届实习内推
  • 微服务
友情链接
  • 团队介绍
  • 如何加入
GitHub (opens new window)
  • 微服务

    • 微服务介绍
    • EureKa注册中心
    • Ribbon负载均衡
    • Nacos注册中心、配置中心
    • OpenFeign远程调用
      • Feign的介绍
      • 自定义Feign的配置
      • Feign的性能优化
        • 连接池配置
      • Feign的最佳实践(踩坑后的比较好的实现方式)
      • 抽取FeignClient
    • Gateway统一网关
    • Docker
    • DockerCompose
    • RabbitMQ
    • Sentinel微服务保护
  • 八股文
  • 微服务
ethandu
2024-05-02
目录

OpenFeign远程调用

# http客户端Feigin

RestTemplate方式调用存在的问题

image-20220211211803654

# Feign的介绍

image-20220211211823097

定义和使用Feign客户端

image-20220211211918200

这个里面的注解甚至用的是springmvc里面的注解

image-20220211211927764

Feign是声明式http客户端 上面这段代码将http请求所需要的所有东西feign通过声明客户端的方式弄好了

Feign非常强大 里面已经包含了负载均衡功能了(核心依赖里面已经集成了Ribbon)

image-20220211212853444

总结:

image-20220211212936492

# 自定义Feign的配置

image-20220211213038641

失败重试:可能是服务宕机或网络原因 Ribbon就不会等了 它会做重试去试试另一个服务能不能访问

配置Feign日志的两种方式:

  • 方式一:配置文件方式

image-20220211213350412

image-20220211213617996

  • 配置Feign日志的方式二:java代码方式,需要先声明一个Bean:

image-20220211213712935

总结:

image-20220211213900199

# Feign的性能优化

# 连接池配置

image-20220211214940169

真实情况需要根据压测结果进行调节

总结:

image-20220211215224024

# Feign的最佳实践(踩坑后的比较好的实现方式)

  • 方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准

原来:

image-20220211215418102

这里的userservice的接口和orderservice里面的Feign客户端写的接口实际上是一样的

image-20220211215543869

现在:(给两个地方定义统一的标准约束了两边怎么去做)

image-20220211215646406

==但是官方并不推荐去共享接口在服务端和客户端之间,因为会造成紧耦合 两个服务在API上都一样了 并且这里在springmvc中是不会生效的 因为方法参数(@PathVarible)是继承不下来的==

image-20220211215843271

image-20220211220015249

  • 方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有消费者使用

思考一个问题 随着服务的增多我们这个userclient也是(要用的话)每次都写这样也是重复开发了

image-20220211220124587

这里我们用一个feign的api 在这个项目中把这个写好 把实体类也写好 配置也写好 ==服务要用直接引依赖就好了依赖有了就直接调就好了== 这个是一个统一的抽取的方式

image-20220211220419702

但是它也有一个问题例如orderservice里面我只需要用里面的其中一个方法 但是我们把所有的都引进来了

所以没有完美的解决方案

总结:

image-20220211220709974

# 抽取FeignClient

image-20220211221041511

引入依赖

image-20220211221119530

将UserClient DefaultFeignConfiguration User实体类都放进去

将OrderService中先前里面有的User UserClient DefaultFeignConfiguration全部删掉(这里之前的依赖找不到了所以会报错)

image-20220211221237816

在orderservice中导入feign-api包将依赖替换成feign-api里面的东西

image-20220211221351873

现在除了这个开启客户端已经在OrderService里面没有关于Feign的东西了

image-20220211221449705

但是这里启动报错了 说这个UserClient无法被注入

如果熟悉Spring应该知道编译没有报错证明类有 但是无法注入说明没有创建对象 也就是在spring容器中找不到它所以注入失败 UserClient这个接口之所以以前有对象是因为

image-20220211221744004

这个接口以前有这个注解 spring扫描到这个注解就会给这个接口创建对象 现在没有扫描到包了 我们的orderservice默认的扫描包是启动类在的包 和feign-api里面的UserClient显然不在一个包 扫不到的 所以spring容器中没有这个bean这就无法注入了 (把orderservice扫描包改掉是显然不合适的)

解决方案

image-20220211222204827

(更推荐第二种方案 只需要扫描需要的client 只加载需要的客户端)

总结:

image-20220211222420062

上次更新: 2024/05/02, 13:47:32
Nacos注册中心、配置中心
Gateway统一网关

← Nacos注册中心、配置中心 Gateway统一网关→

Theme by Vdoing | Copyright © 2019-2024 Backend Development | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式