基于 Fegin 实现服务调用|学习笔记

简介: 快速学习基于 Fegin 实现服务调用

开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第二阶段基于Fegin实现服务调用】学习笔记与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/684/detail/11867


基于Fegin实现服务调用

 

内容介绍:

一、 优化 RestTemplate

二、 Fegin 实现负载均衡

 

一、优化 RestTemplate

Product product =

RestTemplate.getForobject(url:http://localhost:/product/” +pid, Product.class);

此代码是我们进行微服务商品调用的代码,目前我们使用的是 RestTemplate 完成的服务调用,但这种方式其实有一定问题。

第一个问题:现在我们的参数是通过 URI 拼接的,这种写法在代码可读性是不良好的;

第二个问题:在代码风格上也不一致,我们在调用本地的服务时直接使用的是 @Autowired 注入的 service,但在调用远程服务时却用的是 RestTemplate ,造成编程风格不统一。

接下来我们通过优化将这两个问题解决掉。我们需要加入一个新的组件 Feign 。

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

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

Fegin的使用

1、引入Fegin的依赖

2、在主类上添加 Fegin 的注解

3、创建一个 service ,并使 Fegin 实现服务调用。

4修改 controller 代码,并启动验证。


二、Fegin 实现负载均衡

1、引入依赖

第一步在 pom.xml 中引入 Fegin 的依赖,输入  回车 ,在 之后输入 openfegin 回车,版本不用写将其删掉并导入。

2、添加注解

第二步来到主类上添加一个注解叫 @EnableFeginClients //开启 fegin 的客户端。

3、修改代码

第三步打开 OrderController,不再使用Product product =

RestTemplate.getForobject(url:http://localhost:/product/” +pid, Product.class);

这个代码,而要将其改为

@Autowired

Private OrderService orderservice;这种形式,此时我们需要提供一个 OrderService 的接口,下面进行创建:Product product =

RestTemplate.getForobject(url:http://localhost:/product/” +pid, Product.class);

下方的作用是根据一个 pid 查询商品,所以我们最好加入一个商品的服务接口。

new 一个ProductService 将其改成接口,我们需要操作的就是将Product product =

RestTemplate.getForobject(url:http://localhost:/product/” +pid, Product.class);

替换掉,放在 ProductService 内,它的主要作用就是发送一个 ur ,然后获取返回的类型。

Fegin 为我们提供了两个注解以实现此功能。

第一个为 @FeginClient ,我们可以在内指定 value 属性,它指定的就是 service-product ,将其输入并写上 //value 用于指定调用 nacos 下哪个微服务,这个值就是在 nacos 中的微服务名称。然后学习如何执行操作 /product/” +pid, 需要我们声明一个方法,在下方输入 public Product findByPid(Integer pid); 既然为接口,那么前方的 Product 可以省略。

接着在上方再加一个代码为 @RequestMapping 的注解,并将 /product/” +pid, 代入其中。

在 public ProductfindByPid(Integer pid);

中加入 PathVariable ,在上方输入 //指定请求的 URI部分。FeignClient 的 value + RequestMapping 的value 值其实就是完整的请求路径,也就是”http://service-product/product/” + pid .

到目前为止我们已经完成了 Fegin 的 Service 接口的编选,然后将上边的代码删掉。同调用本地接口相同,输入

@Autowired

Private ProductService productService;

然后就可以调用使用了,为了保留一个完整的代码,还是将其复制一份并将 ribbon 改为 fegin ,接着将

Product product =

RestTemplate.getForobject(url:http://service-product/” +pid, Product.class); 改为上边注入的 productService 即可,即:

Product product = productService .findByPid(pid);

到这里就把 fegin 改完了。

重新启动 OrderApplication 做一个测试,等待启动完毕进行一次访问,对网址进行刷新就可发现访问成功。

相关文章
|
9月前
|
负载均衡 Java Nacos
Spring Cloud五大组件
Spring Cloud五大组件
|
机器学习/深度学习 人工智能 PyTorch
【AI系统】计算图原理
本文介绍了AI框架中使用计算图来抽象神经网络计算的必要性和优势,探讨了计算图的基本构成,包括标量、向量、矩阵、张量等数据结构及其操作,并详细解释了计算图如何帮助解决AI工程化中的挑战。此外,文章还通过PyTorch实例展示了动态计算图的特点和实现方法,包括节点(张量或函数)和边(依赖关系)的定义,以及如何通过自定义Function实现正向和反向传播逻辑。
507 7
【AI系统】计算图原理
|
索引 Python
Python中跨越多个文件使用全局变量
Python中跨越多个文件使用全局变量
452 0
Python中跨越多个文件使用全局变量
|
消息中间件 存储 运维
中间件事件总线技术选型
【6月更文挑战第21天】
230 1
|
SQL 关系型数据库 MySQL
一文搞懂数据库中的“锁”(图文详解)
数据库锁机制包括全局锁、表级锁和行级锁,用于管理并发访问数据时的一致性和有效性。全局锁锁定整个数据库实例,确保数据备份时的一致性,但可能导致长时间业务停摆。表级锁分为读锁和写锁,读锁允许多个并发读,写锁阻止其他读写。元数据锁(MDL)自动控制,防止DML和DDL冲突。行级锁是最细粒度的锁,分共享锁(读)和排他锁(写),防止行级别的并发冲突。InnoDB还使用意向锁和间隙锁/临键锁防止幻读,提高并发性能。
3133 2
一文搞懂数据库中的“锁”(图文详解)
Postman - 设置全局请求 header 信息
Postman - 设置全局请求 header 信息
4501 0
Postman - 设置全局请求 header 信息
|
数据采集 存储 运维
如何使用SkyWalking收集分析分布式系统的追踪数据
通过以上步骤,你可以使用 SkyWalking 工具实现对分布式系统的数据采集和可视化。SkyWalking 提供了强大的追踪和度量功能,帮助开发者和运维人员更好地理解系统的性能状况。欢迎关注威哥爱编程,一起学习成长。
636 0
|
存储 关系型数据库 MySQL
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
|
SQL C语言 关系型数据库
sql like 通配符 模糊查询技巧及特殊字符
最近碰到like模糊匹配的问题,找到一些答案接触迷惑,觉得有知识是自己忽略的,现在整理出来,既强化记忆,又是一次记录,以下转自一篇Blog,关于sql server like的通配符和字符带通配符的处理办法。
6515 0
|
监控 Dubbo 应用服务中间件
Dubbo如何支持本地调用?injvm方式解析
Dubbo是一个远程调用的框架,对于一个服务提供者,暴露了一个接口供外部消费者调用,那么对于提供者自己是否可以调用这个接口,需要什么特殊处理吗?
5784 0