Ribbon、LocdBalance和openFeign的实战

news2024/9/24 7:15:57

Ribbon

使用RestTemplate时,如果不加@LoadBalance,调用不通,需要使用@LoadBalance作为负载均衡

手写一个客户端的负载均衡器

@GetMapping("order/create2")
    public String createOrder2(){
        List<ServiceInstance> instances = discoveryClient.getInstances("stock-service");
        String uri = instances.get(0).getUri().toString(); // 获取第一个url,也可以自己进行负载均衡(随机、轮询)
        System.out.println("uri:"+uri);
        return restTemplate.getForObject(uri+ "/stock/reduce", String.class);
    }

ribbon是netflix开源的一个客户端负载均衡器,不过现在已经不再更新了(闭源)

nacos中使用ribbon来做负载均衡

nacos-discovery中已经包含了ribbon

负载均衡规则

默认是轮询

 

修改负载均衡规则

使用java配置的方式(在调用方进行)

添加配置,使用random的方式进行负载均衡

public class RibbonConfig {

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

}

配置对应的服务的负载均衡策略 

@Configuration
@RibbonClient(name = "stock-service", configuration = RibbonConfig.class)
public class StockRibbonConfig {
}

使用配置文件配置

stock-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

java配置高于配置文件配置

全局配置

一般不使用全局配置

直接在配置类上加@Configuration

@Configuration
public class RibbonConfig {

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

}

懒加载

ribbon默认是懒加载,第一次调用会很慢,可以改成饿加载

ribbon:
  eager-load:
    enabled: true
    clients: stock-service

LoadBalance

 LoadBalance是spring cloud提供的客户端的负载均衡器,用来替代ribbon

ribbon与LoadBalance对比

RestTemplate的扩展点是LoadBalancerClient

LoadBalance的使用

nacos-discovery中集成了ribbon,需要剔除掉

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

添加loadBalance依赖

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

这样也可以使用RestTemplate进行服务调用

自定义负载均衡策略

LoadBalance自定义负载均衡策略需要实现ReactorServiceInstanceLoadBalancer接口

public class CustomerLoadBalancer implements ReactorServiceInstanceLoadBalancer {

    private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSuppliers;

    public CustomerLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSuppliers){
        this.serviceInstanceListSuppliers = serviceInstanceListSuppliers;
    }

    @Override
    public Mono<Response<ServiceInstance>> choose(Request request) {
        ServiceInstanceListSupplier supplier = serviceInstanceListSuppliers.getIfAvailable();
        return supplier.get().next().map(this::getInstanceResponse);
    }

    private Response<ServiceInstance>  getInstanceResponse(List<ServiceInstance> instances){
        return new DefaultResponse(instances.get(0)); // 可以自己实现负载均衡
    }

}

OpenFeign

常见的http客户端

HttpClient

apache下的,提供丰富、高效、最新的http请求

Okhttp

轻量级,一般用于安卓

HttpURLConnection

feign底层默认的就是HttpURLConnection,jdk中标准的http客户端;单线程

RestTemplate

介绍

openFeign是Netflix开源的声明式HTTP客户端

优点:

可以做到使用http请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方,更感知不到这是个http请求

openFeign实现远程http调用

 

 整合openFeign

引入依赖

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

添加注解@EnableFeignClients

openFeign不用添加配置

client写法

@FeignClient("stock-service")
public interface StockClient {

    @GetMapping("/stock/reduce")
    String reduce();
}

调用

   @Autowired
    private StockClient stockClient;

    @GetMapping("order/create3")
    public String createOrder3(){
        return stockClient.reduce();
    }

openFeign中也集成了ribbon

openFeign通过ribbon做负载均衡,ribbon从nacos client获取服务列表

日志级别

生产环境中一般使用BASIC、NONE

 

配置日志级别

(需要提前配置好springboot的日志级别)

代码配置

添加配置类

public class StockFeignConfig {

    @Bean
    public Logger.Level level(){
        return Logger.Level.FULL;
    }
}
@FeignClient(name = "stock-service", configuration = StockFeignConfig.class)

 配置文件

feign:
  client:
    config:
      stock-service:
        loggerLevel: full

 全局配置

不推荐

@Configuration
public class StockFeignConfig {

    @Bean
    public Logger.Level level(){
        return Logger.Level.FULL;
    }
}

推荐

@EnableFeignClients(defaultConfiguration = StockFeignConfig.class)

 推荐

feign:
  client:
    config:
      default:
        loggerLevel: full

配置项

Contract

    @Bean
    public Contract feignContract(){
        return new SpringMvcContract();
    }

Decoder

默认就是SpringDecoder,一般不修改

拦截器

需要实现RequestInterceptor接口

Client设置

添加依赖

        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

修改配置 

feign:
  httpclient:
    enabled: true
    max-connections: 200

也是可以使用其他Client

超时配置

    @Bean
    public Request.Options timeout(){
        return new Request.Options(200,500);
    }

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

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

相关文章

Ant Design Pro---【01 环境安装+UMI入门】

入门基础 web 技术 web 技术是指通过 JavaScript&#xff0c;HTML&#xff0c;css 来构建网站的技术&#xff0c;mdn 提供了相当方便的文档来帮助我们学习这些知识。 Node.js 前端开发基础环境 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;Node.js 的…

95后阿里P7晒出工资单:狠补了这个,真香···

最近一哥们跟我聊天装逼&#xff0c;说他最近从阿里跳槽了&#xff0c;我问他跳出来拿了多少&#xff1f;哥们表示很得意&#xff0c;说跳槽到新公司一个月后发了工资&#xff0c;月入5万多&#xff0c;表示很满足&#xff01;这样的高薪资着实让人羡慕&#xff0c;我猜这是税后…

分布式事务 --- 理论基础、Seata架构、部署

一、分布式事务问题 1.1、本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a; 1.2、分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c;例如&am…

[OtterCTF 2018]之Misc篇(NSSCTF)刷题记录⑦

NSSCTF-Misc篇-[OtterCTF 2018] [OtterCTF 2018]General Info[OtterCTF 2018]Play Time[OtterCTF 2018]Silly Rick[OtterCTF 2018]What the password?[OtterCTF 2018]Name Game[OtterCTF 2018]Hide And Seek[OtterCTF 2018]Name Game 2[OtterCTF 2018]Path To Glory[OtterCTF …

软光敏算法学习之二

《监控设备日夜模式的切换方法、系统、设备及存储介质》专利学习笔记 一、主要原理&#xff1a; 在夜模式下时&#xff0c;判断摄像头的传感器感知的光强度是否大于第一切换阈值&#xff1b;如果所述光强度大于第一切换阈值&#xff0c;则判断摄像头拍摄的图像中符合红外响应特…

【源码解析】Spring Cloud Gateway的断言和过滤器源码解析

路由断言(Route Predicate)工厂 Spring Cloud Gateway包括许多内置的路由断言(Route Predicate)工厂&#xff0c;所有这些Predicate都与HTTP请求的不同属性匹配。多个Route Predicate工厂可以进行组合。 官方文档&#xff1a;https://docs.spring.io/spring-cloud-gateway/do…

TCP协议结构

文章目录 TCP---传输控制协议TCP报文结构 TCP—传输控制协议 缓冲区的意义 TCP协议是自带发送和接收缓冲区的&#xff0c;相当于malloc了两段内存空间。 系统调用接口send,write等并不是直接把数据发送到网络上&#xff0c;而是把数据拷贝到TCP的发送缓冲区&#xff0c;至此应…

Java读取Properties配置文件的6种方式

Java读取Properties的方式 项目结构&#xff1a;经典的maven项目结构 配置文件1和2内容一致&#xff1a; jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urlmysql://localhost:3306/database?useUnicodetrue&characterEncodingutf-8&serverTimezoneAsia/Shanghai jdbc.…

Axios二次封装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Axios是什么&#xff1f;二、为什么要对Axios进行二次封装三、Axios二次封装1.首先&#xff0c;安装 Axios&#xff1a;2.创建一个名为 http.js 的文件&#xf…

AI 工具合辑盘点(三)持续更新

人工智能技术的发展已经改变了我们的生活&#xff0c;越来越多的AI工具正在被广泛应用于各个领域。ChatGPT这样的代表性AI模型正在大放异彩&#xff0c;为我们带来了无数的便利和惊喜。在本文中&#xff0c;我们将介绍一系列优秀的AI工具&#xff0c;这些工具可以帮助你完成各种…

课程教学大纲系统的设计与实现

技术栈&#xff1a; Nginx、MySQL、Maven、SpringBoot、Spring、SpringMVC、MyBatis、HikariCP、fastjson、slf4j、Vue、NodeJS系统功能&#xff1a; 本系统分教师和管理员两种角色&#xff0c;不同角色可操作的功能不尽相同&#xff0c;各个角色具体功能如下&#xff1a;教师 …

Python实现哈里斯鹰优化算法(HHO)优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

SpringCloud------Eureka单机版整合生产以及消费(四)

SpringCloud------Eureka&#xff08;四&#xff09; Eureka 读音&#xff1a;有瑞卡 Eureka基础知识 单机构架步骤 集群构建步骤 autuator微服务信息完善 服务发现Discovery eureka自我保护 服务注册与发现 包括&#xff1a; Eureka Zookeeper Consul Nacos 【分布式的CAP理…

FlinkCDC初体验

一、CDC简介 1.1 什么是CDC&#xff1f; CDC是 Change Data Capture(变更数据获取 )的简称。 核心思想是&#xff0c;监测并捕获数据库的 变动&#xff08;包括数据或数据表的插入 、 更新 以及 删除等&#xff09;&#xff0c;将这些变更按发生的顺序完整记录下 来&#xff0c…

【Flask】Python基于Flask应用

Flask介绍 Flask 是一款发布于2010年非常流行的 Python Web 框架。 特点 微框架、简洁&#xff0c;给开发者提供了很大的扩展性。Flask和相应的插件写得很好&#xff0c;用起来很爽。 开发效率非常高&#xff0c;比如使用 SQLAlchemy 的 ORM 操作数据库可以节省开发者大量书…

【LeetCode】数据结构题解(5)[分割链表]

分割链表 1.题目来源2.题目描述3.解题思路4.代码展示 所属专栏&#xff1a;玩转数据结构题型 博主首页&#xff1a;初阳785 代码托管&#xff1a;chuyang785 感谢大家的支持&#xff0c;您的点赞和关注是对我最大的支持&#xff01;&#xff01;&#xff01; 博主也会更加的努力…

聊一聊 GDB 调试程序时的几个实用命令

一&#xff1a;背景 1. 讲故事 用惯了宇宙第一的 Visual Studio 再用其他的开发工具还是有一点不习惯&#xff0c;不习惯在于想用的命令或者面板找不到&#xff0c;总的来说还是各有千秋吧&#xff0c;今天我们来聊一下几个在调试中比较实用的命令&#xff1a; 查看内存硬件…

B站java、计算机学习整理(菜鸟版本)

B站java、计算机学习整理&#xff08;菜鸟版本&#xff09; 简介1、入门篇2、工具篇3、数据库篇4、框架篇5、JVM 篇6、源码篇7、算法与数据结构8、操作系统9、计算机组成原理10、计算机网络11、 设计模式 简介 处在互联网时代&#xff0c;是一种幸福&#xff0c;因为各式各样的…

Win10系统开机自动蓝屏无法使用怎么U盘重装系统?

Win10系统开机自动蓝屏无法使用怎么U盘重装系统&#xff1f;今天和大家一起来分享Win10系统蓝屏之后怎么去进行修复的方法。很多用户都有遇到电脑蓝屏无法启动的问题&#xff0c;那么遇到这个问题之后怎么去重装系统呢&#xff1f;接下来我们来看看以下的解决方法分享吧。 准备…

Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 今天来分享一下如何使用Python突破某网游游戏JS加密限制&#xff0c;进行逆向解密&#xff0c;实现自动登录。 逆向目标 目标&#xff1a;某 7 网游登录 主页&#xff1a;aHR0cHM6Ly93d3cuMzcuY29tLw 接口&#xff1a;aHR…