1.什么是Ribbon及作用
(1)什么是Ribbon?
基于tcp和http的客户端负载均衡工具
(2)Ribbon解决了什么问题?
提供了微服务的负载均衡
2.集中式负载均衡与进程式的负载均衡区别
(1)负载均衡方案有哪些分类?
1)轮询 2)随机 3)权重等等
(2)什么是集中式负载均衡?
(3)什么是进程内负载均衡?
(4)二者之间有什么区别?
1)集中式负载均衡, 即在 consumer 和 provider 之间使用独立的负载均衡设施(可以是硬件,如 F5, 也可以是软件,如 nginx), 由该设施负责把 访问请求 通过某种策略转发至 provider
2)进程内负载均衡,将负载均衡逻辑集成到 consumer,consumer 从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的 provider。
3.Ribbon的入门案例
(1)Ribbon中默认的负载均衡策略是什么策略?
轮询
(2)LoadBalancerClient对象得作用是什么?
Ribbon的负载均衡器
4.Ribbon常见负载均衡策略
(1)Ribbon的负载均衡策略有哪些?
1)轮询策略
2)权重轮询策略
3)随机策略
4)最少并发数策略
5)在“选定的负载均衡策略”基础上进行重试机制
6)可用性敏感策略
(2)每一种负载均衡的特点是什么?
1、轮询策略:轮询策略表示每次都顺序取下一个 provider
2、权重轮询策略:根据每个 provider 的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低
3、随机策略:从 provider 列表中随机选择一个provider
4、最少并发数策略:选择正在请求中的并发数最小的 provider,除非这个provider 在熔断中。
5、在“选定的负载均衡策略”基础上进行重试机制
6、可用性敏感策略
5.如何更换其他负载均衡策略
(1)阐述更换其他负载均衡策略的步骤。
1)在启动类上:
@Bean
public RandomRule createRule(){
return new RandomRule();
}
2)
#设置负载均衡策略 eureka-provider 为调用的服务的名称
eureka-provider.ribbon.NFLoadBalancerRuleClassName
=com.netflix.loadbalancer.RandomRule
6.Ribbon的点对点直连
(1)什么情况下需要配置Ribbon的点对点直连?
直接提供者连接,跳过注册中心
(2)配置Ribbon点对点直连的步骤是什么?
1)添加坐标
<!-- ribbon 坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
7.什么是Feign及作用
(1)什么是Feign?
Feign是一种声明式、模板化的HTTP客户端(仅在consumer中使用)
(2)什么是声明式服务调用?
声明式调用就像调用本地方法一样调用远程方法,无法感知远程http请求。
1、Spring Cloud 的声明式调用,可以做到使用HTTP请求远程服务时能就想调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。
2、它像Dubbo一样consumer直接调用接口方法调用provider,而不需要通过常规的Http Client构造请求再解析返回数据。
3、它解决了让开发者调用远程接口就跟调用本地方法一样无需关注与远程的交互细节,更无需关注分布式环境开发。
(3)声明式服务调用有什么作用?
它像 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>11productservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>11productservice</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>
(3)编写查询所有商品的接口。
//查询所有的商品
@RequestMapping(value = "/findAll",method = RequestMethod.GET)
public List<Product> findAll();
9.Feign入门案例-创建product-provider
(1)创建实现服务API的Provider。
(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>12productprovider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>12productprovider</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>
<!--添加product-service-->
<dependency>
<groupId>com.bjsxt</groupId>
<artifactId>11productservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
</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>
(3)创建Controller实现服务API的接口,并实现接口中的抽象方法。
public List<Product> findAll() {
List<Product> list=new ArrayList<>();
list.add(new Product(1,"辣条"));
list.add(new Product(2,"素牛肉"));
list.add(new Product(3,"牛奶"));
return list;
}
10.Feign入门案例-创建product-consumer
(1)@RestController注解的作用是什么?
@Controller和@ResposeBody
(2)@FeignClient注解的作用是什么?
指明要访问的服务名称
(3)@EnableFeignClients注解的作用是什么?
定义feign客户端 ;
(4)@EnableDiscoveryClient注解的作用是什么?
都是能够让注册中心能够发现,扫描到改服务
11.Feign传递单个参数
(1)阐述Feign传递单个参数的原理。
12.Feign传递多个参数-方式一使用GET
(1)使用Feign基于GET请求传递多个参数的原理是什么?
通过请求发送,使用注解的方式将参数包含在方法的请求信息中
/添加商品多参数方式一:GET
@RequestMapping(value = “/save1”,method = RequestMethod.GET)
Product saveProduct(@RequestParam(name = “id”) Integer id,@RequestParam(name = “name”)String name);
13.Feign传递多个参数-方式二使用POST
(1)使用Feign基于POST请求传递多个参数的原理是什么?
//添加商品多参数方式二:POST
@RequestMapping(value = “/save2”,method = RequestMethod.POST)
Product saveProduct2(@RequestBody Product product);
14.Gzip介绍及Http协议中的传输规则
(1)什么是Gzip?
gzip 是一种数据格式,采用用 deflate 算法压缩 data;gzip 是一种流行的文件
压缩算法,应用十分广泛,尤其是在 Linux 平台。
(2)HTTP协议中关于压缩传输的规定是什么?
第一:客户端向服务器请求中带有:Accept-Encoding:gzip, deflate 字段,向服务器表示,客户端支持的压缩格式(gzip 或者 deflate),如果不发送该消息头,服务器是不会压缩的。
第二:服务端在收到请求之后,如果发现请求头中含有 Accept-Encoding 字段,并且支持该类型的压缩,就对响应报文压缩之后返回给客户端,并且携带 Content-Encoding:gzip 消息头,表示响应报文是根据该格式压缩过的。
第三:客户端接收到请求之后,先判断是否有 Content-Encoding 消息头,如果有,按该格式解压报文。否则按正常报文处理。