springcloud之feign远程调用
目录
- `feign` 简介
- `feign` 实现远程调用
- `Maven` 主要依赖
- `application.properties` 配置文件
- `eureka-client-producer` 服务提供方
- `eureka-client-consumer`` 服务提供方
- `eureka-client-consumer` 提供方主要代码
- `feign` 远程调用的接口
- `feign` 服务降级的实现类
- `service` 层
- `controller` 层
- config 配置类
- 启动类
- 测试
- 测试 `feign` 远程调用中的负载均衡
- 测试 `feign` 远程调用中的 `hystrix` 服务降级
feign
简介
feign
是 netflix
开发的声明式、模板化的 http
客户端,它使得 http
请求变得更简单,feign
底层的使用的 http
通信框架是 HttpClient
。feign
默认集成了 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-one
,eureka-client-producer
,eureka-client-consumer
这 3
个服务,其中服务提供方 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=1
,postman
测试结果如下
这不就是执行了 feign
服务降级的实现类 UserConsumerFeignFallback
中的方法嘛,结论:feign
默认集成了 ribbon
和 hystrix
,并和 eureka
结合,实现了负载均衡
springcloud之feign远程调用相关推荐
- 在学习SpringCloud时Feign远程调用时出现的问题
问题: nacos没开 2022-12-20 09:55:17.554 ERROR 24224 - [ main] c.a.c.n.registry.NacosServiceRegistry : na ...
- day02 Nacos集群配置、Feign远程调用和统一网关Gateway
1.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来使用. 统一配置管理 当微服务部署的实例越来越多,达到数十.数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错.我们需要一 ...
- Feign远程调用组件与Gateway网关组件
文章目录 1. Feign远程调用组件 1.1 Feign简介 1.2 Feign配置应用 1.3 Feign对负载均衡的支持 1.4 Feign对熔断器的支持 1.5 Feign对请求压缩和响应压缩 ...
- Feign-基于Feign远程调用
Feign远程调用 先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: •代码可读性差,编程体验不统一 •参数复杂URL难以维护 Feign是一个声明式的http客户端, ...
- 微服务之Feign远程调用
微服务之Feign远程调用 1.微服务之间一般都是业务分离,会创建一个独立的模块来存放接口,方便以后调用,以及防止代码的冗余和降低耦合性 2.导入feign的依赖 <dependency> ...
- 微服务8 Feign远程调用
目录 1.问题 2.使用 2.1导入依赖 2.2添加注解 2.3编写Feign客户端 2.4修改OrderService 2.3访问 java.lang.AbstractMethodError: Re ...
- ruoyi(若依)微服务在多服务器上部署,feign远程调用不通的问题
情况: 分别将多个模块部署到不同的服务器上 出现不同模块之间调用不通 环境:阿里云服务器 框架:RuoYi-Cloud 容器引擎:Docker 前置条件 (这里默认已经完成打包,部署) 需要在阿里服务 ...
- Feign远程调用的问题
1. Feign远程调用丢失请求头问题 问题:使用feign远程调用会创建一个新request,会丢失请求头. 解决:加上feign远程调用的请求拦截器.使用拦截器apply方法应用拦截器,使用 Re ...
- 怎么用feign远程调用别人的接口_Feign远程接口调用
Feign远程接口调用 clouds234@163.com 2018-8-6 以下都是使用在springboot2.0.4内置启动插件基础上 Feign-only 不注册到eureka 单独使用fei ...
- 怎么用feign远程调用别人的接口_spring cloud-openFeign声明式远程调用
spring cloud-openFeign声明式远程调用 1.概述1.1.是什么Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上申明注解Git ...
最新文章
- linux/nginx 安全增强
- Basic Example of JMX Technology--转载
- idea配置tomcat以及环境变量
- Codeforces Beta Round #1 A,B,C
- php 函数 打印,php打印函数入门教程
- Concept3D推出交互式3D地图平台
- filebeat + logstash 发送日志至kafka 入门
- ROS+雷达 运行数据记录
- 信息学奥赛一本通 2004:【20CSPJ普及组】优秀的拆分 | 洛谷 P7071 [CSP-J2020] 优秀的拆分
- Python基础学习笔记之(一)
- Unity的Animator中Transition有延迟的问题
- JVM原理及调优--网页链接收藏
- aspose.words读取html,Aspose.Words for .NET HTML代码直接生成WORD | 学步园
- 关于有偿提供拼图响应式后台的通知.
- Linux:Redis搭建集群
- 用大数据文本挖掘来看“共享单车”的行业现状及走势
- 如何提高 CSS 动画性能
- 无线网络连接 wlan test
- 使用POI提取Word文件的内容(纯文本、带html格式)
- css3 呼吸的莲花_CSS3 莲花盛开动画
热门文章
- 实战 Kaggle 比赛:狗的品种识别(ImageNet Dogs) 动手学深度学习v2 pytorch
- 算法:回溯七 Permutation Sequence数组全排列定位
- java 文件流 追加_JAVA向文件中追加内容(转)
- 凸优化第三章凸函数 3.4拟凸函数
- centos tomcat
- HDUacm2095
- 「快手极速版」榜 App Store 总榜第一
- celery cluser redis_Celery配置Redis Sentinel做高可用
- 统计占比_Excel数据透视表:统计各项所占百分比
- Docker在centos下安装以及常见错误解决