- 使用SpringBoot开发分布式微服务,面临了什么问题
- SpringCloud和dobbo区别
- SpringCloud有哪些组件,项目中用到了哪些组件
- 服务注册和发现是什么意思?SpringCloud如何实现?Eureka
- 什么是Ribbon?
- 什么是Fegin?
- 什么是Zuul?
- SpringCloud配置中心 Config
- SpringCloud服务跟踪 Zipkin
- 负载平衡的意义什么?
- 什么是Nginx?主要功能?优点
- fastcgi 与 cgi 的区别?(了解)
- Nginx常用命令与配置
- Nginx 有哪些负载均衡策略?
- 微服务中如何实现 session 共享 ?
- RestTemplate 简介
- 应对微服务中的雪崩效应的三种常用手段
因为我学的不多,8大组件互相调用了一下,试了试配置中心,上传GIthub远程服务配置中心等。所以不总结太多了。为什么要用Spring Cloud
不论是商业应用还是用户应用,在业务初期都很简单,我们通常会把它实现为单体结构的应用。但是,随着业务逐渐发展,产品思想会变得越来越复杂,单体结构的应用也会越来越复杂。这就会给应用带来如下的几个问题:
- 代码结构混乱:业务复杂,导致代码量很大,管理会越来越困难。同时,这也会给业务的快速迭代带来巨大挑战;
- 开发效率变低:开发人员同时开发一套代码,很难避免代码冲突。开发过程会伴随着不断解决冲突的过程,这会严重的影响开发效率;
排查解决问题成本高:线上业务发现 bug,修复 bug 的过程可能很简单。但是,由于只有一套代码,需要重新编译、打包、上线,成本很高。
由于单体结构的应用随着系统复杂度的增高,会暴露出各种各样的问题。近些年来,微服务架构逐渐取代了单体架构,且这种趋势将会越来越流行。Spring Cloud是目前最常用的微服务开发框架,已经在企业级开发中大量的应用。
使用SpringBoot开发分布式微服务,面临了什么问题
(1)与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。
(2)服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
(3)冗余-分布式系统中的冗余问题。
(4)负载平衡 —负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。
(5)性能-问题 由于各种运营开销导致的性能问题。
(6)部署复杂性-Devops 技能的要求。
SpringCloud和dobbo区别
两者都是现在主流的微服务框架,但却存在不少差异:
- 初始定位不同:SpringCloud定位为微服务架构下的一站式解决方案;Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理
- 生态环境不同:SpringCloud依托于Spring平台,具备更加完善的生态体系;而Dubbo一开始只是做RPC远程调用,生态相对匮乏,现在逐渐丰富起来。
- 调用方式:SpringCloud是采用Http协议做远程调用,接口一般是Rest风格,比较灵活;Dubbo是采用Dubbo协议,接口一般是Java的Service接口,格式固定。但调用时采用Netty的NIO方式,性能较好。
- 组件差异比较多,例如SpringCloud注册中心一般用Eureka,而Dubbo用的是Zookeeper
SpringCloud有哪些组件,项目中用到了哪些组件
- 服务治理Eureka 基于REST等服务治理解决方案,包括服务提供者 服务消费者 注册中心
- 负载均衡Ribbon 服务之间如何通信 Ribbon+RestTemplete
- 调用远程服务Feign 可以把正常的rest请求,影藏起来,让别人以为这是个本地访问
- 服务网关Zuul API网关组件,对请求提供路由及过滤功能。
- 服务容错(断路器)Hystrix 服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力
- 服务配置Config 分布式的配置方式
- 服务监控Actuator
- 服务跟踪 Zipkin
服务注册和发现是什么意思?SpringCloud如何实现?Eureka
- 在分布式系统架构中,每个微服务在启动时,将自己的信息存储在注册中心,叫做服务注册。
- 服务消费者从注册中心获取服务提供者的网络信息,通过该信息调用服务,叫做服务发现。
当我们开始一个项目时,我们通常在属性文件中进行所有的配置。随着越来越多的服务开发和部署,添加
和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化。手动更改属性可能会
产生问题。Eureka服务注册和发现可以在这种情况下提供帮助。由于所有服务都在Eureka服务器上注
册并通过调用Eureka服务器完成查找,因此无需处理服务地点的任何更改和处理。
心跳:服务提供者定期向Eureka通过http形式向Eureka刷新自己的状态,30秒发一次
什么是Ribbon?
Spring Cloud Ribbon 是一个负载均衡解决方案,Ribbon 是 Netflix 发布的负载均衡器,Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的,是一个用于对 HTTP 请求进行控制的负载均衡客户端。<br /> 在注册中心对 Ribbon 进行注册之后,Ribbon 就可以基于某种负载均衡算法,如_轮询_、随机、加权轮询、加权随机等自动帮助服务消费者调用接口,开发者也可以根据具体需求自定义 Ribbon 负载均衡算法。<br /> 实际开发中,Spring Cloud Ribbon 需要结合 Spring Cloud Eureka 来使用,Eureka Server 提供所有可以调用的服务提供者列表,Ribbon 基于特定的负载均衡算法从这些服务提供者中选择要调用的具体实例。<br />
什么是Fegin?
Fegin在Ribbon等基础上封装。
与 Ribbon 一样,Feign 也是由 Netflix 提供的,Feign 是一个声明式、模版化的 Web Service 客户端,它简化了开发者编写 Web 服务客户端的操作,开发者可以通过简单的接口和注解来调用 HTTP API,Spring Cloud Feign,它整合了 Ribbon 和 Hystrix,具有可插拔、基于注解、负载均衡、服务熔断、提供容错处理 等一系列便捷功能。
相比较于 Ribbon + RestTemplate 的方式,Feign 大大简化了代码的开发,Feign 支持多种注解,包括 Feign 注解、JAX-RS 注解、Spring MVC 注解等,Spring Cloud 对 Feing 进行了优化,整合了 Ribbon 和 Eureka,从而让 Feign 的使用更加方便。
什么是Zuul?
Zuul 是 Netflix 提供的一个开源的 API 网关服务器,是客户端和网站后端所有请求的中间层,对外开放一个 API,将所有请求导入统一的入口,屏蔽了服务端的具体实现逻辑,Zuul 可以实现反向代理的功能,在网关内部实现动态路由、身份认证、IP 过滤、数据监控等。 Zuul自带的负载均衡功能
其核心是一系列的过滤器,可以完成以下功能点:
- 认证和安全 - 对每一个resource进行身份认证
- 追踪和监控 - 实时观察后端微服务的TPS、响应时间,失败数量等准确的信息
- 日志 - 记录所有请求的访问日志数据,可以为日志分析和查询提供统一支持
- 动态路由 - 动态的将request路由到后端的服务上去
- 压力测试 - 逐渐的增加访问集群的压力,来测试集群的性能
- 限流 - allocating capacity for each type of request and dropping requests that go over the limit
- 静态响应 - 直接在网关返回一些响应,而不是通过内部的服务返回响应
什么是 Hystrix?它如何实现容错?
Hystrix 是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。<br />在不改变各个微服务调用关系的前提下,针对错误情况进行预先处理。<br />Hystrix要结合feign来使用
- 设计原则
1、服务隔离机制
防止某个服务提供者出现问题而影响整个系统的运行
2、服务降级机制
服务出现异常时,向服务消费者返回fallback的降级处理
3、熔断机制
当服务消费者请求失败率达到某一个特定的数值的时候,会迅速启动熔断机制并对错误进行修复
4、提供实时的监控和报警功能
5、提供实时的配置修改功能
Hystrix 数据监控需要结合 Spring Boot Actuator 来使用,Actuator 提供了对服务的健康健康、数据统计,可以通过 hystrix.stream 节点获取监控的请求数据,提供了可视化的监控界面。
SpringCloud配置中心 Config
Spring Cloud Config,通过服务端可以为多个客户端提供配置服务。Spring Cloud Config 可以将配置文件存储在本地,也可以将配置文件存储在远程 Git 仓库,创建 Config Server,通过它管理所有的配置文件。
- 本地配置中心
- 远程配置中心如GitHub
SpringCloud服务跟踪 Zipkin
Zipkin 是一个可以采集并且跟踪分布式系统中请求数据的组件,让开发者可以更加直观的监控到请求在各个微服务所耗费的时间等,Zipkin:Zipkin Server(采集微服务之间的追踪数据)、Zipkin Client。(完成数据展示)
负载平衡的意义什么?
在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算<br />资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源<br />的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通<br />常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。
什么是Nginx?主要功能?优点
Nginx ,是一个 Web 服务器和反向代理服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。
Nginx 的主要功能如下:
- 作为 http Server (代替 Apache ,对 PHP 需要 FastCGI 处理器支持)
- FastCGI:Nginx 本身不支持 PHP 等语言,但是它可以通过 FastCGI 来将请求扔给某些语言或框架处理。
- 反向代理服务器
- 实现负载均衡
- 虚拟主机
- 动静分离
Nginx优点:
- cgi web 服务器会根据请求的内容,然后会 fork 一个新进程来运行外部 c 程序(或 perl 脚本…), 这个进程会把处理完的数据返回给 web 服务器,最后 web 服务器把内容发送给用户,刚才 fork 的进程也随之退出。如果下次用户还请求改动态脚本,那么 web 服务器又再次 fork 一个新进程,周而复始的进行。
- fastcgi web 服务器收到一个请求时,他不会重新 fork 一个进程(因为这个进程在 web 服务器启动时就开启了,而且不会退出),web 服务器直接把内容传递给这个进程(进程间通信,但 fastcgi 使用了别的方式,tcp 方式通信),这个进程收到请求后进行处理,把结果返回给 web 服务器,最后自己接着等待下一个请求的到来,而不是退出。
? 综上,差别在于是否重复 fork 进程,处理请求。
Nginx常用命令与配置
启动 nginx
停止 nginx -s stop
或 nginx -s quit 。
重载配置 ./sbin/nginx -s reload(平滑重启) 或service nginx reload
。
重载指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf 。
查看 nginx 版本 nginx -v
。
检查配置文件是否正确 nginx -t
。
显示帮助信息 nginx -h
。
worker_processes 8; # 工作进程个数
worker_connections 65535; # 每个工作进程能并发处理(发起)的最大连接数(包含所有连接数)
error_log /data/logs/nginx/error.log; # 错误日志打印地址
access_log /data/logs/nginx/access.log; # 进入日志打印地址
log_format main '$remote_addr"$request" ''$status $upstream_addr "$request_time"'; # 进入日志格式
## 如果未使用 fastcgi 功能的,可以无视
fastcgi_connect_timeout=300; # 连接到后端 fastcgi 超时时间
fastcgi_send_timeout=300; # 向 fastcgi 请求超时时间(这个指定值已经完成两次握手后向fastcgi传送请求的超时时间)
fastcgi_rend_timeout=300; # 接收 fastcgi 应答超时时间,同理也是2次握手后
fastcgi_buffer_size=64k; # 读取 fastcgi 应答第一部分需要多大缓冲区,该值表示使用1个64kb的缓冲区读取应答第一部分(应答头),可以设置为fastcgi_buffers选项缓冲区大小
fastcgi_buffers 4 64k; # 指定本地需要多少和多大的缓冲区来缓冲fastcgi应答请求,假设一个php或java脚本所产生页面大小为256kb,那么会为其分配4个64kb的缓冲来缓存
fastcgi_cache TEST; # 开启fastcgi缓存并为其指定为TEST名称,降低cpu负载,防止502错误发生
listen 80; # 监听端口
server_name rrc.test.jiedaibao.com; # 允许域名
root /data/release/rrc/web; # 项目根目录
index index.php index.html index.htm; # 访问根文件
Nginx 有哪些负载均衡策略?
负载均衡,即是代理服务器将接收的请求均衡的分发到各服务器中。
Nginx 默认提供了 3 种负载均衡策略:
1、轮询(默认)round_robin每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2、IP 哈希 ip_hash每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 共享的问题。
当然,实际场景下,一般不考虑使用 ip_hash 解决 session 共享。
3、最少连接 least_conn下一个请求将被分派到活动连接数量最少的服务器
微服务中如何实现 session 共享 ?
在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。
RestTemplate 简介
RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求。
@RestController
@RequestMapping("/ribbon")
public class RibbonHandler {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/findAll")
public Collection<Student> findAll(){
return restTemplate.getForObject("http://provider/student/findAll",Collection.class);
}
}
应对微服务中的雪崩效应的三种常用手段
1、服务熔断
熔断机制是应对雪崩效应的⼀种微服务链路保护机制。当扇出链路的某个微服务不可⽤或者响应时间太⻓时,熔断该节点微服务的调⽤,进⾏服务的降级,快速返回错误的响应信息。当检测到该节点微服务调⽤响应正常后,恢复调⽤链路。
注意:
1)服务熔断重点在“断”,切断对下游服务的调⽤
2)服务熔断和服务降级往往是⼀起使⽤的,Hystrix就是这样。
2、服务降级
通俗讲就是整体资源不够⽤了,先将⼀些不是特别重要的服务停掉(调⽤我的时候,给你返回⼀个预留的值,也叫做兜底数据),待渡过难关⾼峰过去,再把那些服务打开。
服务降级⼀般是从整体考虑,就是当某个服务熔断之后,服务器将不再被调⽤,此刻客户端可以⾃⼰准备⼀个本地的fallback回调,返回⼀个缺省值,这样做,虽然服务⽔平下降,但好⽍可⽤,⽐直接挂掉要强。
3、服务限流
服务降级是当服务出问题或者影响到核⼼流程的性能时,暂时将服务屏蔽掉,待⾼峰或者问题解决后再打开;但是有些场景并不能⽤服务降级来解决,⽐如秒杀业务。
这样的核⼼功能,这个时候可以结合服务限流来限制这些场景的并发/请求量限流措施也很多,⽐如
限制总并发数(⽐如数据库连接池、线程池)
限制瞬时并发数(如nginx限制瞬时并发连接数)
限制时间窗⼝内的平均速率(如Guava的RateLimiter、nginx的limit_req模块,
限制每秒的平均速率)
限制远程接⼝调⽤速率、限制MQ的消费速率等