# 一、SpringCloud入门
## 1.微服务
微服务架构风格[[1\]](http://blog.cuicc.com/blog/2015/07/22/microservices/#fn1)是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。
## 2.SpringCloud
场景:快速(简化)构建分布式系统
协调任何事情:简化分布式系统
构建分布式系统不需要复杂和容易出错。SpringCloud为最常见的分布式系统模式提供了一个简单、可访问的编程模型,帮助开发人员构建弹性、可靠和协调的应用程序。SpringCloud构建在SpringBoot的基础上,使开发人员能够很容易地开始工作,并快速提高生产效率。
![](assets/springcloud.JPG)
SpringCloud并不是一门单纯的技术,而是整合了其他很多门技术
参考网站:
http://spring.io/projects/spring-cloud
https://springcloud.cc/
## 3.入门程序
课堂代码:https://github.com/ITFB/microservice
![](assets/project.png)
RestTemplate:
基于客户端的用于执行HTTP请求的简单的模板方法API
执行GET、POST请求
## 4.Eureka注册中心
云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
Eureka是一种基于REST(代表性状态传输)的服务,主要用于在AWS云中定位服务,以实现中间层服务器的负载平衡和故障转移。
基于C/S结构的
![](assets/eureka_architecture.png)
![](assets/eureka_simple.png)
角色:
注册中心:提供服务注册与发现功能(服务端)
生产者:向注册中心注册自身信息,用于消费者进行调用(客户端)
消费者:从注册中心注册表中获取生产者信息,并进行调用(客户端)
### 4.1 搭建Eureka Server
> 添加依赖
```xml
<!--添加eureka server依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
```
> 在主程序类上添加注解
```java
@EnableEurekaServer
```
> 配置文件
```pro
eureka:
client:
registerWithEureka: false #是否注册到EurekaServer中,因为本身就是EurekaServer 所以不需要注册
fetchRegistry: false # 是否从EurekaServer中获取信息,因为当前是单点Eureka 所以不需要
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 指定与Eureka Client交互的地址
```
总结:
基本springcloud中添加组件都是三步走:
1.添加依赖 2.添加注解 3.配置文件
### 4.2 搭建服务生产者(EurekaClient)
> 添加依赖
```xml
<!--添加Eureka Client依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
```
> 添加注解(新版本可以省略)
```java
//@EnableEurekaClient 该注解新版本可以省略
```
> 修改配置文件(将自身注册到Eureka Server中)
```pro
spring:
# 该配置很重要!重要!重要! 注册时的应用名称
application:
name: item-provider-8001
eureka:
client:
serviceUrl:
# 指定(Eureka Server)注册地址
defaultZone: http://localhost:6001/eureka/
```
## 5.Eureka集群
## 6.服务发现(了解)
## 7.Provider实现集群以及负载均衡
Ribbion 客户端负载均衡
提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用
## 1.Feign HTTP客户端工具
* Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
* 在Spring Cloud中,使用Feign非常简单——创建一个接口,并在**接口**上添加一些**注解**,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
* Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
* Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。
* Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。
* Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。
## 2. Hystrix断路器、熔断器
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC、HTTP) 。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。
如下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。
![](assets/2018051918293532.png)
Hystrix语义为“豪猪",具有自我保护的能力。Hystrix的出现即为解决雪崩效应。
### 2.1 Hystrix的设计原则是什么?
* 资源隔离(线程池隔离和信号量隔离)机制:限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其它服务调用。
* 限流机制:限流机制主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。
* 熔断机制:当失败率达到阀值自动触发降级(如因网络故障、超时造成的失败率真高),熔断器触发的快速失败会进行快速恢复。
* 降级机制:超时降级、资源不足时(线程或信号量)降级 、运行异常降级等,降级后可以配合降级接口返回托底数据。
* 缓存支持:提供了请求缓存、请求合并实现
* 通过近实时的统计/监控/报警功能,来提高故障发现的速度
* 通过近实时的属性和配置热修改功能,来提高故障处理和恢复的速度
### 2.2 Hystrix是如何实现它的目标的?
(1)通过HystrixCommand或者HystrixObservableCommand来封装对外部依赖的访问请求,这个访问请求一般会运行在独立的线程中,资源隔离
(2)对于超出我们设定阈值的服务调用,直接进行超时,不允许其耗费过长时间阻塞住。这个超时时间默认是99.5%的访问时间,但是一般我们可以自己设置一下
(3)为每一个依赖服务维护一个独立的线程池,或者是semaphore,当线程池已满时,直接拒绝对这个服务的调用
(4)对依赖服务的调用的成功次数,失败次数,拒绝次数,超时次数,进行统计
(5)如果对一个依赖服务的调用失败次数超过了一定的阈值,自动进行熔断,在一定时间内对该服务的调用直接降级,一段时间后再自动尝试恢复
(6)当一个服务调用出现失败,被拒绝,超时,短路等异常情况时,自动调用fallback降级机制
(7)对属性和配置的修改提供近实时的支持
## 3. Zuul路由、网关
Zuul能够实现路由以及过滤的功能
> 创建路由模块
> 添加依赖
* web启动器
* zuul依赖
* eureka client依赖?路由要起作用,必须注册到eureka server中
> 创建主程序类,添加 @EnableZuulProxy 注解 开启网关服务
不用路由:
http://localhost:8001/item/list
路由:
http://www.zuul5001.com:5001/microservice-item-provider/item/list