**spring cloud相关组件:**
注册中心:eureka
版本选择:
创建springboot项目依照自己的cloud版本来选择boot的版本,cloudF以上的版本是用springboot2.x(以下是它支持的一些版本)![](https://img-blog.csdnimg.cn/20190424144704923.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg2NzkzMw==,size_16,color_FFFFFF,t_70)
**springcloud和springboot对照的版本要求**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190424145010688.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg2NzkzMw==,size_16,color_FFFFFF,t_70)
本次使用的是springboot 1.5.9 cloud使用的是D 版本
创建项目后导入springcloud和Erueka依赖
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR4
pom
import
****Erueka:****
org.springframework.cloud
spring-cloud-netflix-eureka-server
1.3.5.RELEASE
配置文件使用的是yml的格式,加入如下配置(注意缩进):
eureka:
client:
service-url:
#设置交互的地址
defaultZone: http://localhost:7776/eureka
#是否从Eureka获取注册信息,当前是单点,不需要同步其他所以设置为false
fetch-registry: false
#是否向注册中心注册自己
register-with-eureka: false
启动类加入注解
@EnableEurekaServe
服务端启动后再来创建一个客户端
1.导入依懒
首先引入cloud依赖(和服务端相同),再引入客户端的依赖
org.springframework.cloud
spring-cloud-starter-eureka
1.3.5.RELEASE
注意:和服务端的依懒是不一样
配置文件使用的是yml的格式,加入如下配置(注意缩进):
eureka:
client:
service-url:
#设置交互的地址
defaultZone: http://localhost:7776/eureka
spring:
application:
name: 服务名字
启动类加入注解
@EnableDiscoveryClient或者@EnableEurekaClient
使用@EnableEurekaClient的情景,就是在服务采用eureka作为注册中心的时候,使用场景较为单一
关闭 eureka的自我保护机制
自我保护机制介绍
默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。
但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其
实是健康的,此时本不应该注销这个微服务。
Eureka通过“自我保护模式”来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),
那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的
数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务
(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,
可以让Eureka集群更加的健壮、稳定。
在Eureka服务的yml添加如下配置(和client为同一级)
server:
#禁用自我保护模式
enable-self-preservation: false
# 续期时间,即扫描失效服务的间隔时间
eviction-interval-timer-in-ms: 2000
在客户端yml加入如下配置(和client为同一级)
instance:
#表示eureka client发送心跳给server端的频率。如果在leaseExpirationDurationInSeconds后,server端没有收到client的心跳,则将摘除instance除此之外,如果该instance实现了HealthCheckCallback,并决定让自己unavailable的话,则该instance也不会接收到流量。默认30秒
lease-renewal-interval-in-seconds: 2
#表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance。默认为90秒
lease-expiration-duration-in-seconds: 2
#配置以ip地址注册到注册中心
instance-id: ${spring.cloud.client.ipAddress}:${server.port}
eureka加入用户验证
服务端加入如下包:
org.springframework.boot
spring-boot-starter-security
服务端加入以下配置(yml)
security:
basic:
enabled: true
user:
name: root
password: root
客户端再url加入 defaultZone: http://root:root@localhost:7776/eureka
feign组件
Feign:客户端互相调用
在消费者导入pom
org.springframework.cloud
spring-cloud-starter-feign
1.3.5.RELEASE
在client包得类加入:@FeignClient(name = "kgc-user-provider") kgc-user-provider(提供者服务名)
消费者启动类加入@EnableFeignClients
容错介绍:
在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式相互依赖。但由于每个单元都在不同的进程中运行,一来通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最后就会因等待出现故障的依赖方响应形成任务积压,最终导致自身服务的瘫痪。
如何容错:
1.超时重试
2.熔断器
3.限流
代码实现
创建一个实现类去实现消费者得接口:在实现得对应方法中放入容错得信息,并把这个类注入到spring中
在接口信息中得@FeignClient注解中加入 fallback="上一步实现类.class"
在application. yml中添加配置开启容错
feign:
hystrix:
enabled: true
容错可视化
消费者导入相应pom文件
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-hystrix
1.3.5.RELEASE
在启动类添加注解:@EnableCircuitBreaker
访问/hystrix.stream端点
使用Hystrix Dashboard实现可视化监控
1.创建springcloud项目
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-hystrix
1.3.5.RELEASE
org.springframework.cloud
spring-cloud-starter-hystrix-dashboard
1.3.5.RELEASE
启动类添加注解:@EnableHystrixDashboard
访问 ip+服务端口+hystrix
聚合监控 turbine
创建springcloud项目启动类添加注解
@EnableTurbine
配置文件加入以下内容(此次使用的内容格式是yml)
eureka:
client:
service-url:
defaultZone: http://root:root@localhost:7777/eureka
instance:
lease-renewal-interval-in-seconds: 2
lease-expiration-duration-in-seconds: 2
instance-id: ${spring.cloud.client.ipAddress}:${server.port}
spring:
application:
name: dm-turbine-servier
server:
port: 8090
turbine:
# 指定聚合哪些集群
cluster-name-expression: " 'default' "
# 此配置默认为false,则服务是以host进行区分,若设置为true则以host+port进行区分
combine-host-port: true
### 配置Eureka中的serviceId列表,表明监控哪些服务
app-config: kgc-user-consumer,kgc-order-consumer
导入的pom如下
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-turbine
1.3.5.RELEASE
org.springframework.cloud
spring-cloud-starter-eureka
1.3.5.RELEASE
查看监控
1.启动项目turbine,dashboard
2.访问接口产生数据
3.访问dashboard主页
4.url:ip+端口+turbine.stream
Ribbon
1.因为上面的练习项目中已经添加“spring-cloud-starter-eureka”依赖,在这里已经包含了Ribbon,所以不用再单独引入pom文件
2.在consumer中添加配置
#提供者服务名
dm-user-provider:
ribbon:
#负载均衡的策略
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
其他负载均衡策略均定义在com.netflix.loadbalancer包中,可以根据需要选择合适的策略
类型 | 说明 |
---|---|
WeightedResponseTimeRule | 根据响应时间分配一个weight(权重),响应时间越长,weight越小,被选中的可能性越低 |
– | – |
RoundRobinRule | 轮询选择server(此为默认的负载均衡策略) |
– | – |
RandomRule | 随机选择一个server |
– | – |
ZoneAvoidanceRule | 复合判断server所在区域的性能和server的可用性选择server |
– | – |
RetryRule | 在一个配置时间段内,当选择server不成功时一直尝试重新选择 |
– | – |
BestAvailableRule | 选择一个并发请求最小的server |
– | – |
AvailabilityFilteringRule | 过滤掉那些因为一直连接失败而被标记为circuit tripped的server,并过滤掉那些高并发的server(active connections 超过配置的阈值) |
网关zuul组件
1.创建一个springcloud项目
2.导入依懒
org.springframework.cloud
spring-cloud-starter-eureka
1.3.5.RELEASE
org.springframework.cloud
spring-cloud-starter-zuul
1.3.5.RELEASE
3编写配置文件
spring:
application:
name: dm-gateway-zuul
server:
port: 8012
eureka:
client:
service-url:
defaultZone: http://root:root@localhost:8085/eureka/
zuul:
routes:
lm-user-consumer: /user/**
4.添加注解
@EnableZuulProxy
网关过滤器