一、服务注册中心
常用服务注册中心
(1)Eureka(来源于Netflix,停止更新,但有仍有少量使用)
Eureka包含两个组件:Eureka Server和Eureka Client。
<!--引入 eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
官方停止更新说明
- https://github.com/Netflix/eureka/wiki
- 在1.x版本项目还是活跃的,但是在2.x版本中停止维护
(2)Consul(来源于Google,Go语言开发,是以软件的形式存在,独立于我们的Java程序外)
Linux、Windows和Mac OS X多平台支持。
下载地址:https://www.consul.io/downloads
(3)nacos(来源于阿里巴巴)
Nacos是微服务架构中服务注册中心统一配置中心,用来替换eureka,consul以及config组件。
# 0.准备环境
- 1.64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。必须满足
- 2.64 bit JDK 1.8+;必须满足
- 3.Maven 3.2.x+;
# 1.下载nacos
- https://github.com/alibaba/nacos/releases
(4)Zookeeper(并非SpringCloud的服务注册中心)
主要使用是dubbo + zookeeper
二、服务间通信方式
1.服务间的负载均衡
(1)Ribbon(来源Netflix)
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
- 说明:
1.如果使用的是eureka client 和 consul client,无须引入依赖,因为在eureka,consul中默认集成了ribbon组件
2.如果使用的client中没有ribbon依赖需要显式引入如下依赖:
<!--引入ribbon依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
负载均衡的方式:
RoundRobinRule 轮训策略 按顺序循环选择 Server
RandomRule 随机策略 随机选择 Server
AvailabilityFilteringRule 可用过滤策略
WeightedResponseTimeRule 响应时间加权策略
RetryRule 重试策略
BestAviableRule 最低并发策略
2.服务间通信
(1)RestTemplate(用的少,了解即可,使用Restful风格)
使用Restful风格,简单理解即Get / Post / Put / Delete请求方式要严格声明,和URL中可以携带参数,如 @GetMapping("/user/{id}") 。
(2)OpenFeign(常用,内部集成Ribbon,使用Restful风格)
<!--Open Feign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
我们使用OpenFeign,需要创建一个客户端调用接口,即我们要在本服务封装一个接口与调用服务API对应。
然后,我们就可以使用feignClient客户端对象调用服务,就是将我们刚刚封装的接口注入到我们的本服务的Controller中进行使用。
三、服务监视,实现服务降级、服务熔断
1.服务雪崩、服务降级、服务熔断概念
(1)服务雪崩:
微服务之间往往存在层层调用,一旦其中某一层出现问题或故障,就会导致我们整个项目出现级联服务故障,该现象就叫做服务雪崩。
(2)服务熔断:
本身是一种开关装置,当某个服务单元发生故障之后,我们的服务断路器监控到了该服务单元的异常,经判断后会将故障服务与调用该故障服务的其他服务断开连接,如果其他服务在调用时,断路器就会直接返回一个结果,供其他服务正常执行,而不发生阻塞。每过规定时间后,短路器会允许一个服务再次访问故障服务,如果可以正常访问就让断路器失效,如果仍然有故障,就会继续保持断路。
(3)服务降级:
服务压力剧增的时候根据当前的业务情况及流量对一些服务和页面有策略的降级,以此缓解服务器的压力,以保证核心任务的进行。同时保证部分甚至大部分任务客户能得到正确的响应。也就是当前的请求处理不了了或者出错了,给一个默认的返回。
2.断路器
(1)Hystrix(来源Netflix,服务熔断、服务降级的实现方法之一,目前停止更新)
<!--引入hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
服务熔断:
断路器打开关闭的条件:
- 1、 当满足一定的阀值的时候(默认10秒内超过20个请求次数)
- 2、 当失败率达到一定的时候(默认10秒内超过50%的请求失败)
- 3、 到达以上阀值,断路器将会开启
- 4、 当开启的时候,所有请求都不会进行转发
- 5、 一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。重复4和5。
服务降级:
服务降级: 站在系统整体负荷角度 实现: 关闭系统中某些边缘服务 保证系统核心服务运行
Emps 核心服务 Depts 边缘服务
开启openfeign支持服务降级:feign.hystrix.enabled=true(springboot配置文件中配置)
(2)Sentinel(来源阿里巴巴,流量卫兵,用来替换hystrix)
用来在微服务系统中保护微服务对的作用 如何 服务雪崩 服务熔断 服务降级。
四、网关
1.服务网关(路由转发 + 过滤器)
网关统一服务入口,可方便实现对平台众多服务接口进行管控,对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或者计费等等。
2.网关组件
(1)zuul 1.x 、2.x (来源netflix ,1.x仍在更新,但2.x已经停止更新)
zul是从设备和网站到Netflix流媒体应用程序后端的所有请求的前门。作为一个边缘服务应用程序,zul被构建为支持动态路由、监视、弹性和安全性。
目前zuul组件已经从1.0更新到2.0,但是作为springcloud官方不再推荐使用zuul2.0,但是依然支持zuul2.
(2)gateway
-基于springboot2.x 和 spring webFlux 和 Reactor 构建 响应式异步非阻塞IO模型
注意此处的网络应用的不是springMVC而是spring webFlux,两者是冲突的,所以当我们使用Gateway网关时,不能导入springMVC依赖,也即 spring-boot-starter-web 不能使用。
<!--引入gateway网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- 动态路由、请求过滤
Gateway实现网关的负载均衡,即程序外,有浏览器一类访问程序内时的负载均衡可以由Gateway来实现,他的负载均衡也需要服务注册中心的支持。