125Ribbon负载均衡工具类 Feign服务间调用

2020-05-25 00:00:00 请求 调用 方法 策略 负载均衡

1. 什么是Ribbon及作用

(1) 什么是Ribbon?

Ribbon是一个基于HTTP和TCP的客户端负载均衡工具。它是基于Netflix Ribbon实现的。几乎存在于每一个spring cloud微服务中

(2) Ribbon解决了什么问题?

解决了微服务负载均衡问题

2. 集中式负载均衡与进程式的负载均衡区别

(1) 负载均衡方案有哪些分类?

集中式负载均衡 进程内负载均衡

(2) 什么是集中式负载均衡?

即在 consumer 和 provider 之间使用独立的负载均衡设施(可

以是硬件,如 F5, 也可以是软件,如 nginx), 由该设施负责把 访问请求 通过某种策略转发 provider;

(3) 什么是进程内负载均衡?

将负载均衡逻辑集成到 consumer,consumer 从服务注册中

心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的 provider。如:Ribbon

(4) 二者之间有什么区别?

3. Ribbon的入门案例

(1) Ribbon中默认的负载均衡策略是什么策略?

轮询

(2) LoadBalancerClient对象得作用是什么?

可以使用choose方法传参服务器的名字,获取服务器的基本信息,比如IP,端口号

4. Ribbon常见负载均衡策略

(1) Ribbon的负载均衡策略有哪些?

1.轮询策略 2.权重轮询策略 3.随机策略 4.少并发数策略 5.在“选定的负载均 衡策略”基础上进行重 试机制 6.可用性敏感策略 7.区域敏感性策略

(2) 每一种负载均衡的特点是什么?

5. 如何更换其他负载均衡策略

(1) 阐述更换其他负载均衡策略的步骤。

方法1.在启动类中添加@Bean返回负载均衡策略对象的方法

@Bean

public RandomRule createRule(){

return new RandomRule();

}

方法2修改配置文件更换负载均衡策略

#设置负载均衡策略 eureka-provider 为调用的服务的名称

eureka-provider.ribbon.NFLoadBalancerRuleClassName=com.netf

lix.loadbalancer.RandomRule

分享/讲解/扩展思考

点名提问从节课到后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。

第240次(Ribbon&Feign)

学习主题:Ribbon&Feign

学习目标:

对应视频:

itbaizhan.cn/course/id/

对应文档:

对应作业

6. Ribbon的点对点直连

(1) 什么情况下需要配置Ribbon的点对点直连?

不需要借助服务中心时,可点对点实现ribbon连接

(2) 配置Ribbon点对点直连的步骤是什么?

1. 去掉 Eureka 的坐标添加 Ribbon 坐标

<!-- ribbon 坐标 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-ribbon</artifactId></dependency>

2. 修改配置文件去掉与 Eureka 相关的配置,添加新配置项

spring.application.name=eureka-consumer-LB

server.port=9091

#禁用 eureka

ribbon.eureka.enabled=false

#指定具体的服务实例清单

eureka-provider.ribbon.listOfServers=192.168.70.137:9090

3.修改启动类去掉报错代码

7. 什么是Feign及作用

(1) 什么是Feign?

Feign 是一种声明式、模板化的 HTTP 客户端(仅在 consumer 中使用)。

使得consumer更加简单的调用provider

(2) 什么是声明式服务调用?

声明式调用就像调用本地方法一样调用远程方法;无感知远程 http 请求。

(3) 声明式服务调用有什么作用?

1,Spring Cloud 的声明式调用, 可以做到使用 HTTP 请求远程服务时能就像调用本地

方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。

2,它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的

Http Client 构造请求再解析返回数据。

(4) 声明式服务调用决了什么?

它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细

节,更无需关注分布式环境开发

8. Feign入门案例-创建product-service

(1) 创建服务的API项目。

(2) 修改POM文件添加相关依赖坐标。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.1.11.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <groupId>com.bjsxt</groupId>
 <artifactId>springcloud-ego-product-service</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <name>springcloud-ego-product-service</name>
 <description>Demo project for Spring Boot</description>

 <properties>
 <java.version>1.8</java.version>
 <spring-cloud.version>Greenwich.SR4</spring-cloud.version>
 </properties>

 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
 </dependency>

 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 </dependencies>

 <dependencyManagement>
 <dependencies>
 <dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-dependencies</artifactId>
 <version>${spring-cloud.version}</version>
 <type>pom</type>
 <scope>import</scope>
 </dependency>
 </dependencies>
 </dependencyManagement>

 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 </plugins>
 </build>

</project>

相关文章