Spring Cloud Alibaba(8)---Feign服务调用
Feign服务调用
有关Spring Cloud Alibaba之前写过五篇文章,这篇也是在上面项目的基础上进行开发。
Spring Cloud Alibaba(2)---RestTemplate微服务项目
Spring Cloud Alibaba(3)---Nacos概述
Spring Cloud Alibaba(4)---Nacos(注册中心)
Spring Cloud Alibaba(5)---Nacos(配置中心)
Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本
Spring Cloud Alibaba(7)---docker-compose搭建nacos1.4.0集群
因为Feign是由Netflix开发出来,它不属于spring cloud alibaba 的组件,所以之前在写spring cloud相关博客的时候也有写过。
SpringCloud(6)---熔断降级理解、Hystrix实战
一、概念
一个成熟的微服务集群,内部调用必然依赖一个好的RPC框架,比如:基于http协议的Feign,基于私有Tcp协议的dubbo。本文内容介绍Feign。
1、什么是Feign
Feign是由Netflix开发出来的另外一种实现负载均衡的开源框架,它封装了Ribbon和RestTemplate,实现了WebService的 面向接口编程,进一步的减低了项目的耦合度,
因为它封装了Riboon和RestTemplate,所以它具有这两种框架的功能,可以 实现负载均衡和Rest调用。
2、为什么需要Feign
之前已经创建好了订单微服务,商品微服务,这两个微服务是互相隔离的,那么微服务和微服务之间如何互相调用呢?
显然两个微服务都可以采用http通信,之前也通过代码来实现restTemplate进行互相访问,但是这种方式对参数传递和使用都不是很方便,我们需要配置请求head、body,
然后才能发起请求。获得响应体后,还需解析等操作,十分繁琐。采用Feign进行服务之间的调用,可以简化调用流程,真正感觉到是在同一个项目中调用另一个类的方法的欢快感。
3、Feign优点
1、Feign旨在使编程java Http客户端变得更容易。
2、服务调用的时候融合了 Ribbon 技术,所以也支持负载均衡作用。
3、服务调用的时候融合了 Hystrix 技术,所以也支持熔断机制作用。
二、项目搭建
因为我们是通过 订单服务(mall-order) 调 商品服务(mall-goods),所以商品服务不需要做任何改动,只需在订单服务(mall-order)添加相关配置
1、pom.xml
<!--引入feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、SpringBoot启动类
添加@EnableDiscoveryClient
注解,开启Feign支持
//开启Feign支持
@EnableFeignClients
@SpringBootApplication
public class OrderApplication {
public static void main(String [] args){
SpringApplication.run(OrderApplication.class,args);
}
}
3、GoodsService
这里其实就是通过接口的方式,填写商品服务接口信息
/**
* mall-good s就是商品微服务的 spring.application.name
*/
@FeignClient(value = "mall-goods")
public interface GoodsService {
/**
* /api/v1/goods/findByGoodsId就是商品服务提供的接口,参数也是
*/
@GetMapping("/api/v1/goods/findByGoodsId")
Goods findById(@RequestParam("goodsId") int goodsId);
}
简单来讲这里就三步
1、接口上添加@FeignClient 注解
2、value指是你要调的服务应用名称
3、下面提供的接口和参数和你要调的服务提供的接口一致就可以了
4、Controller接口
@RestController
@RequestMapping("api/v1/goods_order")
public class OrderController {
@Autowired
private GoodsService goodsService;
/**
* 通过Feign请求mall-goods服务
*/
@RequestMapping("getGoodsByFeign")
public Object getGoodsByFeign(int goodsId) {
Goods goods = goodsService.findById(goodsId);
return goods;
}
}
这样是不是也可以明显看出,订单服务调商品服务通过Feign就像调内部接口一样,非常方便。
5、测试
很明显,请求成功。
三、负载均衡示例
前面说了,Feign融合了 Ribbon 技术,所以也支持负载均衡作用。
1、Ribbon⽀持的负载均衡策略
2、默认负载均衡策略(轮询)示例
我们先不配置任何负载均衡策略,看默认是采用什么策略。这里
mall-order(订单服务)单机部署端口号:7001
mall-goods(商品服务)集群部署端口号:6001、6002、6003。
mall-goods服务
1)、新增Controller接口
因为mall-goods是集群部署的,所以想知道到底是那台服务那个端口获取请求
@RestController
@RequestMapping("api/v1/goods")
public class GoodsController {
@Autowired
private GoodsService goodsService;
@RequestMapping("findClusterName")
public Object findClusterName( HttpServletRequest request) {
//获取是哪个节点被请求
String clusterName = "当前服务器名称: " + request.getServerName()+";当前集群节点端口号: "+ request.getServerPort();
return clusterName;
}
}
mall-order服务
1)、新增Feign接口
@FeignClient(value = "mall-goods")
public interface GoodsService {
/**
* /api/v1/goods/findByGoodsId就是商品服务提供的接口,参数也是
*/
@GetMapping("/api/v1/goods/findClusterName")
String findClusterName();
}
2)新增Controller接口
@RestController
@RequestMapping("api/v1/goods_order")
public class OrderController {
@Autowired
private GoodsService goodsService;
/**
* 通过Feign请求mall-goods服务
*/
@RequestMapping("getClusterName")
public Object findClusterName() {
for (int i = 0; i <10 ; i++) {
System.out.println(goodsService.findClusterName());
}
return "执行结束";
}
}
这里在for循请求商品服务接口10次, 看下控制台打印结果
因为我这边是同一台服务器集群部署多个商品微服务,所以打印出的服务器名称都是一样的。从端口号可以看出 订单服务是轮询去请求商品微服务集群的。
3、修改负载均衡策略(随机)示例
我们这里改成 随机策略,我们只需添加相关配置
@Bean
public IRule loadBalancer(){
return new RandomRule();
}
再重新请求接口
http://localhost:7001/api/v1/goods_order/getClusterName
查看结果
可以从结果中看出,订单服务已经变成是随机请求商品微服务集群的。
策略选择
1、如果每个机器配置⼀样,则建议不修改策略 (也就是轮询策略)
2、如果部分机器配置强,则可以改为WeightedResponseTimeRule(响应时间加权重策略)
总结
这篇博客也是比较简单了来学习了Feign作为服务调用,下一篇博客将会讲下 Sentinel。
少说多做,句句都会得到别人的重视;多说少做,句句都会受到别人的忽视。(6)
Spring Cloud Alibaba(8)---Feign服务调用的更多相关文章
- 0.9.0.RELEASE版本的spring cloud alibaba sentinel+feign降级处理实例
既然用到了feign,那么主要是针对服务消费方的降级处理.我们基于0.9.0.RELEASE版本的spring cloud alibaba nacos+feign实例添油加醋,把sentinel功能加 ...
- 0.9.0.RELEASE版本的spring cloud alibaba nacos+feign实例
这里的feign依然是原来的feign,只不过将注册中心由eureka换成了nacos.服务提供方参见0.9.0.RELEASE版本的spring cloud alibaba nacos实例,消费方跟 ...
- Spring Cloud Alibaba 之 user服务
项目技术选型 Spring Boot Spring MVC MyBatis + 通用Mapper (官网信息https://mapperhelper.github.io/docs/) Spring C ...
- Spring Cloud Alibaba 新一代微服务解决方案
本篇是「跟我学 Spring Cloud Alibaba」系列的第一篇, 每期文章会在公众号「架构进化论」进行首发更新,欢迎关注. 1.Spring Cloud Alibaba 是什么 Spring ...
- Spring Cloud Alibaba 实战(十三) - Sleuth调用链监控
本文概要:大白话剖析调用链监控原理,然后学习Sleuth,Zipkin,然后将Sleuth整合Zipkin,最后学习Zipkin数据持久化(Elasticsearch)以及Zipkin依赖关系图 实战 ...
- Spring Cloud Alibaba 使用 feign 和 rebion 进行服务消费
微服务的服务消费,一般是使用 feign 和 rebion 调用服务提供,进行服务的消费,本文将实战使用代码讲解服务的消费. 微服务环境的搭建 创建一个 springboot 项目,springboo ...
- Spring Cloud 2-Feign 声明式服务调用(三)
Spring Cloud Feign 1. pom.xml 2. application.yml 3. Application.java 4. Client.java 简化RestTemplate调 ...
- Spring Cloud Alibaba 使用Feign进行服务消费
为什么使用Feign? Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样.你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做. 使用Fei ...
- 7.【Spring Cloud Alibaba】微服务的用户认证与授权
有状态 vs 无状态 有状态 那么Session在何时创建呢? 当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServ ...
随机推荐
- java 动态规划解决上楼梯问题
问题描述: 你正在爬楼梯. 它需要n步才能达到顶峰. 每次你可以爬1或2步. 您可以通过多少不同的方式登顶? 注意:给定n将是一个正整数. Example 1: Input: 2 Output: 2 ...
- 再探循环依赖 → Spring 是如何判定原型循环依赖和构造方法循环依赖的?
开心一刻 一天,侄子和我哥聊天,我坐在旁边听着 侄子:爸爸,你爱我妈妈吗? 哥:这话说的,不爱能有你吗? 侄子:确定有我不是因为荷尔蒙吗? 哥:因为什么荷尔蒙,因为爱情! 侄子:那我妈花点钱,你咋老说 ...
- 得分(JAVA语言)
package 第三章习题; /* * 给出一个由O和X组成的串(长度为1~80),统计得分. * 每个O得分为目前连续出现的O的个数,X得分为0. * 例如,OOXXOXXOOO的得分为 * ...
- js_笔记_8月7日记录_活动对象_作用域链_按值传递
活动对象:简单说就是这个函数的参数和显示声明的变量或函数. 函数内接受的参数实际是创建了一个局部变量:[形参名] = [传进来的值],js的函数传参只传值. 作用域链:执行流进入一个函数,会先创建出作 ...
- HarmonyOS三方件开发指南(14)-Glide组件功能介绍
<HarmonyOS三方件开发指南>系列文章合集 引言 在实际应用开发中,会用到大量图片处理,如:网络图片.本地图片.应用资源.二进制流.Uri对象等,虽然官方提供了PixelMap进行图 ...
- 解决无法通过浏览器访问docker成功安装rabbitMQ后页面问题
我发现了问题后,花了两天的时间解决了这个问题. 一.测试在docker本机中使用curl "ip地址:端口" 查看是否能访问成功,结果是没问题,排除了docker安装失败的问题 二 ...
- 全网最详细的Linux命令系列-less命令
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布
之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...
- JavaScript深入理解-Promise以及常用方法详解
Promise Promise 介绍 Promise 对象表示一个异步操作的最终完成(或失败)及其结果值. 状态: 一个 promise 必然处于以下几种状态之一 待定:初始状态(pending) 已 ...
- resultMap结果集映射解决属性名和字段不一致问题
解决属性名和字段名不一致的问题 1.出现的问题 数据库中的字段 新建一个项目,拷贝之前的,测试实体类与数据库字段不一致的情况 public class User { private int id; ...