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

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

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

常见的软件测试面试题汇总
一、 你们的测试流程是怎么样的? 答:1.项目开始阶段,BA(需求分析师)从用户方收集需求并将需求转化为规格说明书,接 下来在项目组领导会组织需求评审。 2.需求评审通过后,BA 会组织项目经理…...

学习笔记|大模型优质Prompt开发与应用课(二)|第二节:超高产文本生成机,传媒营销人必备神器
文章目录 01 文字写作技能的革新,各行各业新机遇四大类常见文字工作新闻记者的一天新闻记者的一天–写策划prompt 新闻记者的一天–排采访prompt生成结果prompt生成结果 大模型加持,文字写作我们如何提效营销创作营销创作-使用预置法为不同平台生成文案p…...

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

oracle-创建函数
oracle自定义函数 核心提示:函数用于返回特定数据。执行时得找一个变量接收函数的返回值; 语法如下: 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 本身由以下各部分组成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在…...

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

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

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

自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:部分填充的提示模板和提示合成]
分类目录:《自然语言处理从入门到应用》总目录 部分填充的提示模板 提示模板是一个具有.format方法的类,它接受一个键值映射并返回一个字符串(一个提示),以传递给语言模型。与其他方法一样,将提示模板进行…...

论文笔记--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. 文章简介 标题: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软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI 代码实现复杂,学习成本较高。 Easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出…...

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

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

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

关于Spring的bean的相关注解以及其简单使用方法
一、前置工作 第一步:创建一个maven项目 第二步:在resource中创建一个名字叫做spring-config.xml的文件,并把以下代码复制粘贴 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.sprin…...

【计算机视觉】BLIP:源代码示例demo(含源代码)
文章目录 一、Image Captioning二、VQA三、Feature Extraction四、Image-Text Matching 一、Image Captioning 首先配置代码: import sys if google.colab in sys.modules:print(Running in Colab.)!pip3 install transformers4.15.0 timm0.4.12 fairscale0.4.4!g…...

TWILIGHT靶场详解
TWILIGHT靶场详解 下载地址:https://download.vulnhub.com/sunset/twilight.7z 这是一个比较简单的靶场,拿到IP后我们扫描发现开启了超级多的端口 其实这些端口一点用都没有,在我的方法中 但是也有不同的方法可以拿权限,就需要…...

【案例】--GPT衍生应用案例
目录 一、前言二、GPT实现智能问答架构2.1、基本的GPT实现智能问答架构2.2、可应用的GPT实现智能问答架构1、语义转换2、相似度关键字矩阵3、ES中搜索相似度关键字矩阵三、后续一、前言 GPT,全称Generative Pre-trained Transformer ,中文名可译作生成式预训练Transformer。…...

Sip网络音频对讲广播模块, sip网络寻呼话筒音频模块
Sip网络音频对讲广播模块, sip网络寻呼话筒音频模块 一、模块介绍 SV-2101VP和 SV-2103VP网络音频对讲广播模块 是一款通用的独立SIP音频功能模块,可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 该模块支持多种网络协议…...

leetcode1219. 黄金矿工(java)
黄金矿工 leetcode1219. 黄金矿工题目描述回溯算法代码 回溯算法 leetcode1219. 黄金矿工 难度: 中等 eetcode 1219 黄金矿工 题目描述 你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元…...

Svelte框架入门
关键词 前端框架、编译器、响应式、模板 介绍 Svelte /svelt/ adj. 苗条的;线条清晰的;和蔼的 Svelte是一个前端组件框架,就像它的英文名字一样,Svelte的目标是打造一个更高性能的响应性前端框架。 Svelte类似于React和Vue框架&am…...

在linux中进行arm交叉编译体验tiny6410裸机程序开发流程
在某鱼上找了一个友善之臂的Tiny6410开发板用来体验一下嵌入式开发。这次先体验一下裸机程序的开发流程,由于这个开发板比较老旧了,官方文档有很多过期的内容,所以记录一下整个过程。 1. 交叉编译器安装 按照光盘A中的文档《04- Tiny6410 L…...

SpringBoot实战(二十三)集成 SkyWalking
目录 一、简介二、拉取镜像并部署1.拉取镜像2.运行skywalking-oap容器3.运行skywalking-ui容器4.访问页面 三、下载解压 agent1.下载2.解压 四、创建 skywalking-demo 项目1.Maven依赖2.application.yml3.DemoController.java 五、构建启动脚本1.startup.bat2.执行启动脚本3.发…...

深度学习实践——卷积神经网络实践:裂缝识别
深度学习实践——卷积神经网络实践:裂缝识别 系列实验 深度学习实践——卷积神经网络实践:裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 深度学习实践——卷积神经网络实践ÿ…...