SpringCloud 学习(三)Ribbon 和 Feign

4. Netflix.Ribbon

4.1 简介

(1) 概念

  • Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡工具

(2) 负载均衡(LB:LoadBalance)和集群架构

在这里插入图片描述

  • 应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理,并返回相应数据。
  • 负载均衡设备:将用户访问的请求,根据负载均衡算法,分发到集群中的一台处理服务器。(一种把网络请求分散到一个服务器集群中的可用服务器上去的设备)。
  • 负载均衡的作用(解决的问题):
    • 解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力);
    • 提供故障转移,实现高可用;
    • 通过添加或减少服务器数量,提供网站伸缩性(扩展性);
    • 安全防护;(负载均衡设备上做一些过滤,黑白名单等处理)

(3) 负载均衡分类

  • 集中式 LB
    • 在服务的消费方和提供方之间使用独立的 LB 设施,如 Nginx(反向代理服务器),由该设施把访问请求通过某种策略转发至服务的提供方。
  • 进程式 LB
    • 将 LB 逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后从这些地址中选用一个服务器。
    • Ribbon 属于进程式 LB,它是一个类库,集成于消费方进程,消费方通过它来获取提供方的地址。

4.2 集成 Ribbon

调整 springcloud-consumer-dept-80 服务

● 添加依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId><version>1.4.6.RELEASE</version>
</dependency><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId><version>1.4.6.RELEASE</version>
</dependency>
● 为 RestTemplate 配置负载均衡
@Configuration  // spring applicationContext.xml
public class ConfigBean {// 注册 bean <bean></bean>@Bean// 配置负载均衡实现 RestTemplate@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}
● 修改获取远程服务的地址
// DeptConsumerController
// Ribbon 实现负载均衡,此处的地址应是一个变量——服务名
// private static final String REST_URL_PREFIX = "http://localhost:8001";
private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";
● 添加 Eureka 配置
# eureka
eureka:client:# 不向 eureka 注册自己register-with-eureka: false# 列出可使用的服务地址供消费者服务选择service-url:defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
● 开启 Eureka 客户端服务
@SpringBootApplication
@EnableEurekaClient
public class DeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(DeptConsumer_80.class, args);}
}

4.3 模拟多服务访问

● 创建数据库

在这里插入图片描述

cloud01.dept.db_source = cloud01
cloud02.dept.db_source = cloud02
cloud03.dept.db_source = cloud03
● 创建两个 maven 模块作为服务提供者

springcloud-provider-dept-8001
springcloud-provider-dept-8002
springcloud-provider-dept-8003

在这里插入图片描述

  • 修改配置文件

    springcloud-provider-dept-8001 => cloud01
    springcloud-provider-dept-8002 => cloud02
    springcloud-provider-dept-8003 => cloud03
    
● 访问效果

在这里插入图片描述

在这里插入图片描述

4.4 自定义 Ribbon 规则

(1) 创建 Ribbon 配置类

  • 自定义配置类的组件会覆盖 RibbonClientConfiguration 中的组件来完成配置。

  • 自定义配置类的注解必须是 @Configuration,其不在主应用程序下的 @ComponentScan 中,否则将由所有 @RibbonClients 共享,若使用 @ComponentScan / @SpingBootApplication,则需要采取避免措施,,如将其放在一个单独的,不重叠的包中,或指定在 @ComponentScan。

  • 自定义配置类放在启动类所在的目录外

    在这里插入图片描述

    /*** 每个服务访问 5 次,选择下一个服务* @author why* @since 2021/9/7 21:02*/
    public class RoundFiveRule extends AbstractLoadBalancerRule {// 被调用次数private int toltal = 0;// 当前提供服务的索引private int currentIndex = 0;// @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {return null;}Server server = null;while (server == null) {if (Thread.interrupted()) {return null;}// 获取可用服务List<Server> upList = lb.getReachableServers();// 获取所有服务List<Server> allList = lb.getAllServers();int serverCount = allList.size();if (serverCount == 0) {return null;}// // 生成区间随机数// int index = chooseRandomInt(serverCount);// // 随机获取可用服务// server = upList.get(index);//===============================================================================if (toltal < 5) {server = upList.get(currentIndex);toltal++;} else {toltal = 1;currentIndex++;if (currentIndex >= upList.size()) {currentIndex = 0;}server = upList.get(currentIndex);}System.out.print(" " + currentIndex + " ");//================================================================================if (server == null) {Thread.yield();continue;}if (server.isAlive()) {return (server);}server = null;Thread.yield();}return server;}protected int chooseRandomInt(int serverCount) {return ThreadLocalRandom.current().nextInt(serverCount);}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(), key);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {// TODO Auto-generated method stub}}
    

(2) 将自定义配置类注册到 Spring 中

@Configuration
public class MyRule {// 将自定义配置类注册到 Spring 中@Beanpublic IRule myRule() {return new RoundFiveRule();}
}

(3) 配置启动类自动加载自定义配置类

@SpringBootApplication
@EnableEurekaClient
/** 微服务启动时,加载 Ribbon 配置类* @param name 服务名* @param configuration 自定义配置类的反射*/
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT", configuration = RoundFiveRule.class)
public class DeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(DeptConsumer_80.class, args);}
}

在这里插入图片描述

虽然 index 为轮询方式,但由于 index 并未与服务进行一对一绑定,所以服务的访问准确来说并不是每 5 次就更换下一个服务。

5. Netflix.Feign

5.1 简介

  • Feign 是声明式的 web service 客户端,它简化了微服务之间的调用。
  • Ribbon 使用微服务名字调用微服务,Feign 使用接口和注解调用微服务。
  • 创建一个接口,使用 Feign 注解进行配置,即可完成对服务提供方的接口绑定。
  • Feign 集成了 Ribbon,通过添加一层的方式增加了代码的可读性,但是性能有所降低

5.2 Feign 实现

调整 springcloud-consumer-dept-80 微服务

● 创建 maven moudle

在这里插入图片描述

● 添加依赖

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId><version>1.4.6.RELEASE</version>
</dependency>

● 删除 Ribbon 配置

● 编写 Feign 服务层

在公共服务 springcloud-api 中添加 Feign 服务层

在这里插入图片描述

/*** Feign 实现服务的调用** @author why* @since 2021/9/9 9:24*/
// 将接口注册到 Spring,否则会报红,但是却不影响调用,原因不明
@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {@GetMapping("/dept/getDept/{id}")public Dept queryById(@PathVariable("id") Long id);@GetMapping("/dept/list")public List<Dept> queryAll();@PostMapping("/dept/add")public boolean addDept(Dept dept);
}

● 启动类开启 Feign 扫描

@SpringBootApplication
@EnableEurekaClient
/** @EnableFeignClients(basePackages = {"com.why.springcloud"})  扫描 springcloud-api * 务 com.why.springcloud 目录及以内目录下的 @FeignClient*/
@EnableFeignClients(basePackages = {"com.why.springcloud"})
public class FeignDeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(FeignDeptConsumer_80.class, args);}
}

● 远程调用

Feign 服务层也可以放在当前服务服务中,此时无需对注解 @EnableFeignClients 的属性赋值

@SpringBootApplication
@EnableEurekaClient
/** @EnableFeignClients 扫描当前服务主类同级及以内目录下的 @FeignClient*/
@EnableFeignClients
public class FeignDeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(FeignDeptConsumer_80.class, args);}
}

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

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

相关文章

Android逆向技术高阶大法

原文链接 Android逆向技术高阶大法 安卓应用是一个客户端&#xff0c;与传统软件类似&#xff0c;需要把软件打包&#xff0c;然后通过某种渠道&#xff08;应用市场&#xff09;分发给用户&#xff0c;这是常规的发布方式&#xff0c;它的更新节奏很慢&#xff0c;从你在应用…

Docker 容器监控之CAdvisor+InfluxDB+Granfana

是什么 一句话&#xff1a;CAdvisor监控收集InfluxDB存储数据Granfana展示图表 CAdvisor InfluxDB Granfana 总结 容器编排CIG CIG CAdvisorInfluxDBGranfana 1、新建目录 2、新建docker-compose.yml文件 version: 3.1volumes:grafana_data: {}services:influxdb:image: t…

C语言实现八种功能的通讯录(添加、删除、查找、修改、显示、排序、退出、清空)

通讯录功能概要及前提说明 此通讯录利用C语言完成&#xff0c;可以实现八种功能的通讯录&#xff08;添加、删除、查找、修改、显示、排序、退出、清空&#xff09; 代码由三部分组成&#xff0c;为什么要写成三部分而不写成一部分可以参考我以前的博客&#xff0c;如下&…

【PMP/软考】软件需求的三个主要层次:业务需求、用户需求和功能需求解释及实例解析

简述 当进行需求分析时&#xff0c;通常着重考虑三个主要层次&#xff1a;业务需求、用户需求和功能需求。业务需求关注项目与组织战略目标的一致性&#xff0c;用户需求明确最终用户的期望&#xff0c;而功能需求定义具体的系统功能和特性。这三个层次为项目管理和软件工程提…

基于改进莱维飞行和混沌映射的粒子群优化BP神经网络预测股票价格研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

[架构之路-223]:数据管理能力成熟度评估模型DCMM简介

目录 一、背景 二、评估依据 三、评估内容 四、主要适用对象 五、能力等级 六、不同层次的文件&#xff1a; 一、背景 信息技术与经济社会的交汇融合引发了数据爆发式增长。数据蕴含着重要的价值&#xff0c;已成为国家基础性战略资源&#xff0c;正日益对全球生产、流通…

更适合程序员体质的PPT制作工具——Slidev

Slidev简介 Slidev是什么 Slidev是一款基于Vue.js的现代化幻灯片制作工具&#xff0c;它可以帮助用户快速、高效地制作出美观、专业的幻灯片。 目前市面上有很多功能丰富的、通用的、所见即所得的幻灯片制作工具&#xff0c;例如 微软 PowerPoint 或 苹果 Keynote. 它们在制…

tp8 Editor.md

Editor.md - 开源在线 Markdown 编辑器 放于public文件夹下 html代码&#xff1a; <div class"layui-col-md12" id"content"><textarea name"content" placeholder"详情" class"layui-textarea">{notempty nam…

buuctf web [极客大挑战 2019]Upload

上传头像&#xff0c;上传一下&#xff0c;看看能不能成功 抓包&#xff0c;抓取上传时的数据,看看限制条件 改两个地方&#xff0c;符合上传图片的要求&#xff0c;上传试试 一句话木马的<?被扳了 改一下木马的格式 <script language"php">eval($_POST[cm…

Tomcat 开启远程调试

Tomcat 部署的 war包工程开启远程调试 Linux服务器下&#xff0c;编辑Tomcat bin 目录下的 startup.sh 文件 vim startup.sh在第一行加入&#xff1a;(不换行&#xff0c;在同一行) declare -x CATALINA_OPTS"-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:…

Redis 集群搭建教程

一、介绍 Redis 集群有着高可用、易扩展、更好的性能等优势&#xff0c;本文主要是实战搭建一个三主三从的 Redis 集群。 正常来说&#xff0c;搭建 Redis 集群需要 6 台服务器。为了简单一点&#xff0c;本文通过一台服务器&#xff0c;6 个端口&#xff0c;搭建一个 Redis …

孜然单授权系统V1.0[免费使用]

您还在为授权系统用哪家而发愁&#xff1f;孜然单授权系统为您解决苦恼&#xff0c;本系统永久免费。 是的&#xff0c;还是那个孜然&#xff0c;消失了一年不是跑路了是没有空&#xff0c;但是这些都是无关紧要的&#xff0c;为大家带来的孜然单授权系统至上我最高的诚意&…

数据安全态势管理:什么是事实,什么是虚构?

考虑到组织存储大量数据的日益复杂的云环境&#xff0c;数据安全态势管理 ( DSPM )的兴起并不令人意外。使组织能够全面了解云数据资产和敏感数据的安全状况的流程对于当今的安全团队来说非常有价值。 尽管 DSPM 的重要性日益凸显&#xff0c;但人们对于它能为企业做什么和不能…

序列化对象(ObjectOutputStream,ObjectInputStream)

1、对象序列化 作用&#xff1a;以 内存 为基准&#xff0c;把内存中的对象存储到磁盘文件中去&#xff0c;称为对象序列化使用到的流是对象字节输出流&#xff1a;ObjectOutputStream package com.csdn.d7_serializable; import java.io.*; public class ObjectOutputStreamDe…

电脑开机慢问题的简单处理

电脑用久了&#xff0c;开机时间要10-20分钟特别慢&#xff0c;一下介绍两种简单有效处理方式&#xff0c;这两种方式经测试不会影响原系统软件的使用&#xff1a; 方式一&#xff1a;禁用非必要启动项【效果不是很明显】 利用360里面的优化加速禁用启动项【禁用启动项还有其…

大数据Flink(八十九):Temporal Join(快照 Join)

文章目录 Temporal Join(快照 Join) Temporal Join(快照 Join) Temporal Join 定义(支持 Batch\Streaming):Temporal Join 在离线的概念中其实是没有类似的 Join 概念的,但是离线中常常会维护一种表叫做 拉链快照表,使用一个明细表去 join 这个 拉链快照表 的 join …

【LeetCode-简单题】501. 二叉搜索树中的众数

文章目录 题目方法一&#xff1a;暴力哈希方法二&#xff1a;利用二叉搜索树的特性&#xff08;递归双指针&#xff09; 题目 方法一&#xff1a;暴力哈希 这是针对于普通二叉树的解法 统计number出现次数 然后将次数最大的众数集 取出来 Map<Integer , Integer > map …

Mysql备份恢复、与日志管理

Mysql日志管理、备份与恢复 一、Mysql日志管理1.1、日志分类1.1.1、错误日志1.1.2 、通用查询日志1.1.3、 二进制日志1.1.4 、慢查询日志1.1.5 、配置日志 1.2、日志的查询 二、备份与恢复2.1、 数据备份的必要性2.2 、造成数据丢失的原因2.3、 数据库备份的分类2.3.1、 物理备…

mysql-4:SQL的解析顺序

SQL语句的解析顺序 文章目录 SQL语句的解析顺序编写顺序与解析顺序解析顺序关键字FROMONOUTER JOINWHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT 解析流程流程分析流程说明WHERE条件解析顺序 编写顺序与解析顺序 编写顺序 SELECT DISTINCT < select_list > FROM &l…

Linux C/C++下收集指定域名的子域名信息(类似dnsmap实现)

我们知道dnsmap是一个工具&#xff0c;主要用于收集指定域名的子域名信息。它对于渗透测试人员在基础结构安全评估的信息收集和枚举阶段非常有用&#xff0c;可以帮助他们发现目标公司的IP网络地址段、域名等信息。 dnsmap的操作原理 dnsmap&#xff08;DNS Mapping&#xff…