目录

  • `feign` 简介
  • `feign` 实现远程调用
    • `Maven` 主要依赖
    • `application.properties` 配置文件
      • `eureka-client-producer` 服务提供方
      • `eureka-client-consumer`` 服务提供方
    • `eureka-client-consumer` 提供方主要代码
      • `feign` 远程调用的接口
      • `feign` 服务降级的实现类
      • `service` 层
      • `controller` 层
      • config 配置类
      • 启动类
  • 测试
    • 测试 `feign` 远程调用中的负载均衡
    • 测试 `feign` 远程调用中的 `hystrix` 服务降级

feign 简介

feignnetflix 开发的声明式、模板化的 http 客户端,它使得 http 请求变得更简单,feign 底层的使用的 http 通信框架是 HttpClientfeign 默认集成了 ribbon,并和 Eureka 结合实现了负载均衡。feign 被广泛应用在 springcloud 的解决方案中,是学习基于 springcloud 微服务架构不可或缺的重要组件

官方 github:https://github.com/OpenFeign/feign

feign 实现远程调用

在 上一篇 文章中,已经实现了 ribbon 的客户端负载均衡,虽然使用 RestTemplate 也可以实现服务之间的调用,但是它不够理想化,不够规范化,标准化。所以,本篇将使用 feign 实现服务之间的调用

项目结构依然使用上一篇文章的项目,稍加改动就可实现

Maven 主要依赖

eureka-client-consumer 消费方添加如下依赖

<!--springcloud feign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

application.properties 配置文件

eureka-client-producer 服务提供方

server.port=8080#注册进eureka的名称
spring.application.name=eureka-client-producer#JDBC 配置
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/shiro?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTC
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource#druid 连接池配置
spring.datasource.druid.initial-size=3
spring.datasource.druid.min-idle=3
spring.datasource.druid.max-active=10
spring.datasource.druid.max-wait=60000#指定 mapper 文件路径
mybatis.mapper-locations=classpath:org/example/mapper/*.xml
mybatis.configuration.cache-enabled=true
#开启驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true
#打印 SQL 语句
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpleureka.client.service-url.defaultZone=http://eureka7001:8761/eureka/
eureka.instance.prefer-ip-address=true

`eureka-client-consumer`` 服务提供方

server.port=8090#注册进eureka的名称
spring.application.name=eureka-client-consumereureka.client.service-url.defaultZone=http://eureka7001:8761/eureka/
eureka.instance.prefer-ip-address=true

eureka-client-consumer 提供方主要代码

eureka-client-producer 服务提供方的代码,与上一篇文章的一致,保持不变

项目结构如下

feign 远程调用的接口

如上一样,创建包名 feign,用来实现远程调用。一定要标注注解 @FeignClient

@FeignClient(name = "eureka-client-producer", fallback = UserConsumerFeignFallback.class)
public interface UserConsumerFeign {@GetMapping(path = "/user/selectUserById")ResultVo selectUserById(@RequestParam(name = "id") Integer id);
}
  • @FeignClient 注解被 @Target(ElementType.TYPE) 修饰,表示 FeignClient 注解的作用在目标接口上
  • name:指定 FeignClient 的名称,name 属性就是注册进 eureka 的服务名称,用于服务发现
  • fallback:定义降级的处理类,当调用远程接口失败或超时时,会调用对应接口的降级逻辑,fallback 指定的类必须实现 @FeignClient 标记的接口

此处关于传递参数详情,可参考文章:https://blog.csdn.net/uotail/article/details/84673347

feign 服务降级的实现类

@Component
public class UserConsumerFeignFallback implements UserConsumerFeign {@Overridepublic ResultVo selectUserById(Integer id) {ResultVo resultVo = new ResultVo();resultVo.setId(id);resultVo.setUsername("feign远程调用时,失败或超时");resultVo.setNickname("feign远程调用时,失败或超时");return resultVo;}
}

service

@Slf4j
@Service
public class UserConsumerServiceImpl implements UserConsumerService {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate UserConsumerFeign userConsumerFeign;/*** ribbon 实现负载均衡*/@Overridepublic ResultVo findOneById(Integer id) {// eureka-client-producer:是生产者端服务名称ResponseEntity<ResultVo> responseEntity = restTemplate.getForEntity("http://eureka-client-producer/user/selectUserById?id=" + id, ResultVo.class);ResultVo resultVo = responseEntity.getBody();assert resultVo != null;log.info("resultVo为:" + resultVo.toString());log.info("调用服务提供方的端口为:" + resultVo.getPort());return resultVo;}/*** feign 进行远程调用*/@Overridepublic ResultVo queryOneById(Integer id) {ResultVo resultVo = userConsumerFeign.selectUserById(id);log.info("resultVo为:" + resultVo.toString());log.info("调用服务提供方的端口为:" + resultVo.getPort());return resultVo;}
}

controller

@Slf4j
@Controller
@RequestMapping(path = "/UserConsumer")
public class UserConsumerController {@Autowiredprivate UserConsumerService userConsumerService;/*** ribbon 实现负载均衡*/@GetMapping(path = "/findOneById")@ResponseBodypublic ResultVo findOneById(Integer id) {return userConsumerService.findOneById(id);}/*** feign 进行远程调用*/@GetMapping(path = "/queryOneById")@ResponseBodypublic ResultVo queryOneById(@RequestParam(name = "id") Integer id) {return userConsumerService.queryOneById(id);}
}

config 配置类

@Configuration
public class UserConsumerConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

启动类

注意:@EnableFeignClients 一定要标注

@EnableFeignClients
@EnableEurekaClient
@Slf4j
@SpringBootApplication
public class AppConsumer {public static void main(String[] args) {SpringApplication.run(AppConsumer.class, args);log.info("------AppConsumer Running------");}
}

测试

测试 feign 远程调用中的负载均衡

同样,分别启动 eureka-server-oneeureka-client-producereureka-client-consumer3 个服务,其中服务提供方 eureka-client-producer 分别以端口 8080,8070 启动两个实例,用于测试负载均衡


注意 http://127.0.0.1:8090/UserConsumer/queryOneById?id=1 是使用 feign 进行远程调用的接口,使用 postman 来发送 9 次请求,查看控制台日志,如下


这也就印证了:feign 默认集成了 ribbon 并和 eureka 结合,实现了负载均衡

测试 feign 远程调用中的 hystrix 服务降级

eureka-client-consumer 消费方的 application.properties 配置文件添加配置

server.port=8090#注册进eureka的名称
spring.application.name=eureka-client-consumereureka.client.service-url.defaultZone=http://eureka7001:8761/eureka/
eureka.instance.prefer-ip-address=true#Feign默认整合了Hystrix,要想为Feign打开Hystrix支持,需要此项设置
#在springcloud Dalston之前的版本中,Feign默认开启Hystrix支持,无需设置feign.hystrix.enabled=true
#从springcloud Dalston版本开始,Feign的Hystrix支持默认关闭,需要手动设置开启
feign.hystrix.enabled=true

此时,我们关闭 eureka-client-producer 服务提供方的两个实例,再重启 eureka-client-consumer 服务让其配置生效,再来测试接口 http://127.0.0.1:8090/UserConsumer/queryOneById?id=1postman 测试结果如下


这不就是执行了 feign 服务降级的实现类 UserConsumerFeignFallback 中的方法嘛,结论:feign 默认集成了 ribbonhystrix,并和 eureka 结合,实现了负载均衡

springcloud之feign远程调用相关推荐

  1. 在学习SpringCloud时Feign远程调用时出现的问题

    问题: nacos没开 2022-12-20 09:55:17.554 ERROR 24224 - [ main] c.a.c.n.registry.NacosServiceRegistry : na ...

  2. day02 Nacos集群配置、Feign远程调用和统一网关Gateway

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

  3. Feign远程调用组件与Gateway网关组件

    文章目录 1. Feign远程调用组件 1.1 Feign简介 1.2 Feign配置应用 1.3 Feign对负载均衡的支持 1.4 Feign对熔断器的支持 1.5 Feign对请求压缩和响应压缩 ...

  4. Feign-基于Feign远程调用

    Feign远程调用 先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: •代码可读性差,编程体验不统一 •参数复杂URL难以维护 Feign是一个声明式的http客户端, ...

  5. 微服务之Feign远程调用

    微服务之Feign远程调用 1.微服务之间一般都是业务分离,会创建一个独立的模块来存放接口,方便以后调用,以及防止代码的冗余和降低耦合性 2.导入feign的依赖 <dependency> ...

  6. 微服务8 Feign远程调用

    目录 1.问题 2.使用 2.1导入依赖 2.2添加注解 2.3编写Feign客户端 2.4修改OrderService 2.3访问 java.lang.AbstractMethodError: Re ...

  7. ruoyi(若依)微服务在多服务器上部署,feign远程调用不通的问题

    情况: 分别将多个模块部署到不同的服务器上 出现不同模块之间调用不通 环境:阿里云服务器 框架:RuoYi-Cloud 容器引擎:Docker 前置条件 (这里默认已经完成打包,部署) 需要在阿里服务 ...

  8. Feign远程调用的问题

    1. Feign远程调用丢失请求头问题 问题:使用feign远程调用会创建一个新request,会丢失请求头. 解决:加上feign远程调用的请求拦截器.使用拦截器apply方法应用拦截器,使用 Re ...

  9. 怎么用feign远程调用别人的接口_Feign远程接口调用

    Feign远程接口调用 clouds234@163.com 2018-8-6 以下都是使用在springboot2.0.4内置启动插件基础上 Feign-only 不注册到eureka 单独使用fei ...

  10. 怎么用feign远程调用别人的接口_spring cloud-openFeign声明式远程调用

    spring cloud-openFeign声明式远程调用 1.概述1.1.是什么Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上申明注解Git ...

最新文章

  1. linux/nginx 安全增强
  2. Basic Example of JMX Technology--转载
  3. idea配置tomcat以及环境变量
  4. Codeforces Beta Round #1 A,B,C
  5. php 函数 打印,php打印函数入门教程
  6. Concept3D推出交互式3D地图平台
  7. filebeat + logstash 发送日志至kafka 入门
  8. ROS+雷达 运行数据记录
  9. 信息学奥赛一本通 2004:【20CSPJ普及组】优秀的拆分 | 洛谷 P7071 [CSP-J2020] 优秀的拆分
  10. Python基础学习笔记之(一)
  11. Unity的Animator中Transition有延迟的问题
  12. JVM原理及调优--网页链接收藏
  13. aspose.words读取html,Aspose.Words for .NET HTML代码直接生成WORD | 学步园
  14. 关于有偿提供拼图响应式后台的通知.
  15. Linux:Redis搭建集群
  16. 用大数据文本挖掘来看“共享单车”的行业现状及走势
  17. 如何提高 CSS 动画性能
  18. 无线网络连接 wlan test
  19. 使用POI提取Word文件的内容(纯文本、带html格式)
  20. css3 呼吸的莲花_CSS3 莲花盛开动画

热门文章

  1. 实战 Kaggle 比赛:狗的品种识别(ImageNet Dogs) 动手学深度学习v2 pytorch
  2. 算法:回溯七 Permutation Sequence数组全排列定位
  3. java 文件流 追加_JAVA向文件中追加内容(转)
  4. 凸优化第三章凸函数 3.4拟凸函数
  5. centos tomcat
  6. HDUacm2095
  7. 「快手极速版」榜 App Store 总榜第一
  8. celery cluser redis_Celery配置Redis Sentinel做高可用
  9. 统计占比_Excel数据透视表:统计各项所占百分比
  10. Docker在centos下安装以及常见错误解决