当前位置: 首页 > news >正文

服务调用---------Ribbon和Feign

目录​​​​​​​

1、Ribbon

1.1 Ribbon简介

1.2 Ribbon负载均衡

负载均衡原理

负载均衡策略

Ribbon和Nginx的区别

1.3 服务调用和Ribbon负载均衡实现

2、Feign&openFeign

3、Feign支持的配置

日志功能

 连接池

 feign-api远程包


1、Ribbon

1.1 Ribbon简介

Ribbon是一个用于客户端负载均衡的组件,它是Netflix开源的一个项目。在微服务架构中,系统会拆分为多个小型的服务,每个服务都有自己独立的服务器实例。Ribbon所具有的特点:客户端负载均衡,将请求发送到多个服务实例中的一个。多种负载均衡算法:Ribbon支持多种负载均衡算法,如轮询、随机、权重等,可以根据应用的需求选择适合的算法。服务实例自动发现:Ribbon可以与服务注册中心集成,自动发现可用的服务实例。容错和重试机制:如果某个服务实例不可用,Ribbon会自动选择另一个可用的实例进行请求,提高系统的容错能力。

1.2 Ribbon负载均衡

负载均衡原理

服务提供者order-service通过发起请求localhost:8080/order/101远程调用http://user-service/user/1分别轮询转发到服务消费者user-service和user-service1。

//继承客户端请求的负载均衡拦截器
LoadBalancerInterceptor implements ClientHttpRequestInterceptor@Overridepublic ClientHttpResponse intercept(final HttpRequest request, final byte[] body,final ClientHttpRequestExecution execution) throws IOException {final URI originalUri = request.getURI();  //服务的路径String serviceName = originalUri.getHost();  // 不同路径的服务名Assert.state(serviceName != null,"Request URI does not contain a valid hostname: " + originalUri);return this.loadBalancer.execute(serviceName,   // 处理不同服务执行路径this.requestFactory.createRequest(request, body, execution));}//从服务列表中选择一个去执行
public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint)throws IOException {ILoadBalancer loadBalancer = getLoadBalancer(serviceId);Server server = getServer(loadBalancer, hint);if (server == null) {throw new IllegalStateException("No instances available for " + serviceId);}RibbonServer ribbonServer = new RibbonServer(serviceId, server,isSecure(server, serviceId),serverIntrospector(serviceId).getMetadata(server));return execute(serviceId, ribbonServer, request);}

负载均衡策略

实现类

名称

解释

RoundRobinRule

轮询策略

按照轮询的方式选择可用的服务实例,依次轮流分发请求。

RandomRule

随机策略

随机选择可用的服务实例来处理请求。

WeightedResponseTimeRule

加权响应时间策略

根据每个服务实例的响应时间和权重,来计算一个权重值,选择权重值较小的实例处理请求。

RetryRule

重试策略

在选择可用的服务实例时,会在一定次数内进行重试,以提高容错能力。

BestAvailableRule

最低并发策略

会先过滤出并发连接数量最低的服务实例,然后从中选择一个处理请求。

AvailabilityFilteringRule

可用性过滤策略

首先排除因故障而被标记为不可用的服务实例,然后按照轮询的方式选择可用的服务实例。

ZoneAvoidanceRule

区域感知策略

Ribbon会根据服务实例所在的区域以及区域的可用性来选择服务实例。

Ribbon和Nginx的区别

架构上:Ribbon是一个客户端负载均衡组件,它通常与服务调用客户端集成在一起,通过轮询、随机等算法选择可用的服务实例。而Nginx是一个独立的反向代理服务器,用于将客户端请求转发给后端服务器。

协议上:Ribbon主要用于HTTP、TCP等通信协议的负载均衡,适用于微服务架构中的服务调用。而Nginx支持更多的协议,如HTTP、HTTPS、SMTP、POP3等,可以用于多场景的负载均衡和反向代理。

功能上:Ribbon提供了更灵活的负载均衡策略、重试机制、服务健康检查等功能,且可以与Spring Cloud等技术栈集成,方便在微服务架构中使用。而Nginx不仅具有负载均衡和反向代理的功能,还支持缓存、gzip压缩、SSL/TLS加密等高级特性。

部署管理上:Ribbon通常作为客户端的一部分集成在应用程序中,可以在应用中灵活配置和管理,适合分布式部署。而Nginx是独立的服务器软件,需要单独部署和配置,可以集中管理多个应用的负载均衡配置。

1.3 服务调用和Ribbon负载均衡实现

Ribbon依赖于spring-cloud-starter-netflix-eureka-client包

  •  自定义创建远程调用对象
/*** 远程调用和负载均衡* @return*/@LoadBalanced@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}

controller发出的请求完成调用并进行负载均衡默认的轮询负载均衡

//远程调用
User user = restTemplate.getForObject("http://user-service/user/" + order.getUserId(), User.class);

自定义负载均衡策略对象

/*** 自定义负载均衡策略*/@Beanpublic IRule randomRule(){return new RandomRule();}

application.yml配置负载均衡策略

user-service:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
ribbon:eager-load:enabled: trueclients: userservice  # 饥饿加载

以上是Ribbon完成的负载均衡调用远程微服务。

2、Feign&openFeign

Feign是一个受Retrofit、JAXRS-2.0和WebSocket启发的Java到HTTP客户端绑定。是声明式客户端,通过发送Rest接口进行请求。为了维护请求参数,让编程规范更统一使代码更有可读性。

官网

  • pom.xml
<!-- openfeign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
  • 主启动类OrderApplication

加上@EnableFeignClients开启了远程调用。

@EnableFeignClients
@MapperScan("com.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
  • 自定义Feign客户端接口
@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);}

controller接口注入UserClient接口并使用Feign发出http的Get请求查询用户。

@GetMapping("{orderId}")public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {// 根据id查询订单并返回Order order = orderService.queryOrderById(orderId);//远程调用
//        User user = restTemplate.getForObject("http://user-service/user/" + order.getUserId(), User.class);//使用Feign发起http请求,查询用户User user = userClient.findById(order.getUserId());order.setUser(user);return order;}

这样代码优雅的可读性,成功调用并实现负载均衡~

3、Feign支持的配置

日志功能

日志级别:

BASIC:仅记录请求的方法,URL以及响应状态码和执行时间。

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

HEADERS:记录请求的方法,URL以及响应状态码和执行时间,额外记录了请求和响应的头信息。

NONE:默认值,不记录任何日志信息。

自定义config/DefaultFeignConfiguration日志级别的配置类

@Configuration
public class DefaultFeignConfiguration {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.FULL;   //日志级别}}

局部定义在远程接口上:

@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration.class)

全局定义主启动类上:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)

application.yml

feign:client:config: default # 某个微服务userservice设置的日志, default全局日志loggerLevel: FULL # 日志级别

后台打印日志级别FULL效果:

 连接池

  • pom.xml
<!-- httpclient --><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>
  • application.yml
feign:httpclient:  # 连接池enabled: true # 开启feign对HttpClient的支持max-connections: 200 # 最大的连接数,默认200max-connections-per-route: 50  # 每个路径的最大连接数, 默认 50

feign底层通过httpClient进行负载均衡的过程:

 feign-api远程包

  • 新建feign-api模块

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

指定feign扫描服务包

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class, basePackages = "com.itcast.feign.client")

指定feign加载client服务接口

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class, clients = {UserClient.class})

相关文章:

服务调用---------Ribbon和Feign

目录​​​​​​​ 1、Ribbon 1.1 Ribbon简介 1.2 Ribbon负载均衡 负载均衡原理 负载均衡策略 Ribbon和Nginx的区别 1.3 服务调用和Ribbon负载均衡实现 2、Feign&openFeign 3、Feign支持的配置 日志功能 连接池 feign-api远程包 1、Ribbon 1.1 Ribbon简介 Ribb…...

app自动化测试之Appium问题分析及定位

使用 Appium 进行测试时&#xff0c;会产生大量日志&#xff0c;一旦运行过程中遇到报错&#xff0c;可以通过 Appium 服务端的日志以及客户端的日志分析排查问题。 Appium Server日志-开启服务 通过命令行的方式启动 Appium Server&#xff0c;下面来分析一下启动日志&#…...

婚庆服务小程序app开发方案详解

开发一款婚庆行业服务小程序有哪些功能呢&#xff1f; 1、选择分类 选择婚庆、婚车、婚宴、司仪、彩妆、婚庆用品、跟拍、摄影等&#xff0c;筛选出对应的商家 2、选择商家 选择分类后&#xff0c;可以选择商家&#xff0c;查看各个商家的详细介绍情况。 3、选择服务套餐 各…...

集合简述

集合ListArrayListLinkedList SetHashSetTreeSet MapHashMapTreeMap 集合与数组的区别 集合 集合是java中的一个容器&#xff0c;可以在里面存放数据&#xff0c;容量可以发生改变 从集合框架结构可以分析得知&#xff1a; 1、集合主要分为Collection和Map两个接口 2、Collecti…...

常见的软件测试面试题汇总

一、 你们的测试流程是怎么样的&#xff1f; 答&#xff1a;1.项目开始阶段&#xff0c;BA&#xff08;需求分析师&#xff09;从用户方收集需求并将需求转化为规格说明书&#xff0c;接 下来在项目组领导会组织需求评审。 2.需求评审通过后&#xff0c;BA 会组织项目经理…...

学习笔记|大模型优质Prompt开发与应用课(二)|第二节:超高产文本生成机,传媒营销人必备神器

文章目录 01 文字写作技能的革新&#xff0c;各行各业新机遇四大类常见文字工作新闻记者的一天新闻记者的一天–写策划prompt 新闻记者的一天–排采访prompt生成结果prompt生成结果 大模型加持&#xff0c;文字写作我们如何提效营销创作营销创作-使用预置法为不同平台生成文案p…...

Linux基础-4

1、linux高阶命令 1.1、find 在linux文件系统中&#xff0c;用来查找一个文件放在哪里了。 //举例 find /etc -name "interfaces" //总结&#xff1a; //(1)什么时候用find&#xff1f; //当你知道你要找的文件名&#xff0c;但是你忘记了它被放在哪个目录下&…...

oracle-创建函数

oracle自定义函数 核心提示&#xff1a;函数用于返回特定数据。执行时得找一个变量接收函数的返回值; 语法如下: create or replace function function_name ( argu1 [mode1]datatype1, argu2 [mode2] datatype2, … ) return datatype is begin end; 执行 var v1 varchar2(1…...

【Ansible 的脚本 --- playbook 剧本】

目录 一、playbook 剧本介绍二、示例1、运行playbook2、定义、引用变量 三、使用playbook部署lnmp集群 一、playbook 剧本介绍 playbooks 本身由以下各部分组成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在…...

ubuntu释放缓存

sudo sysctl vm.drop_caches1 sudo sysctl vm.drop_caches2 sudo sysctl vm.drop_caches3释放页面缓存&#xff1a; $ sudo sysctl vm.drop_caches1释放目录项和索引节点缓存&#xff1a; $ sudo sysctl vm.drop_caches2释放页面缓存、目录项和索引节点缓存&#xff1a; $ sudo…...

实用调试技巧(1)

什么是bug&#xff1f;调试是什么&#xff1f;有多重要&#xff1f;debug和release的介绍。windows环境调试介绍。一些调试的实例。如何写出好&#xff08;易于调试&#xff09;的代码。编程常见的错误。 什么是Bug 我们在写代码的时候遇到的一些问题而导致程序出问题的就是Bu…...

uniapp:H5定位当前省市区街道信息

高德地图api&#xff0c;H5定位省市区街道信息。 由于uniapp的uni.getLocation在H5不能获取到省市区街道信息&#xff0c;所以这里使用高德的逆地理编码接口地址接口&#xff0c;通过传key和当前经纬度&#xff0c;获取到省市区街道数据。 这里需要注意的是&#xff1a;**高德…...

自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:部分填充的提示模板和提示合成]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 部分填充的提示模板 提示模板是一个具有.format方法的类&#xff0c;它接受一个键值映射并返回一个字符串&#xff08;一个提示&#xff09;&#xff0c;以传递给语言模型。与其他方法一样&#xff0c;将提示模板进行…...

论文笔记--GloVe: Global Vectors for Word Representation

论文笔记--GloVe: Global Vectors for Word Representation 1. 文章简介2. 文章概括3 文章重点技术3.1 两种常用的单词向量训练方法3.2 GloVe3.3 模型的复杂度 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#xff1a;GloVe: Global Vectors for Word Representa…...

day57|● 647. 回文子串 ● 516.最长回文子序列

647. 回文子串 https://leetcode.cn/problems/palindromic-substrings/solution/by-lfool-2mvg/ Given a string s, return the number of palindromic substrings in it. A string is a palindrome when it reads the same backward as forward. A substring is a contiguous…...

docker compose.yml学习

docker compose 安装docker-compose sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composechmod x /usr/local/bin/docker-composeln -s /usr/local/bin/docker-…...

【业务功能篇55】Springboot+easyPOI 导入导出

Apache POI是Apache软件基金会的开源项目&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI 代码实现复杂&#xff0c;学习成本较高。 Easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出…...

对顶堆算法

对顶堆可以动态维护一个序列上的第k大的数&#xff0c;由一个大根堆和一个小根堆组成&#xff0c; 小根堆维护前k大的数(包含第k个)大根堆维护比第k个数小的数 [CSP-J2020] 直播获奖 题目描述 NOI2130 即将举行。为了增加观赏性&#xff0c;CCF 决定逐一评出每个选手的成绩&a…...

node.js的优点

提示&#xff1a;node.js的优点 文章目录 一、什么是node.js二、node.js的特性 一、什么是node.js 提示&#xff1a;什么是node.js? Node.js发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;是一个基于ChromeV8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱…...

golang编译跨平台

golang可以在windows上编译出linux、MacOS等系统上的程序。 go编译器windows下可变翼linux程序&#xff0c;例如&#xff0c;GOARCHamd64 和 GOOSlinux 可以用于编译 64 位的 Linux 平台上的可执行文件。&#xff1a; set GOARCHamd64 set GOOSlinux go build main.go通过设置…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...