Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
Eureka基本规则
· 服务启动时会生成服务的基本信息对象InstanceInfo,然后在启动时会register到服务治理中心。
· 注册完成后会从服务治理中心拉取所有的服务信息,缓存在本地。
· 之后服务会被30s(可配置)发送一个心跳信息,续约服务。
· 如果服务治理中心在90s内没有收到一个服务的续约,就会认为服务已经挂了,会把服务注册信息删掉。
· 服务停止前,服务会主动发送一个停止请求,服务治理中心会删除这个服务的信息。
· 如果Eureka Server收到的心跳包不足正常值的85%(可配置)就会进入自我保护模式,在这种模式下,Eureka Server不会删除任何服务信息。
配置
1. Eureka Server
(1) 利用spring脚手架
![v2-ba0cf88f2cea726501c8101af6628ec1_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=5381ccbe-222f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-ba0cf88f2cea726501c8101af6628ec1_b.png)
创建eureka,选择Spring Cloud Discovery中的Eureka Server
(2) 编写配置文件:application.yml
![v2-0fa2a2e56c2cbfe62a7d9f4b6bd1520d_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=5381ccbe-222f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-0fa2a2e56c2cbfe62a7d9f4b6bd1520d_b.jpg)
(3) 启动类添加 @EnableEurekaServer
2. Eureka Client
(1) 利用spring脚手架
![v2-ba0cf88f2cea726501c8101af6628ec1_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=5381ccbe-222f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-ba0cf88f2cea726501c8101af6628ec1_b.png)
创建eureka,选择Spring Cloud Discovery中的Eureka Discovery Client
(2) 编写配置文件:application.yml
![v2-ae47bf5917807b1f07c69c30f84477ad_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=5381ccbe-222f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-ae47bf5917807b1f07c69c30f84477ad_b.jpg)
(3) 启动类添加 @EnableDiscoveryClient
Feign的目标
feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。
使用
l 注册两个微服务:Provider和Consumer
l 实现Consumer对Provider的接口调用
Provider创建服务方法
在provider 中添加UserService类,提供login()方法
Consumer进行调用准备
在consumer中添加Feign依赖
在consumer中创建针对UserServic的调用接口
为接口添加@FeignClient注解并指定name属性值(被调用服务在Eureka Server的名称)
l 在consumer中通过接口调用provider的login()方法
l 在consumer的启动类添加@EnableFeignClients注解
Hystrix的设计原则
l 防止任何单独的依赖耗尽资源(线程)过载立即切断并快速失败,防止排队
l 尽可能提供回退以保护用户免受故障
l 使用隔离技术(例如隔板,泳道和断路器模式)来限制任何一个依赖的影响
l 通过近实时的指标,监控和告警,确保故障被及时发现
l 通过动态修改配置属性,确保故障及时恢复
l 防止整个依赖客户端执行失败,而不仅仅是网络通信
![v2-bff709cc402c8b5864a5a1694da93502_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=5381ccbe-222f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-bff709cc402c8b5864a5a1694da93502_b.jpg)
使用
l 为Provider中的接口创建容错处理类
n 实现Provider接口(在feign接口基础上进行实现类的编写)
l 为Consumer中的调用接口指定容错处理类
n 通过@FeignClient注解的fallback属性
![v2-15e0c605be78b5cd393b02cce82eba30_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=5381ccbe-222f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-15e0c605be78b5cd393b02cce82eba30_b.png)
l 在Consumer中添加配置开启容错
n feign.hystrix.enabled=true
![v2-47a8eb57ee6c51735ac007a69be8f5f8_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=5381ccbe-222f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-47a8eb57ee6c51735ac007a69be8f5f8_b.png)
Ribbon是什么?
Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中Load Balancer后面的所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。
使用
l 如果项目中已经添加“spring-cloud-starter-eureka-server”依赖,则已经包含了Ribbon,所以不用再单独引入。
l 否则添加以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
l 确保多个相同服务的名称相同,ribbon会自动生效(默认为轮询策略),如:
![v2-2cf36f4f351eece4f62020769ff08ee2_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=5381ccbe-222f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-2cf36f4f351eece4f62020769ff08ee2_b.jpg)
负载均衡常用策略
如果默认轮询不足以满足需求则参考以下策略
![v2-2bd56b4811d94827e65bd140f5b5fd03_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=5381ccbe-222f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-2bd56b4811d94827e65bd140f5b5fd03_b.jpg)
策略设置:
![v2-c56bff9870c70f65649ba6b3b757baa3_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=5381ccbe-222f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-c56bff9870c70f65649ba6b3b757baa3_b.png)
其他负载均衡策略均定义在com.netflix.loadbalancer包中,可以根据需要选择合适的策略
什么是Zuul
Zuul是Spring Cloud全家桶中的微服务API网关。
所有从设备或网站来的请求都会经过Zuul到达后端的Netflix应用程序。作为一个边界性质的应用程序,Zuul提供了动态路由、监控、弹性负载和安全功能。Zuul底层利用各种filter实现如下功能:
l 认证和安全 识别每个需要认证的资源,拒绝不符合要求的请求。
l 性能监测 在服务边界追踪并统计数据,提供精确的生产视图。
l 动态路由 根据需要将请求动态路由到后端集群。
l 压力测试 逐渐增加对集群的流量以了解其性能。
l 负载卸载 预先为每种类型的请求分配容量,当请求超过容量时自动丢弃。
l 静态资源处理 直接在边界返回某些响应。
使用
l 创建项目
l 添加Zuul依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
l 修改配置application.yml指定服务端口、Eureka Server地址等信息
spring:
application:
name: dm-gateway-zuul
server:
port: 7600
eureka:
client:
service-url:
defaultZone: http://root:123456@localhost:7776/eureka/
l 启动类添加注解
@EnableZuulProxy
l 配置路由
微服务名: 映射路径
zuul:
routes:
dm-user-consumer: /user/**
dm-item-consumer: /item/**
dm-order-consumer: /order/**
dm-base-consumer: /base/**
dm-pay-consumer: /pay/**
dm-scheduler-consumer: /scheduler/**
dm-file-consumer: /file/**
dm-item-search: /search/**
strip-prefix: false
l 测试
通过浏览器(或postman等)访问网关:如localhost:7600/user/login
���-