【spring cloud】(三)服务调用——Ribbon、OpenFeign

在这里插入图片描述

  各位小伙伴们大家好,欢迎来到这个小扎扎的spring cloud专栏,在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛

💡服务调用知识点速览

  • 🍑 Ribbon
    • 🍏 初识Ribbon
      • 🥭 Ribbon是什么?
      • 🥭 Ribbon能干什么?
    • 🍏 使用Ribbon实现负载均衡
      • 🥭 RestTemplate三步走
      • 🥭 负载均衡算法
  • 🍑 OpenFeign
    • 🍏 初识OpenFeign
      • 🥭 什么是OpenFeign?
      • 🥭 如何使用OpenFeign?
    • 🍏 OpenFeign超时控制
    • 🍏 OpenFeign日志打印

🍑 Ribbon

🍏 初识Ribbon

🥭 Ribbon是什么?

  Ribbon是Netflix发布的开源项目,主要功能是提供对客户端进行负载均衡算法的一套工具,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也可以使用Ribbon实现自定义的负载均衡算法。

🥭 Ribbon能干什么?

  前面提到说Ribbon的作用就是向客户端提供负载均衡算法的工具,那么什么是负载均衡呢?负载均衡就是将用户发来的请求通过算法均摊到多个服务上,从而达到系统的HA(高可用性)

  其中,负载均衡又可分为本地负载均衡(进程内LB)和服务端负载均衡(集中式LB),服务端负载均衡以Nginx为例,用户的所有请求都会交给Nginx,由其决定请求将被转发到哪个服务器;Ribbon是本地负载均衡,在调用接口的时候从 eureka 注册中心服务器端上获取服务注册信息列表缓存到本地,从而可以在本地实现RPC远程调用服务

🍏 使用Ribbon实现负载均衡

  实际上Ribbon可以简单的理解为负载均衡算法 + RestTemplate的调用,也就是说想要使用Ribbon实现负载均衡,就可以通过这两个技术加以实现。

🥭 RestTemplate三步走

  第一步: 引入Ribbon场景启动器依赖,但是之前使用eureka的时候我们在pom文件中导入过netflix-eureka-server的依赖,其中就默认引入了ribbon的场景启动器依赖(netflix-eureka-client也会默认导入),如果再引一次也可以,但是真没那必要。在这里插入图片描述
  第二步: 使用配置文件开启 RestTemplate

/*** @ClassName: ApplicationContextConfig* @Description: 程序配置类,用于开启RestTemplate服务,以供后面使用* @author: chenhao* @date: 2022/7/17*/
@Configuration
public class ApplicationContextConfig {@Bean@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}

  第三步: 使用RestTemplate的API实现负载均衡,RestTemplate的API根据请求方式的不同可以被分为get和post,根据返回类型又可以分为Object(响应体转化成的json串)和Entity(响应的重要信息,包括响应头、状态码、响应体等,可以使用对应的get方法获取到值),所以说最主要的四个API是getForObject、postForObject、getForEntity、postForEntity,这里我把四种API的使用方法都向大家介绍一下

@RestController
@Slf4j
@RequestMapping("consumer")
@Api("消费者的订单管理类")
public class OrderController {// 先注入RestTemplate对象@Resourceprivate RestTemplate restTemplate;// 使用API实现负载均衡@ApiOperation(value = "创建一条支付记录", tags = ApiVersionConstant.v1_0)@PostMapping(value = "/payment/create", produces = {"application/json;charset=UTF-8"})public CommonResult<Integer> create(@RequestBody Payment payment) {return restTemplate.postForObject(UrlConstant.CLUSTER_PAYMENT_URL + "/payment/create", payment, CommonResult.class);}@ApiOperation(value = "根据ID查询支付记录", tags = ApiVersionConstant.v1_0)@GetMapping(value = "/payment/get/{id}", produces = {"application/json;charset=UTF-8"})public CommonResult<Payment> getPayment(@PathVariable("id") Integer id) {return restTemplate.getForObject(UrlConstant.CLUSTER_PAYMENT_URL + "/payment/get/" + id, CommonResult.class);}@ApiOperation(value = "根据ID查询支付记录Entity", tags = ApiVersionConstant.v1_0)@GetMapping(value = "/payment/getForEntity/{id}", produces = {"application/json;charset=UTF-8"})public CommonResult<Payment> getPaymentEntity(@PathVariable("id") Integer id) {ResponseEntity<CommonResult> entity = restTemplate.getForEntity(UrlConstant.CLUSTER_PAYMENT_URL + "/payment/get/" + id, CommonResult.class);if (entity.getStatusCode().is2xxSuccessful()) {return entity.getBody();} else {return new CommonResult<>(444, "操作失败");}}@ApiOperation(value = "创建一条支付记录Entity", tags = ApiVersionConstant.v1_0)@PostMapping(value = "/payment/createEntity", produces = {"application/json;charset=UTF-8"})public CommonResult<Integer> createEntity(@RequestBody Payment payment) {return restTemplate.postForEntity(UrlConstant.CLUSTER_PAYMENT_URL + "/payment/create", payment, CommonResult.class).getBody();}
}

🥭 负载均衡算法

  经过我们上面的尝试,不难发现使用RestTemplate实现的负载均衡算法是轮询机制,实际上IRule中不仅仅只提供了一种算法在这里插入图片描述
IRule实现算法切换

  第一步: 新建一个package,在官方文档中声明了IRule的配置类不能放到@ComponentScan注解所能扫描到的当前包以及子包下,否则自定义的配置类就会被Ribbon的所有客户端所共享,以至于失去客户端定制化的可能性。主程序入口上的@SpringBootApplication注解是复合注解,其中就包含@ComponentScan注解,而且是直接扫描主程序入口所在的当前包以及子包,也就是说配置类必须放到主程序入口之外的包下,于是需要新建一个package

  第二步: 在新建的包中新建一个MySelfRule规则类,用于设置轮询算法,如果不设置的话就默认为轮询

@Configuration
public class MySelfRule {@Beanpublic IRule myRule() {// 修改轮询算法为随机算法return new RandomRule();}
}

  第三步: 主启动类上使用@RibbonClient(name = “CLOUD-PAYMENT-SERVICE”, configuration = MySelfRule.class)注解,用于指定应用服务和自定义算法规则的配置类

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class, args);}
}

轮询算法

  所谓的轮询算法就是根据所有的服务,依次将请求均摊到所有的服务依次访问,它的算法实现就是用RestTemplate接收到的请求数量对服务器集群的数量进行取模运算,余数就是服务在服务列表中对应的索引位置,所以说可以实现轮询。但是如果中途服务器关掉的话接收到的请求数量就会从1重新计数

🍑 OpenFeign

🍏 初识OpenFeign

🥭 什么是OpenFeign?

  openFeign是要声明式的web服务客户端,或叫做声明式REST客户端,它让编写web服务客户端变得简单。它将提供者的restful服务伪装成接口进行消费,消费者只需要通过feign接口+注解就可以直接调用提供者的服务接口,也就是可以实现接口对接口的调用,而无需像ribbon一样通过restTemplate方式对提供者的服务进行调用

  值得注意的一点是,openFeign内置了负载均衡器-Ribbon,所以说openfeign也可以使用负载均衡算法在这里插入图片描述

🥭 如何使用OpenFeign?

  第一步: 引入相关依赖

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

  第二步: 配置配置文件,只是基本配置和注册,没有OpenFeign独有的配置

server:port: 80eureka:client:register-with-eureka: falseservice-url:#服务端的地址,服务端为集群版,向所有的模块都注册defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka

  第三步: 主启动类开启OpenFeign客户端

@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {public static void main(String[] args) {SpringApplication.run(OrderFeignMain80.class, args);}
}

  第四步: 之前使用ribbon是直接在controller里调用payment服务的controller,但是openfeign则是通过service调用,于是第三步就是创建一个service接口用于调用payment服务的接口

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE") // 用于指定服务名,可在eureka或者服务的配置文件中查看
public interface PaymentFeignService {@GetMapping(value = "/payment/get/{id}", produces = {"application/json;charset=UTF-8"})CommonResult<Payment> getPaymentById(@PathVariable("id") Integer id);
}

  第五步: controller层调用service接口

@RestController
@RequestMapping("consumer")
public class OrderFeignController {@Autowiredprivate PaymentFeignService paymentFeignService;@GetMapping(value = "/payment/get/{id}", produces = {"application/json;charset=UTF-8"})public CommonResult<Payment> getPaymentById(@PathVariable("id") Integer id) {return paymentFeignService.getPaymentById(id);}
}

  如此操作也可实现order服务对payment服务的调用,而且由于OpenFeign默认引入Ribbon,去进行order服务访问的时候,后端会默认轮询名为是“CLOUD-PAYMENT-SERVICE”的微服务,也就是两个payment服务

🍏 OpenFeign超时控制

  使用OpenFeign调用服务接口,默认等待时间为1秒,超时就会直接报错。如果有些服务的调用确实会花费超过1s的时间,就需要我们在服务调用方(也就是order服务)的配置文件中进行配置
  由于OpenFeign的超时控制由其底层的ribbon实现,于是配置文件中的超时控制也由ribbon进行配置

#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:#指的是建立连接所用的时间,适用于网络状况正常的情况下, 两端连接所用的时间ReadTimeout: 5000#指的是建立连接后从服务器读取到可用资源所用的时间ConnectTimeout: 5000

🍏 OpenFeign日志打印

  OpenFeign提供了日志打印的功能,我们可以通过日志的打印监控接口的调用情况,从而了解接口调用时HTTP请求的具体细节,具体的使用分
  第一步: 使用配置类配置日志级别

@Configuration
public class FeignConfig {/*** 日志级别* NONE:默认的,不显示任何日志* BASIC:仅记录请求方法、URL、响应状态码以及执行时间* HEADERS:请求方法、URL、响应状态码、执行时间、请求和响应的头信息* FULL:请求方法、URL、响应状态码、执行时间、请求和响应的头信息、正文以及元数据*/@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}

  第二步: 配置文件开启日志打印,并指定监控的接口和级别

logging:level:# feign日志以 debug 级别监控 com.atguigu.springcloud.service.PaymentFeignService 接口com.xiaochen.springcloud.service.PaymentFeignService: debug

打印出来的日志如下:
在这里插入图片描述

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

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

相关文章

c语言斐波那契数列_剑指Offer-10-I.斐波那契数列

题目题目描述写一个函数&#xff0c;输入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项。斐波那契数列的定义如下&#xff1a; F(0) 0, F(1) 1F(N) F(N - 1) F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始&#xff0c;之后的斐波那契数…

mysql 导入 mssql_MySQL(csv,text)导入mssql使用方法

MySQL(csv,text)导入mssql是非常的简单了但是在导入过程中会碰到text字段问题了&#xff0c;下面我们就来看一篇关于MySQL(csv,text)导入mssql使用方法吧&#xff0c;具体的操作细节如下所示。分两步处理&#xff0c;第一步是将csv导入到mysql。没有使用mssql自带客户端的导入功…

c# mvvm模式获取当前窗口_AWTK-MVVM 介绍

MVVM(Model-View-ViewModel)介绍8.1 分离用户界面和业务逻辑在开发应用程序时&#xff0c;要把用户界面和业务逻辑分离开来&#xff0c;这是每个程序员都知道的常识。分离用户界面和业务逻辑有几个重要的好处&#xff1a;有利于隔离变化。用户界面是最容易变化的&#xff0c;易…

【spring cloud】(三)服务降级——Hystrix

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的spring cloud专栏&#xff0c;在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;服务…

mysql高级查询教程_MYSQL高级查询

实际开发中&#xff0c;经常需要对某些数据进行统计&#xff0c;比如&#xff0c;统计某个字段的最大值、最小值、平均值等。MySQL中&#xff0c;提供了一些函数来实现这些功能聚合函数COUNT()——返回某列的行数SUM()——返回某列值的和AVG()——返回某列的平均值MAX()——返回…

【dubbo】(一) dubbo是什么?

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的dubbo专栏&#xff0c;在这个系列专栏中我对B站尚硅谷雷神的dubbo教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;dubbo知识点速览&a…

axios安装_Vue脚手架安装,与基本语法(干货)

首先&#xff0c;这篇Vue文章是为了下一篇我整合springbootvue前后分离的小demo&#xff0c;这两天整理好会上传哈哈1. Node.js安装1.1 下载安装在node.js 官网下载&#xff0c; 根据自己电脑系统安装&#xff0c;一直点下一步即可1.2 测试安装是否成功WindowsR打开cmd窗口&…

base64 能放数组里面么_数组:总结篇

我们做个总结吧数组理论基础数组是非常基础的数据结构&#xff0c;在面试中&#xff0c;考察数组的题目一般在思维上都不难&#xff0c;主要是考察对代码的掌控能力也就是说&#xff0c;想法很简单&#xff0c;但实现起来 可能就不是那么回事了。首先要知道数组在内存中的存储方…

xampp mysql 卸载_卸载Xampp并安装apache + mysql + php 过程

首先是卸载xampp&#xff0c;打开xampp-control.exe 控制面板&#xff0c;停止apache和mysql服务。如果你是安装版xampp&#xff0c;可以到如果不是则安装如下方法。停止服务之后。就需要卸载服务。打开cmd&#xff0c;用sc.exe这个Windows命令开始——运行——cmd.exe&#xf…

nodejs mysql 返回json_python向mysql中存储JSON及Nodejs取出

虽然把JSON数据存入mysql也是比较蛋疼&#xff0c;但是相比使用Nodejs嵌套处理多个mysql查询并拼接返回数据也算是没mongo时的一个折中方案了。我使用python拼接了一个json格式的字符串&#xff0c;却遇到了一些问题1&#xff0c;如果把json数据转成str存入&#xff0c;那么nod…

17个常用经典数据可视化图表与冷门图表

数据可视化是创建信息图形表示的过程。随着可视化技术的飞速发展&#xff0c;可以利用强大的可视化工具选择合适的数据可视化图表来展示数据。以下专业人士都应该知道的一些最重要的数据可视化图表。 常见数据可视化图表 饼图 饼图是最常见和最基本的数据可视化图表之一。饼图…

python keyerror_盘点Python 初学者最容易犯的10大错误!你中招了吗?

对于新手&#xff0c;初学Python时&#xff0c;总会遇到这样那样的报错&#xff0c;想要弄懂Python错误信息的含义可能还不知道怎么做&#xff0c;这里列出了一些比较常见的Python报错问题&#xff0c;希望对于学习Python的人能够有些帮助。发现有很多想要学习Python却不知道如…

【spring cloud】(六)消息总线——springcloud Bus

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的spring cloud专栏&#xff0c;在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Bus…

kali 切换root权限_Ubuntu 被曝严重漏洞:切换系统语言 + 输入几行命令,就能获取 root 权限...

公众号关注 “GitHubDaily”设为 “星标”&#xff0c;带你了解技术圈内新鲜事&#xff01;来自量子位无需系统密码&#xff0c;就能添加新的 sudo 用户、获取 root 权限&#xff0c;事后还能删除不留痕迹。这是 GitHub 安全研究员 Kevin Backhouse 发现的一个 Ubuntu 系统大漏…

oracle定义变量sql赋值_ORACLE获取SQL绑定变量值的方法总结

本文总结一下ORACLE数据库中如何获取SQL绑定变量值的方法&#xff0c;在SQL优化调优过程中&#xff0c;经常会用到这方面的知识点。在此梳理、总结一下这方面的知识点&#xff0c;方面日后查找、翻阅。方法1&#xff1a;查询V$SQLV$SQL视图中的BIND_DATA字段用来存储绑定变量的…

transition css_Transition 过渡

1&#xff1a;基本概念在一定时间内平滑的过渡&#xff0c;也就是圆滑的以动画效果改变css的属性值。它的过渡可以由鼠标点击、焦点获取或者失去、被点击事件或对元素的改变中触发&#xff1b;不能主动触发&#xff0c;只能被动触发。常用的基本属性有&#xff1a;Transition-d…

jdbc mysql分页_JDBC【数据库连接池、DbUtils框架、分页】

1.数据库连接池什么是数据库连接池简单来说&#xff1a;数据库连接池就是提供连接的。。。为什么我们要使用数据库连接池数据库的连接的建立和关闭是非常消耗资源的频繁地打开、关闭连接造成系统性能低下编写连接池编写连接池需实现java.sql.DataSource接口创建批量的Connectio…

python读写文件操作_详解Python文件读写操作

读文件 打开文件&#xff08;文件需要存在&#xff09;#打开文件 f open("data.txt","r") #设置文件对象 print(f)#文件句柄 f.close() #关闭文件 #为了方便&#xff0c;避免忘记close掉这个文件对象&#xff0c;可以用下面这种方式替代 with open(data.t…

【cloud Alibaba】(三)流量控制、熔断降级(下)——Sentinel

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的spring cloud专栏&#xff0c;在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Sen…

python gui入门的例子_Python GUI编程之Tkinter入门之道

相信刚学习使用Python进行GUI编程的时候&#xff0c;肯定都会听过Tkinter&#xff0c;毕竟是standard Python interface to the Tk GUI toolkit.用来写一些小程序还是很方便的。但如果是刚接触GUI编程的话肯定是被官方文档搞的有些懵&#xff0c;毕竟还没弄清楚套路。之前使用过…