Spring Cloud之远程调用OpenFeign

Spring Cloud之远程调用OpenFeign

目录

OpenFeign

问题引入

OpenFeign介绍

Spring Cloud Feign

OpenFeign的使用

引入依赖

添加注解

编写OpenFeign客户端

远程调用


OpenFeign

问题引入

观察之前远程调用的代码

虽说RestTemplate 对HTTP封装后, 已经⽐直接使⽤HTTPClient简单⽅便很多, 但是还存在⼀些问题:

1. 需要拼接URL, 灵活性⾼, 但是封装臃肿, URL复杂时, 容易出错.
2. 代码可读性差, ⻛格不统⼀.

微服务之间的通信⽅式, 通常有两种: RPC 和 HTTP.
在SpringCloud中, 默认是使⽤HTTP来进⾏微服务的通信, 最常⽤的实现形式有两种:

• RestTemplate
• OpenFeign 
RPC(Remote Procedure Call)远程过程调⽤,是⼀种通过⽹络从远程计算机上请求服务,而不需要了解底层⽹络通信细节。RPC可以使⽤多种⽹络协议进⾏通信, 如HTTP、TCP、UDP等, 并且在TCP/IP⽹络四层模型中跨越了传输层和应⽤层。简⾔之RPC就是像调⽤本地⽅法⼀样调⽤远程⽅法。
常见的RPC框架有:
1. Dubbo: Apache Dubbo 中⽂
2. Thrift : Apache Thrift - Home
3. gRPC: gRPC
OpenFeign介绍
OpenFeign 是⼀个声明式的 Web Service 客⼾端. 它让微服务之间的调⽤变得更简单, 类似controller 调⽤service, 只需要创建⼀个接⼝,然后添加注解即可使⽤OpenFeign.

OpenFeign的前身

Feign 是 Netflix 公司开源的⼀个组件.
• 2013年6⽉, Netflix发布 Feign的第⼀个版本 1.0.0
• 2016年7⽉, Netflix发布Feign的最后⼀个版本 8.18.0
2016年,Netflix 将 Feign 捐献给社区
• 2016年7⽉ OpenFeign 的⾸个版本 9.0.0 发布,之后⼀直持续发布到现在.
可以简单理解为 Netflix Feign 是OpenFeign的祖先, 或者说OpenFeign 是Netflix Feign的升级版.OpenFeign 是Feign的⼀个更强⼤更灵活的实现.
Spring Cloud Feign

Spring Cloud Feign 是 Spring 对 Feign 的封装, 将 Feign 项⽬集成到 Spring Cloud ⽣态系统中.
受 Feign 更名影响,Spring Cloud Feign 也有两个 starter:

• spring-cloud-starter-feign
• spring-cloud-starter-openfeign

由于Feign的停更维护, 对应的, 我们使⽤的依赖是 spring-cloud-starter-openfeign。

Spring Cloud Feign官方介绍

OpenFeign的使用
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
添加注解

在order-service的启动类添加注解 @EnableFeignClients , 开启OpenFeign的功能。

package order; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; @EnableFeignClients @SpringBootApplication public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } }
编写OpenFeign客户端

基于SpringMVC的注解来声明远程调⽤的信息。

package order.api; import order.model.ProductInfo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @FeignClient(value = "product-service",path = "/product") public interface ProductApi { @RequestMapping("/{productId}") ProductInfo getProductById(@PathVariable("productId") Integer productId); }

@FeignClient 注解作⽤在接⼝上, 参数说明:

• name/value:指定FeignClient的名称, 也就是微服务的名称, ⽤于服务发现, Feign底层会使⽤Spring Cloud LoadBalance进⾏负载均衡. 也可以使⽤ url 属性指定⼀个具体的url.
• path: 定义当前FeignClient的统⼀前缀.
远程调用

修改之前远程调用的代码

package order.service; import order.api.ProductApi; import order.mapper.OrderMapper; import order.model.OrderInfo; import order.model.ProductInfo; 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 ProductApi productApi; public OrderInfo selectOrderById(Integer orderId){ OrderInfo orderInfo = orderMapper.selectOrderById(orderId); ProductInfo productInfo = productApi.getProductById(orderInfo.getProductId()); orderInfo.setProductInfo(productInfo); return orderInfo; } }

启动服务并访问

Read more

Spring Boot 机制四: AOP 代理机制源码级深度解析(JDK / CGLIB 全链路)

Spring Boot 机制四: AOP 代理机制源码级深度解析(JDK / CGLIB 全链路)

博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。 ② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。 ③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送ZEEKLOG评论防封脚本,送真活跃粉丝,助你提升文章热度。 群公告里还有全网大赛约稿汇总/博客提效工具集/ZEEKLOG自动化运营脚本 有兴趣的加文末联系方式,备注自己的ZEEKLOG昵称,拉你进群,互相学习共同进步。 文章目录 * Spring Boot 机制四: AOP 代理机制源码级深度解析(JDK / CGLIB 全链路) * 目录 * 1. Spring Boot AOP 的本质是什么? * 2. JDK vs CGLIB:

By Ne0inhk
从0到1配置cursor规则Java篇:全局(Always Apply)

从0到1配置cursor规则Java篇:全局(Always Apply)

alwaysApply: true Java 项目全局规则 (Always Apply) 编码规范 命名规范 * 类名: 使用 PascalCase(大驼峰),如 UserService, OrderController * 方法名: 使用 camelCase(小驼峰),如 getUserById, processOrder * 变量名: 使用 camelCase,如 userName, orderList * 常量名: 使用 UPPER_SNAKE_CASE,如 MAX_SIZE, DEFAULT_TIMEOUT * 包名: 全小写,使用点分隔,如 com.example.project.service * 接口名: 不使用 I 前缀,

By Ne0inhk
Java中的反射机制详解:从原理到实践的全面剖析

Java中的反射机制详解:从原理到实践的全面剖析

文章目录 * 摘要 * 第一章 反射机制概述 * 1.1 什么是反射? * 1.2 反射的江湖地位:为何需要它? * 1.3 反射的优缺点 * 第二章 反射的基石:Class类与类加载 * 2.1 万物皆对象:Class对象 * 2.2 获取Class对象的三种方式 * 2.3 类加载的幕后故事 * 第三章 解剖类:反射的核心API * 3.1 操作构造方法(Constructor):创建对象 * 3.2 操作字段(Field):访问与修改属性 * 3.3 操作方法(Method):动态调用 * 第四章 深入进阶:反射的高级特性 * 4.1

By Ne0inhk
【Linux/C++多进程篇(一) 】一个变两个?揭秘 C/C++ 程序中神奇的“分身术”

【Linux/C++多进程篇(一) 】一个变两个?揭秘 C/C++ 程序中神奇的“分身术”

⭐️在这个怀疑的年代,我们依然需要信仰。 个人主页:YYYing. ⭐️Linux/C++进阶系列专栏:【从零开始的linux/c++进阶编程】 ⭐️其他专栏:【linux基础】【数据结构与算法】【从零开始的计算机网络学习】 系列上期内容:【Linux/C++文件篇(一) 】标准I/O与文件I/O基础  系列下期内容:【Linux/C++多进程篇(二) 】万字解析linux系统编程之进程间通信 (IPC) 目录 前言:        多进程理论基础 一、为什么要引入多进程 二、多进程相关概念 三、进程的内存管理 四、进程与程序的区别 五、进程的种类 六、进程PID 七、特殊的进程 八、linux中有关进程的指令 九、进程状态的切换

By Ne0inhk