Spring Cloud —— Feign 实现服务调用

引言

本篇博客简单介绍 Feign 的基础知识和基本应用,以前一篇博客《Spring Cloud Alibaba——Nacos实现服务治理》为代码基础,实现更简单的微服务调用方式。

一、什么是Feign

restTemplate 实现的微服务调用方式:

// 调用商品微服务,查询商品信息
Product prod = restTemplate.getForObject("http://" + prodService.getHost() + ":" + prodService.getPort() + "/product/" + pid, Product.class);

依然存在一些不尽如人意的地方:

1、代码可读性不好

2、编码风格不统一。调用本地服务使用 @Autowired 注入的方式,而调用远程的服务是使用 restTemplate 调用。

基于以上两点问题,就出现了新的 Spring Cloud 组件 —— Feign。

Feign 是 Spring Cloud 提供的一个声明式伪 HTTP 客户端。它使得调用远程服务就像调用本地服务一样优雅,只需要创建一个接口并添加一个注解即可。

Nacos 很好的兼容了 Feign ,Feign 默认集成了 Ribbon,所以在 Nacos 下使用 Feign 默认就实现了负载均衡的效果。

二、Feign 的使用

微服务调用关系图:

上图中微服务调用关系是 通过 订单微服务 调用 商品微服务 查询商品信息,因此关于 Feign 的相关编码也都是在 shop-order 微服务上。

1、添加 Feign 依赖

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

2、在主类上添加 @EnableFeignClients 注解

@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class OrderApplication {...

3、创建 Feign 接口类

@FeignClient("service-product")
public interface ProductService {@GetMapping("/product/{pid}")public Product findByPid(@PathVariable("pid") Integer pid);
}

4、将调用方式从 restTemplate 改为 Feign:

然后启动订单和商品微服务,请求http://localhost:8091/order/prod/{pid} 接口发送下单请求:

可以看到商品信息无误,说明订单微服务已经成功获取到商品信息。

说明,以上案例的代码做了大量的省略,主要是去掉了一些数据库操作和配置等不必要的编码展示,具体操作都已经写在《Spring Cloud Alibaba——Nacos实现服务治理》中。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud —— 负载均衡与 Ribbon 应用

引言 本篇博客简单介绍微服务负载均衡的概念&#xff0c;并通过 IDEA 多端口启动应用的方式&#xff0c;模拟多个应用实例&#xff0c;使用自定义和 Ribbon 两种方式实现基本的负载均衡策略。 微服务代码以《Spring Cloud Alibaba——Nacos实现服务治理》为基础。 一、什么是…

控制反转 IOC 与依赖注入 DI

引言 简单总结和巩固一下spring的核心原理——IOC和DI的概念&#xff0c;为什么IOC要叫控制反转&#xff1f;IOC和DI的关系是怎样的&#xff1f; 一、IOC 控制反转 初学者可能很好奇&#xff0c;为什么spring framework的对象托管容器叫做 IOC容器&#xff08;Inversion of …

Spring —— 容器内部逻辑

引言 上一篇关于IoC容器的详解《Spring —— IoC 容器详解》真是工程浩大&#xff0c;可以说Spring官网对核心中的核心IOC容器做了非常全面的使用说明&#xff0c;包括在《Spring揭秘》中让我一直没有成功的Method Injection&#xff0c;官网也解决了我的疑惑&#xff0c;并最…

2020 年度总结

2020年给我的感觉是短平快的一年。 由于年初的新冠肺炎疫情&#xff0c;我大半年都呆在北京的破旧出租屋里写代码。整个春天和夏天&#xff0c;平平无奇。 2月1日返京&#xff0c;居家办公&#xff0c;夜跑。8月复工&#xff0c;疯狂爆痘、烂脸&#xff0c;月末落户天津。9月…

Spring 全局异常捕获

引言 前后端分离开发&#xff0c;后台有时候会出现不可预知的异常&#xff08;运行时异常&#xff09;&#xff0c;在实际生产中通常需要统一返回符合一定响应结构的异常信息给前端&#xff0c;这一方面可以避免用户看到后台的报错信息&#xff0c;一方面也是保护后端程序免受…

JDBC——概述与JDBC的使用

引言 一直希望深入学习一下数据库持久化技术&#xff0c;接触过Hibernate、Mybatis&#xff0c;也使用过Spring事务管理来控制回滚操作&#xff0c;但是越发觉得底层知识有一定的知识盲区和空洞。 很多ORM框架都是基于JDBC规范来进行构建的&#xff0c;因此&#xff0c;学习J…

JDBC——实现通用的查询

引言 上一篇jdbc的文章《JDBC——概述与JDBC的使用》介绍了JDBC的概念和背景知识&#xff0c;同时也讨论了获取数据库连接的方式&#xff0c;以及简单的实现了入库操作&#xff08;更新、删除同理&#xff09;。 本篇博客将会聚焦 PreparedStatement 的查询操作、以及 Result…

JDBC——编程式事务的实现逻辑

引言 数据库事务的概念和基础&#xff0c;总结在《MySQL 基础 ————事务与隔离级别总结》。 本篇博客通过“JDBC 纯编码”方式实现事务控制&#xff0c;完成一个 A 给 B 转账的小功能&#xff0c;在进一步熟练JDBC的编程流程的同时&#xff0c;重点关注 Java 语言如何操作…

排序算法——插入排序

一、算法思想 给定一个无序数列&#xff0c;模拟一个指针从第0位开始向后&#xff0c;始终保持当前位置左边的数列是有序的。 指针位置上的元素依次与前面的元素比较&#xff0c;当遇到小于自己的数或右边已经没有元素时&#xff0c;都停止比较&#xff0c;开始下一轮。 生活…

Linux 底层原理 —— epoll 与多路复用

引言 epoll 是 Linux 系统下高性能网络服务的必备技术&#xff0c;很多面试中高频出现的 Nginx、Redis 都使用了这一技术&#xff0c;本文总结 linux 多路复用模型的演变过程&#xff0c;看一看epoll 是如何实现高性能的。 一、相关基础知识 1.1 文件描述符 文件描述符&…

排序算法——对数器

引言 所谓“对数器”就是校验算法的工具程序&#xff0c;我们使用Math.random() 方法可以生成一个随机乱序数组&#xff0c;并通过Arrays.sort 来比较我们的算法是否正确。 代码实现 对数器主要是使用对照来校验是否正确&#xff0c;除了一些比较方法、拷贝方法&#xff0c;…

查找算法——二分法

引言 二分法&#xff0c;顾名思义&#xff0c;即一分为二的方法&#xff0c;通常用于判断在某个有序数列中是否存在某个数&#xff0c;由于其优秀的算法思想&#xff0c;时间复杂度一般都是 O(logN) &#xff0c;通常要 O(N) 的遍历方式更加优秀。 一、经典二分法查找 最常见…

异或运算的应用

一、基础知识 异或运算&#xff0c;相异为1。 异或运算是一种常用的位运算&#xff0c;在算法题中&#xff0c;对于避免额外的空间复杂度有独特的用处。 异或运算也被称为“无进位相加”&#xff0c;它具有以下特性&#xff1a; 特性1&#xff1a;0 ^ N N 特性2&#xff1a…

链表的基本操作——反转与删除

引言 链表相关的问题几乎都是coding问题&#xff0c;以下是两个简单的链表问题。 一、单链表或双链表如何反转 1.1 单链表的反转操作 给定一个 Node 结构&#xff1a; public static class Node {public int value;public Node next;public Node(int data) {this.value d…

单向队列、双端队列、栈的模型实现

引言 自己实现简单的队列、栈的逻辑结构。 队列都包含头和尾两个指针&#xff0c;简单的单向队列只能在一端&#xff08;如&#xff1a;head端&#xff09;入列&#xff0c;在另一端&#xff08;如&#xff1a;tail 端&#xff09;出列&#xff1b;双端队列可以在 head 进出&…

递归算法及其时间复杂度分析

引言 “递归” 一词是比较专业的计算机术语&#xff0c;在现实生活中&#xff0c;有一个更可爱的词——“套娃”。如果把“递归算法”叫做“套娃算法”&#xff0c;或许可以减少一些恐惧程度。 套娃是有限的&#xff0c;同样&#xff0c;递归也是有限的&#xff0c;这和我们经…

算法设计中的基础常用代码

引言 本篇博客旨在记录一些基础算法知识的常见组合用法&#xff0c;以及何时使用&#xff0c;需要注意的问题等&#xff0c;长期更新。 为什么要这样总结呢&#xff1f;难道掌握了位运算、常用算法工具API的定义还不够吗&#xff1f; 这是因为某些知识比如 &、 |、 ~、 …

Redis —— 常用命令一览

引言 参考《菜鸟教程 Redis 常用命令》&#xff0c;其中红色为极其重要&#xff0c;蓝色为重要。 一、总览 二、key相关命令 三、String 相关命令 四、Hash 相关命令 五、List 相关命令 六、Set 相关命令 七、ZSet 相关命令

Redis 实用技术——Pipeline

引言 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。 这意味着通常情况下一个请求会遵循以下步骤&#xff1a; 客户端向服务端发送一个查询请求&#xff0c;并监听Socket返回&#xff0c;通常是以阻塞模式&#xff0c;等待服务端响应。服务端处理命令&#x…

Redis 实用技术——消息发布和订阅

引言 发布订阅模型是redis的重要功能&#xff0c;它可以像网站动态一样&#xff0c;将消息发送到多个订阅者的主页里。 一、常用命令 二、消息格式 消息是一个有三个元素的多块响应&#xff1a; 如上图&#xff0c;发布者向 mysub 频道发送了一条消息&#xff0c;redis会返回…