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
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。
http://www.itbaizhan.cn/course/id/85.html
无
对应作业
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>(3) 编写查询所有商品的接口。
@RequestMapping("/product")
public interface ProductService {
//查询所有商品
@RequestMapping(value = "/findAll",method = RequestMethod.GET)
public List<Product> findAll();
//根据id查询商品
@RequestMapping(value = "/findById",method = RequestMethod.GET)
Product findById(@RequestParam("id") Integer id);
//添加商品多参数方式一:GET
@RequestMapping(value = "/save1",method = RequestMethod.GET)
Product saveProduct(@RequestParam(name = "id") Integer id,@RequestParam(name = "name")String name);
//添加商品多参数方式二:POST
@RequestMapping(value = "/save2",method = RequestMethod.POST)
Product saveProduct2(@RequestBody Product product);
}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>springcloud-ego-product-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-ego-product-provider</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>
<!--product-provider的坐标-->
<dependency>
<groupId>com.bjsxt</groupId>
<artifactId>springcloud-ego-product-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<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) 创建Controller实现服务API的接口,并实现接口中的抽象方法。
@RestController
public class ProductController implements ProductService {
@Override
public List<Product> findAll() {
List<Product> list=new ArrayList<>();
list.add(new Product(1,"华为手机"));
list.add(new Product(2,"苹果手机"));
list.add(new Product(3,"OPPO手机"));
list.add(new Product(4,"vivo手机"));
return list;
}
@Override
public Product findById(Integer id) {
return new Product(id,"某商品");
}
@Override
public Product saveProduct(Integer id, String name) {
return new Product(id,name);
}
@Override
public Product saveProduct2(@RequestBody Product product) {
return product;
}
}10. Feign入门案例-创建product-consumer
(1) @RestController注解的作用是什么?
即时控制层方法返回结果又是json格式数据
(2) @FeignClient注解的作用是什么?
声明feign客户端,实现服务之间的调用
(3) @EnableFeignClients注解的作用是什么?
启用feign客户端
(4) @EnableDiscoveryClient注解的作用是什么?
启用feign客户端,能够让注册中心发现,扫描到该服务
11. Feign传递单个参数
(1) 阐述Feign传递单个参数的原理。
添加注解,在方法中添加参数进行传递
//根据id查询商品
@RequestMapping(value = "/findById",method = RequestMethod.GET)
Product findById(@RequestParam("id") Integer id);
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 平台。
gzip 能力:当 Gzip 压缩到一个纯文本文件时,效果是非常明显的,大约可以减少 70%以上的文件大小。
gzip 作用:网络数据经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处是 Gzip 与搜索引擎的抓取工具有着更好的关系。例如 Google就可以通过直接读取 gzip 文件来比普通手工抓取 更快地检索网页。
(2) HTTP协议中关于压缩传输的规定是什么?
第一:客户端向服务器请求中带有:Accept-Encoding:gzip, deflate 字段,向服务器表示,客户端支持的压缩格式(gzip 或者 deflate),如果不发送该消息头,服务器是不会压缩的。第二:服务端在收到请求之后,如果发现请求头中含有 Accept-Encoding 字段,并且支持该类型的压缩,就对响应报文压缩之后返回给客户端,并且携带 Content-Encoding:gzip 消息头,表示响应报文是根据该格式压缩过的。第三:客户端接收到请求之后,先判断是否有 Content-Encoding 消息头,如果有,按该格式解压报文。否则按正常报文处理
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3153736/ ,如需转载,请注明出处,否则将追究法律责任。