Spring cloud Alibaba Nacos And OpenFeign

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: Spring cloud Alibaba Nacos And 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

不再接受合并请求

不再发布新版本

20210131152237749.png


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


20210131160822289.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服务的配置信息

<!--服务注册-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.3.3、添加Nacos客户端注解

在客户端微服务启动类中添加注解

@EnableDiscoveryClient

2.3.4、启动客户端微服务

启动注册中心,启动已注册的微服务,可以在Nacos服务列表中看到被注册的微服务

# 服务端口
server.port=8003
# 服务名
spring.application.name=service-vod
# 环境设置:dev、test、prod
spring.profiles.active=dev
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#阿里云 vod
#不同的服务器,地址不同
aliyun.vod.file.keyid=LTAI4FvvVEWiTJ3GNJJqJnk7
aliyun.vod.file.keysecret=9st82dv7EvFk9mTjYO1XXbM632fRbG
# 最大上传单个文件大小:默认1M
spring.servlet.multipart.max-file-size=1024MB
# 最大置总上传的数据大小 :默认10M
spring.servlet.multipart.max-request-size=1024MB


20210131160915289.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、配置多实例

20210131160943523.png


3.4.2、测试负载均衡

对比两个实例输出日志的时间,可以发现默认情况下是轮询策略


20210131161000862.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秒钟,否则超时报错


20210131161033635.png


超时后,服务消费者端默认会发起一次重试


20210131161045964.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 #以什么级别监控哪个接口
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
18天前
|
Java API Nacos
第十二章 Spring Cloud Alibaba Sentinel
第十二章 Spring Cloud Alibaba Sentinel
27 0
|
18天前
|
存储 前端开发 Java
第十一章 Spring Cloud Alibaba nacos配置中心
第十一章 Spring Cloud Alibaba nacos配置中心
23 0
|
18天前
|
消息中间件 SpringCloudAlibaba Java
第十章 SpringCloud Alibaba 之 Nacos discovery
第十章 SpringCloud Alibaba 之 Nacos discovery
|
18天前
|
负载均衡 前端开发 Java
第六章 Spring Cloud 之 OpenFeign
第六章 Spring Cloud 之 OpenFeign
15 0
|
18天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
26天前
|
Java API 对象存储
对象存储OSS产品常见问题之使用Spring Cloud Alibaba情况下文档添加水印如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
30 2
|
1月前
|
SpringCloudAlibaba Java 数据库
SpringCloud Alibaba微服务 -- Seata的原理和使用
SpringCloud Alibaba微服务 -- Seata的原理和使用
|
2月前
|
Java Nacos Sentinel
Spring Cloud Alibaba 面试题及答案整理,最新面试题
Spring Cloud Alibaba 面试题及答案整理,最新面试题
249 0
|
2月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
192 0
|
2月前
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
117 0