微服务架构---Ribbon\Feign

news2024/9/22 4:05:48

Ribbon(负载均衡)

Ribbon概述

在 SpringCloud 中, Nacos⼀般配合Ribbon进行使用Ribbon提供了客户端负载均衡的功能,Ribbon利用从Nacos中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。

Ribbon作用

1.服务调用

基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进⾏调用

2. 负载均衡

当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址

Ribbon实现订单调用商品服务

  1. 不需导入坐标(springcloud提供的服务发现的jar中已包含了Ribbon的依赖)

  2. 商品服务控制层打印查询商品的信息

  3. 订单服务(消费者),添加负载均衡注解

  @Bean
   	@LoadBalanced //负载均衡
   	public RestTemplate getRestTemplate(){
   		return new RestTemplate();
   	}
  1. 订单控制层通过服务名称消费使⽤

image-20240820010643102

Ribbon实现负载均衡

  • 服务端负载均衡

先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择⼀个进⾏访 问

  • 客户端负载均衡

客户端会有⼀个服务器地址列表,在发送请求前通过负载均衡算法选择⼀个服务器,然后进行访问

商品服务举例

  1. 再创建一个商品微服务启动,设置其端口为8082

启动两次服务器验证效果,并查看两个控制台发现以轮询的方式调用了商品服务

负载均衡策略

yml中需要调用的微服务名称默认不写是轮询方式

  • com.netflix.loadbalancer.RoundRobinRule :以轮询(A-B-A-B)的方式进行负载均衡

  • com.netflix.loadbalancer.RandomRule :随机策略

  • com.netflix.loadbalancer.RetryRule :重试策略

  • com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略。会计算每个服务的权重,越高的被调用的可能性越大

  • com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最小的实例返回

  • com.netflix.loadbalancer.AvailabilityFilteringRule :可⽤过滤策略。过滤掉故障和请求数超过阈值的服务实例,再从剩下的实例中轮询调用

  • ZoneAvoidanceRule:以区域可用的服务器为基础进行服务器的选择

✔在启动类方法上添加注解后再运行

自定义负载均衡策略

方式1:定义⼀个新的IRule:(全局设置--->对所有微服务生效)

@Bean
public IRule randomRule(){
 return new RandomRule();
}

方式2:在yml配置文件中配置:(局部设置--->对指定微服务生效)

#需要调⽤的微服务名称
service-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

👏👏👏改进一下

利用RestTemplate发起远程调用,出现可读性差,对于参数复杂的URL难以维护

解决方案:使用Feign远程调用,调⽤远程服务就像调用本地服务

Feign(远程调用)

Feign简介

使得调⽤远程服务就像调⽤本地服务⼀样简单, 只需要创建⼀个接口并添加⼀个注解即可。在Nacos下使用Fegin默认就实现了负载均衡的效果

基本使用

1.添加Fegin的依赖

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

2.添加注解(在主类即启动类上)

@EnableFeignClients  //开启Fegin

3.设计service接口, 使用Fegin实现微服务(向商品服务发请求)

4.配置yml文件

server:
  port: 8091
spring:
  application:
    name: service-order
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///xinxin?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 20020630
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
logging:
  level:
    com.apesource: debug
feign:
  client:
    config:
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

5.修改controller代码,并启动验证

自定义配置

配置文件方式

(1)配置⽂件修改feign的⽇志级别可以针对单个服务

feign:
 client:
   config:
     service-product: # 针对某个微服务的配置
     loggerLevel: FULL # ⽇志级别

(2)针对所有服务

feign:
 client:
   config:
     default: # 这⾥⽤default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL # ⽇志级别

注意:需要把⽇志级别设置

logging:
  level:
    com.apesource: debug

日志的级别分类

  • NONE:不记录任何⽇志信息,这是默认值。

  • BASIC:仅记录请求的⽅法, URL以及响应状态码和执⾏时间

  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息

  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

Feign使用优化

提高Feign的性能主要手段就是使用连接池代替默认的URLConnection

  1. 引入依赖

<!--httpClient的依赖 -->
<dependency>
 	<groupId>io.github.openfeign</groupId>
 	<artifactId>feign-httpclient</artifactId>
</dependency>
  1. 配置连接池

feign:
 client:
   config:
 	 default: # default全局的配置
 		loggerLevel: BASIC # ⽇志级别,BASIC就是基本的请求和响应信息
 httpclient:
 	enabled: true # 开启feign对HttpClient的⽀持
 	max-connections: 200 # 最⼤的连接数
 	max-connections-per-route: 50 # 每个路径的最⼤连接数

总结:

  • 日志级别尽量用basic

  • 使用HttpClient或OKHttp代替URLConnection

    • 引入feign-httpClient依赖配置文件

    • 开启httpClient功能,设置连接池参数

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

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

相关文章

Arthas vmoption(查看和修改 JVM里诊断相关的option)

文章目录 二、命令列表2.1 jvm相关命令2.1.6 vmoption&#xff08;查看和修改 JVM里诊断相关的option&#xff09;举例1&#xff1a;vmoption 查看所有的选项举例2&#xff1a;vmoption MinHeapFreeRatio 查看指定的选项 二、命令列表 2.1 jvm相关命令 2.1.6 vmoption&#x…

精选写作技巧!分享4款ai写毕业论文可以写出公式表格的软件

在撰写毕业论文时&#xff0c;AI写作工具可以极大地提高效率和质量。以下是四款值得推荐的AI软件&#xff0c;它们不仅能够帮助生成高质量的论文初稿&#xff0c;还能处理公式和表格等复杂内容。 传送门&#xff1a;https://www.aipaperpass.com?piclLGw 千笔-AIPassPaper是一…

基于SpringBoot+Vue的私人牙科诊所管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

大模型学习记录之Agent部署

首先&#xff0c;需要明确大模型的概念&#xff0c;通过百度的文心一言的结果&#xff0c;我们得到如下概念&#xff1a; 大模型的特点 大模型&#xff08;Large Models&#xff09; 在人工智能和机器学习领域&#xff0c;特别是深度学习领域&#xff0c;指的是那些具有大量参…

SAP B1 Web Client MS Teams App集成连载四

过程/Procedure&#xff1a; 1.通过点击选项卡旁边的下拉箭头&#xff0c;可以重新配置、重命名和移除现有选项卡。 You can reconfigure, rename and remove an existing tab by clicking the drop down arrow alongside the tab. 要重新配置选项卡&#xff0c;请选择“设置”…

网络安全:腾讯云智、绿盟、美团、联想的面经

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

【用Java学习数据结构系列】用堆实现优先级队列

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study 专栏&#xff1a;用Java学习数据结构系列 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff…

如何在Java中实现用户列表的下载功能

在现代的Web应用中&#xff0c;用户管理是一个常见的需求。用户可能需要查看和下载他们的个人信息或者用户列表。本文将介绍如何使用Java和Spring框架实现用户列表的下载功能&#xff0c;具体采用Excel格式。 一、项目准备 首先&#xff0c;确保你的项目中已经引入了Spring B…

力扣 42.接雨水

文章目录 题目介绍解法 题目介绍 解法 法一&#xff1a;通过计算每个位置 i 能够捕获的雨水量&#xff0c;然后将他们相加。 具体做法是&#xff1a;创建两个数组&#xff1a;preMax 和 sufMax 分别用来存储每个位置左边和右边的最大高度&#xff0c;则每个位置 i 可以捕获的…

【巧用ddddocr破解算术运算验证码的经典示范】

计算型验证码 算术验证码&#xff0c;也叫计算型验证码, 计算型验证码其实是一种特殊的字符型验证码&#xff0c;只不过在它的基础上增加了数字运算。   计算型验证码在将人类视觉和计算机视觉的差异作为区分用户和电脑的依据的同时&#xff0c;还加上了逻辑运算&#xff0c…

数据结构_1.1、数据结构的基本概念

1、基本概念 数据&#xff1a;是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素&#xff1a;数据元素是数据的基本单位&#xff0c;通常作为一个整体进行考虑和处理…

Java高级Day48-JDBC-API和JDBC-Utils

127.JDBC API 128.JDBC-Utils public class JDBCUtils {//这是一个工具类&#xff0c;完成mysql的连接和关闭资源//顶柜相关的属性&#xff08;4个&#xff09;&#xff0c;因为只需要一份&#xff0c;因此做成staticprivate static String user;//用户名private static Stri…

【速成Redis】04 Redis 概念扫盲:事务、持久化、主从复制、哨兵模式

前言&#xff1a; 前三篇如下&#xff1a; 【速成Redis】01 Redis简介及windows上如何安装redis-CSDN博客 【速成Redis】02 Redis 五大基本数据类型常用命令-CSDN博客 【速成Redis】03 Redis 五大高级数据结构介绍及其常用命令 | 消息队列、地理空间、HyperLogLog、BitMap、…

python有main函数吗

python和C/Java不一样&#xff0c;没有主函数一说&#xff0c;也就是说python语句执行不是从所谓的主函数main开始的。 当运行单个python文件时&#xff0c;如运行a.py&#xff0c;这个时候a的一个属性__name__是__main__。 当调用某个python文件时&#xff0c;如b.py调用a.p…

基于微信小程序的童装商城的设计与实现+ssm(lw+演示+源码+运行)

童装商城小程序 摘 要 随着移动应用技术的发展&#xff0c;越来越多的用户借助于移动手机、电脑完成生活中的事务&#xff0c;许多的传统行业也更加重视与互联网的结合&#xff0c;由于城镇人口的增加&#xff0c;人们去商场购物总是排着长长的队伍&#xff0c;对于时间紧的人…

数据类型转换中存在的问题分析

本文档包含内容有&#xff1a; 数据类型转换中的隐式类型转换存在的风险&#xff1b; 整型提升存在的风险 标准算数转换存在的风险数据类型转换中存在的数据类型范围溢出风险&#xff1b;数据类型转换中存在的数据精度问题&#xff08;数据截断&#xff09;。 隐式类型转换&a…

此框架你到底了解多少???

1.简述对Spring中IOC/DI的理解 IOC&#xff1a;控制反转&#xff0c;将创建和管理的对象的任务交给外部的Spring容器 DI&#xff1a;依赖注入&#xff0c;对象之间存在依赖关系&#xff0c;创建对象时&#xff0c;对其依赖的对应直接进行赋值 2.有哪些依赖注入的方式 基于注…

【计算机网络】详解UDP套接字网络字节序IP地址端口号

一、网络字节序 我们已经知道, 内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出; 接收主机把从网络上接到…

软考中级软设背诵内容

冯诺依曼结构、哈佛结构 冯诺依曼结构: 程序指令和数据都采用二进制表示 程序指令和数据在同一个存储器中混合 程序的功能都由中央处理器&#xff08;CPU&#xff09;执行指令来实现 程序的执行工作由指令进行自动控制 SRAM、DRAM 与DRAM相比&#xff0c;SRAM集成率低、功…

页面布局实现-左侧横向滑动展示隐藏数据,右侧固定展示操作按钮。可上下滑动联动

效果图 1.布局排版 <LinearLayoutandroid:layout_width"match_parent"android:layout_height"match_parent"android:orientation"vertical"android:padding"1dp"><LinearLayoutandroid:id"id/lltList"android:lay…