目录
- 1 Spring Cloud Alibaba
- 2 Nacos注册中心
- 3 基于OpenFeign的服务调用
1 Spring Cloud Alibaba
1.1 为什么使用spring cloud alibaba
很多人可能会问,有了spring cloud这个微服务的框架,为什么又要使用spring cloudalibaba这个框架了?最重要的原因在于springcloud中的几乎所有的组件都使用Netflix公司的产品,然后在其基础上做了一层封装。然而Netflix的服务发现组件Eureka已经停止更新,公司在使用的时候就发现过其一个细小的Bug;而其他的众多组件预计会在明年(即2020年)停止维护。所以急需其他的一些替代产品,也就是spring cloud alibaba,目前正处于蓬勃发展的态式。
1.2 停更引发的升级*
停更不停用:Spring Cloud Netflix 项目进入了维护模式
- 被动修复bugs
- 不再接受合并请求
- 不再发布新版本
1.3 版本选择
在guli_parent中确认以下依赖的版本
1.3.1、Spring Boot
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
1.3.2、Spring Cloud
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
1.3.3、Spring Cloud Alibaba
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2 Nacos注册中心
2.1 Nacos注册中心
2.2.1、常见注册中心
-
Eureka:Eureka是Spring Cloud Netflix中的重要组件,主要作用就是做服务注册和发现。2.0遇到性能瓶颈,停止维护,现在已经闭源。
-
Consul:Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。
-
Zookeeper:zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目。
-
Nacos(Spring Cloud Alibaba)
-
- Alibaba针对Spring Cloud体系的注册中心
- 相对于 Spring Cloud Eureka 来说,Nacos 更强大
- Nacos = Spring Cloud Eureka + Spring Cloud Config + Spring Cloud Bus
2.2.2、为什么叫Nacos
-
前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的s为Service
-
- Dynamic Naming and Configuration Service
-
Nacos就是:注册中心 + 配置中心的组合
-
- Spring Cloud Alibaba Nacos = SpringCloudEureka + SpringCloudConfig +SpringCloudBus
2.2.3、Nacos下载和安装
下载地址:https://github.com/alibaba/nacos/releases
下载版本:nacos-server-1.1.4.zip 或 nacos-server-1.1.4.tar.gz,解压任意目录即可
2.2.4、启动Nacos
- Windows
启动:双击bin/startup.cmd运行文件
访问:http://localhost:8848/nacos
用户名密码:nacos/nacos
- Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式)
启动命令:sh startup.sh -m standalone
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w59OsmNO-1612077799856)(file:///C:/Users/Administrator/Documents/My Knowledge/temp/61b6967d-c5ee-4b9f-816c-95fc2f5531df/128/index_files/a2b001d1-fd83-4f97-8ab6-aaea2e827389.png)]
2.3、服务注册
2.3.1、引入依赖
service模块中配置Nacos客户端的pom依赖
<!--服务注册-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.3.2、添加服务配置信息
配置application.properties,在客户端微服务中添加注册Nacos服务的配置信息
#spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
2.3.3、添加Nacos客户端注解
在客户端微服务启动类中添加注解
@EnableDiscoveryClient
2.3.4、启动客户端微服务
启动注册中心,启动已注册的微服务,可以在Nacos服务列表中看到被注册的微服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-83k70KUx-1612077799859)(file:///C:/Users/Administrator/Documents/My Knowledge/temp/61b6967d-c5ee-4b9f-816c-95fc2f5531df/128/index_files/4a9b848e-ebd3-4bb2-bc18-b4330095c72d.png)]
2.3.5、注册oss微服务
使用同样的方式注册oss微服务
3 基于OpenFeign的服务调用
3.1 OpenFeign是什么
OpenFeign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。
Nacos很好的兼容了OpenFeign, OpenFeign默认集成了 Ribbon, 所以在Nacos下使用OpenFeign默认就实现了负载均衡的效果。
3.2 OpenFeign的引入
3.2.1、引入依赖
service模块中配置OpenFeign的pom依赖(实际是在服务消费者端需要OpenFeign的依赖)
<!--服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3.2.2、启动类添加注解
在service_edu的启动类添加如下注解
@EnableFeignClients
3.3 OpenFeign的使用
3.3.1、oss微服务中创建测试api
服务的生产者的FileController中添加如下方法:
@ApiOperation(value = "测试")
@GetMapping("test")
public R test() {
log.info("oss test被调用");
return R.ok();
}
3.3.2、edu微服务中创建远程调用接口
服务消费者中创建feign包,创建如下接口:
package com.atguigu.guli.service.edu.feign;
@Service
@FeignClient("service-oss")
public interface OssFileService {
@GetMapping("/admin/oss/file/test")
R test();
}
3.3.3、调用远程方法
服务消费者中的TeacherController中添加如下方法:
@Autowired
private OssFileService ossFileService;
@ApiOperation("测试服务调用")
@GetMapping("test")
public R test(){
ossFileService.test();
return R.ok();
}
3.4 负载均衡
3.4.1、配置多实例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OG31CkZY-1612077839475)(file:///C:/Users/Administrator/Documents/My Knowledge/temp/dfacf924-01c2-4cec-9cde-1ab31009cb98/128/index_files/ad452786-4d4c-4620-ae34-04594e2384c7.png)]
3.4.2、测试负载均衡
对比两个实例输出日志的时间,可以发现默认情况下是轮询策略
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qg6bX6ih-1612077839476)(file:///C:/Users/Administrator/Documents/My Knowledge/temp/dfacf924-01c2-4cec-9cde-1ab31009cb98/128/index_files/1349ce21-3826-4edb-8487-c2ea27213c54.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qjvk8RW6-1612077839478)(file:///C:/Users/Administrator/Documents/My Knowledge/temp/dfacf924-01c2-4cec-9cde-1ab31009cb98/128/index_files/a5e5ec9c-ee07-49f6-a81c-0c17debea9d8.png)]
3.4.3、Ribbon的负载均衡策略
策略名 | 策略描述 |
---|---|
BestAvailableRule | 选择一个最小的并发请求的server |
AvailabilityFilteringRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(activeconnections 超过配置的阈值) |
WeightedResponseTimeRule | 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。 |
RetryRule | 对选定的负载均衡策略机上重试机制。 |
RoundRobinRule | 轮询选择server |
RandomRule | 随机选择一个server |
ZoneAvoidanceRule | 综合判断server所在区域的性能和server的可用性选择server |
配置负载均衡策略的方式:
service-product: # 调用的提供者的名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
3.5 OpenFeign的超时控制
3.5.1、模拟长流程业务
修改oss服务FileController的test方法,添加sleep 3秒:
@ApiOperation(value = "测试")
@GetMapping("test")
public R test() {
log.info("oss test被调用");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return R.ok();
}
3.5.2、远程调用测试
上面的程序在测试时会出现远程调用超时错误。如下:因为OpenFeign默认等待1秒钟,否则超时报错
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QEx0Cbjy-1612077839480)(file:///C:/Users/Administrator/Documents/My Knowledge/temp/dfacf924-01c2-4cec-9cde-1ab31009cb98/128/index_files/146f1042-4134-45d1-895c-fac2b25a0b49.png)]
超时后,服务消费者端默认会发起一次重试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kfpIsaM6-1612077839481)(file:///C:/Users/Administrator/Documents/My Knowledge/temp/dfacf924-01c2-4cec-9cde-1ab31009cb98/128/index_files/6c198286-3e4e-4fc7-aa65-9ef98410cbf6.png)]
重试规则:每隔一秒发起重试
ribbon:
MaxAutoRetries: 0 # 同一实例最大重试次数,不包括首次调用,默认0
MaxAutoRetriesNextServer: 1 # 重试其他实例的最大重试次数,不包括首次所选的server,默认1
3.5.3、解决方案
application.yml文件中配置ribbon的超时时间(因为OpenFeing的底层即是对ribbon的封装)
ribbon:
ConnectTimeout: 10000 #连接建立的超时时长,默认1秒
ReadTimeout: 10000 #处理请求的超时时间,默认为1秒
3.6 OpenFeign日志
3.6.1、作用
OpenFeign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解OpenFeign中Http请求的细节。即对OpenFeign远程接口调用的情况进行监控和日志输出。
3.6.2、日志级别
- NONE:默认级别,不显示日志
- BASIC:仅记录请求方法、URL、响应状态及执行时间
- HEADERS:除了BASIC中定义的信息之外,还有请求和响应头信息
- FULL:除了HEADERS中定义的信息之外,还有请求和响应正文及元数据信息
3.6.3、配置日志bean
在service_edu中创建配置文件
package com.atguigu.guli.service.edu.config;
@Configuration
public class OpenFeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
3.6.4、开启日志
在service_edu中,application.yml中指定监控的接口,以及日志级别
logging:
level:
com.atguigu.guli.service.edu.feign.OssFileService: debug #以什么级别监控哪个接口