微服务架构---Ribbon\Feign

server/2024/9/25 10:51:38/

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-orderdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///xinxin?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: 20020630cloud: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.ppmy.cn/server/121787.html

相关文章

C语言练习:通讯录

简单版代码讲解&#xff1a; 这个版本不涉及文件操作以及动态内存分配&#xff0c;有助于理解代码。 文件管理 这里我们分了三个文件&#xff0c;.h 文件里给出类型声明和函数声明&#xff0c;contact.c 文件是具体的实现&#xff0c;test.c文件里是游戏的实现逻辑。 test.c…

Pinia从安装到使用

什么是Pinia 添加Pinia到vue项目 使用Pinia实现计数器案例 counter.js import {defineStore} from "pinia"; import {ref} from "vue";export const useCounterStore defineStore(coutner,()>{//定义数据&#xff08;state&#xff09;const count r…

Hadoop的安装

文章目录 一. 到Hadoop官网下载安装文件hadoop-3.4.0.tar.gz。二. 环境变量三. 配置 一. 到Hadoop官网下载安装文件hadoop-3.4.0.tar.gz。 随后点击下载即可 由于Hadoop不直接支持Windows系统&#xff0c;因此&#xff0c;需要修改一些配置才能运行 二. 环境变量 三. 配置 进…

android13 系统默认设置静态IP

android11系统的时候&#xff0c;默认静态IP设置很简单&#xff0c;修改frameworks\base\core\res\res\values\config.xml中的config_ethernet_interfaces字符数组&#xff0c;在里面添加静态IP的参数就可以了。 <string-array translatable"false" name"c…

IDEA类和方法注释模板设置

一、概述 IDEA自带的注释模板不是太好用&#xff0c;我本人到网上搜集了很多资料系统的整理了一下制作了一份比较完整的模板来分享给大家&#xff0c;写这篇文章只是为了让大家省事。 适用于通过在项目工具窗口中调用新建 | Java 类 | 类创建的新 Java 类。 此内置模板…

C 字符串操作

strcpy char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。 #include <stdio.h> #include <stdlib.h> #include <string.h>char* my_strcpy(char *dst, char *src) {if(dst NULL || src NULL){return NULL;}char *ret dst…

2024最新Linux发行版,Kali Linux迎来劲敌,零基础入门到精通,收藏这一篇就够了

概念简介 Parrot OS 是一款基于 Debian 的 Linux 发行版&#xff0c;专门为安全研究、渗透测试、开发以及隐私保护而设计。由 Frozenbox 团队开发的 Parrot OS&#xff0c;结合了现代安全工具、用户友好的环境以及出色的隐私保护特性&#xff0c;成为网络安全从业者、开发人员…

2024.9.24 Python与C++面试八股文

1.extern extern关键字用于在多个文件中引用同一个全局变量的声明 在一个头文件中&#xff0c;如果这个变量声明了&#xff0c;但是在cpp文件中没找到他的定义&#xff0c;那么编译就会报错&#xff0c;但是如果加了extern&#xff0c;编译器就不会给头文件报错&#xff0c;而…