1、特点
· 每个微服务按照业务来划分,业务单一,易于维护
· 每个微服务都有自己独立基础组件(例如 数据库、缓存等)且运行在独立
· 微服务之间是通过HTTP协议或者消息组件进行通信的,且具有容错能力(熔断、降级等)
· 微服务能集群化部署,并且有负载均衡的能力(ribbon、Feign)
· 整个微服务有一个完整的安全机制( Zuul )
···
2、服务的注册与发现
3、负载均衡
因为在SpringCloud中,微服务与微服务之间的通行是依靠HTTP来实现的。网络往往具有不可靠性。所以在为了保证高可用性的情况下,一般服务单元会集群化部署。
所有的服务提供者都向服务中心注册,服务中心持有每个服务的应用名和IP地址等信息,同时每个服务也会获取到所有的服务注册列表信息。服务消费者只需集成负载均衡组件,该组件会向服务消费者获取服务注册列表信息( 每隔一段时间都会重新获取列表 ),当进行消费时(调取其他的微服务),通过组件的负载均衡策略( 可以进行自定义的负载均衡策略开发 ),从而实现了负载均衡。
4、服务的容错
前面实际上就介绍了微服务的高可用性。在分布式系统中,一般都有CAP理论,且不可三者同时满足。只能满足其二。一般在我们当前公司所用的就是选择了 AP(高可用性、分区容错性)
雪崩效应: 通俗的说就是在众多个微服务中,假设有某一个服务因为某个原因,不能正常的运行。而在高并发的情况下,面对众多的请求过来时很快会将线程资源消耗完,造成后面的请求组处于阻塞状态,而依赖于此服务的其他微服务也会因该服务的阻塞,也会处于组散热状态,进而导致都不可用。最后导致整个系统的瘫痪。
熔断器:当一个服务在处理用户请求失败次数在一定时间内小于阀值时,说明还服务正常,熔断器处于关闭状态;相反,说明服务出现了故障,此时会打开熔断器,此时会执行快速失败,不会执行业务逻辑,从而不会造成线程的阻塞,资源的耗尽等事故。(当处于打开的熔断器时,一段时间后会处于半打开的状态,并会执行一定量的请求,而所剩余的请求会执行快速失败。若请求执行成功了,则关闭熔断器,反之,继续保持)
服务降级:当整个微服务架构整体的负载超出了预设的上限阈值或即将到来的流量预计将会超过预设的阈值时,为了保证重要或基本的服务能正常运行,我们可以将一些 不重要 或 不紧急 的服务或任务进行服务的 延迟使用 或 暂停使用。(超时降级、失败次数降级、故障降级、限流降级 )处理策略一般有:页面降级 (可视化界面禁用点击按钮、调整静态页面)、延迟服务(如定时任务延迟处理、消息入MQ后延迟处理)、写降级 (直接禁止相关写操作的服务请求)、读降级 、缓存降级(使用缓存方式来降级部分读频繁的服务接口)、抛异常、返回NULL、调用Mock数据 等等。
5、服务的网关
作用:
将所有服务的API接口资源统一聚合,对外统一暴露,外界调用的API接口都是网关对外暴露的接口,从而前段不需要知道各个微服务之间调用的复杂性。( 配置在路由中的规则也就是暴露的接口 )
可以做用户身份、权限认证。例如我们目前使用URL中的pv、pb、az、pt来对接口进行保护。
可以做流量监控
请求监控,实时打印请求日志
6、服务的链路追踪
介绍:微服务系统是一个分布式架构的系统,微服务于按照业务划分服务单元,一个微服务系统有很多个服务单元。由于单元数量多,且业务复杂,所以服务于服务之间的调用可能会很复杂,一单出现了异常情况就很难去定位,所以一般在微服务中,都会去实现分布式的链路追踪,去跟进一个请求到底有哪些服务参与,以及调用的顺序。
常见的组件有 Dapper、Zipkin 、Eagleeye ( 阿里 )
1、介绍
用于服务注册和发现的组件(类似于该组件的有 Consul、Zookeeper)。是Netfix公司的开源产品,经历了该公司的生产环境的考验以及多年时间的不断更新迭代,非常的稳定,也是SpringCloud官网首选推荐的服务于注册发现组件,但是逐渐闭源。分为Eureka Server 与 Eureak Client。并且Eureka可以和其他组件配合( 比如负载均衡组件Ribbon 、熔断器组件Hystrix、Zuul等)从而很容易的实现服务注册、负载均衡、熔断和只能路由等功能。
2、基本架构
Register Service:服务注册中心 ( 是一个Eureka Server ,提供服务注册和发现功能)
Provider Service:服务提供者( 是一个Eureka Client ,提供服务)
Consumer Service:服务消费者(是一个Eureka Client,消费服务)
3、代码Demo示例
A、Eureka Server yaml相关配置 :
server :
port : 8761
eureka :
instance :
hostname : localhost
client :
registerWithEureka: false
fetchRegistry: false ## 防止自己注册自己
serviceUrl:
defaultZone :
http://${eureka.instance.hostname}:${server.port}/eureka
在工程启动类中加上 @EnableEurekaServer 注解即可
B、Eureka Client yaml配置
eureka:
client :
serviceUrl:
defaultZone : http://localhost:8761/eureka/
server:
port : 8762
spring :
application :
name : eureka-client # 可以随便命名
在工程启动类上加上 @EnableEurakaClient
此时打开EurekaServer即可看到该客户端已注册上去
4、Euraka的相关概念
(1)Register — 服务注册
当Eureka Client向Server注册时,Client提供自身的元数据,比如IP地址、端口、运行状况指标的URL等信息。
(2)Renew — 服务续约
Eureka Client在默认的情况下回每隔30s 发送一次心跳来进行续约,通过服务续约来告知Eureka Server 该Client任然可以继续使用。如果在90s没有收到Client的心跳,Eureka Server会将Clinet实例从注册列表中删除。
(3)Fetch Registries — 获取服务注册列表信息
Eureka Client 从 Eureka Server 获取服务注册表信息,并将其缓存在本地。该信息列表会定时的更新( 30s/次 ) .
(4)Cancel — 服务下线
Eureka Client 在程序关闭时可以向Eureka Server发送线下请求。发送请求后,该客户端的实例信息将从Eureka Server的服务注册列表中删除。
5、Eureka Server 的集群构建
eureka-server的配置文件 ( 多profile格式 )
---
spring :
profiles : peerl
server :
port: 8761
eureka :
instance :
hostname: 192.168.0.18011
client:
serviceUrl :
defaultZone : http://192.168.0.18010:8762/eureka/
---
spring :
profiles : peer2
server :
port : 8762
eureka :
instance
hostname: 192.168.0.18010
client :
serviceUrl:
defaultZone: http://192.168.0.18011:8761/eureka/
eureka-client 的配置文件
server :
port : 8763
spring :
application :
name : eurka-clinet # 随便命名
eureka :
client :
serviceUrl :
defaultZone : http://192.168.0.18011:8761/eureka/
1、介绍
Nacos也是注册中心,致力于帮助您发现、配置和管理服务。和Eureka 、Consul类似,同时还提供了分布式的配置中心。该功能和 Consul 中的config 类似 .
consul 了解地址 : https://blog.csdn.net/liuzhuchen/article/details/81913562
另外,Nacos有两种消费方式,一种是RestTemplate,一种是Feign .使用Restemplate方式进行消费就可以引入ribbon的依赖,在Nacos的消费者的启动文件中加上如下代码即可实现负载均衡。也是我们公司目前使用的方式。具体代码略…
使用RestTemplate 消费服务
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
并且,restTemplate高度丑相,封装了很多的方法,符合restful风格.
1、介绍
Feign 是一个声明式的API接口风格,将Java HTTP 客户端绑定到他的内部。Feign 的首要目标是江Java HTTP客户端的调用变得简单。Feign也是有负载均衡的能力,但是
2、Demo
spring :
application :
name : eureka-feign-client
server:
port : 8765
eureka :
client :
serviceUrl:
defaultZone: http://localhost:8761/eureka/
在启动类中加上注解@EnableEurekaClient 与 @EnableFeignClient开启Feign Client功能
在此工程种新建一个接口
@FeignClient(value = "eureka-feign-client" ,configuration = "FeignConfig.class")
public inteerface EurekaClientFeign{
// 此处调用远程 eureka-feign-client 或者 其他工程的远程接口
@GetMapping(value ="/hi")
String testMethod(@RequestParam(value="name") String name);
}
另外,还可以初始化一个Retryer实例,配置远程调用失败后的重试策略。
@Service
public class HiService {
@Autowired
EurekaClientFeign eurekaClientFeign ;
public String test(String name ) {
return eurekaClientFeign.sayHiFromClientEureka (name);
}