SpringCloud的五个组件
1.注册中心 Eureka
2.负载均衡 Ribbon
3.断路器 Hystrix
4.网关 Zuul
5.分布式配置 Config
版本冲突
查看当前springcloud版本: http://projects.spring.io/spring-cloud/
版本依赖,spring官网可以看 https://docs.spring.io/spring-cloud/docs
1.服务者:pring-cloud-starter-netflix-eureka-client
2.Eureka:spring-cloud-starter-netflix-eureka-server
3.消费者+Ribbon:spring-cloud-starter-netflix-eureka-client ||| spring-cloud-starter-netflix-ribbon
4.Feign: spring-cloud-starter-openfeign
5.Hystrix:spring-cloud-starter-netflix-hystrix ||| spring-cloud-starter-netflix-hystrix-dashboard
6.zuul:spring-cloud-starter-netflix-zuul
Eureka
Eureka 包含两个组件:Eureka Server 和 Eureka Client.
Eureka的两个功能:服务注册和发现
eureka server的构建:
1.导入依赖
2.编写配置文件
3.在启动类上添加注解 @EnableEurekaServer
# Eureka配置
eureka:
instance:
# Eureka服务端的实例名字
hostname: 127.0.0.1
client:
# 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
register-with-eureka: false #默认为true
# fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
fetch-registry: false #默认为true
# Eureka监控页面~
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
eureka client的构建:
1.导入依赖
2.编写配置文件
3.在启动类上添加注解 @EnableEurekaClient
# Eureka配置:配置服务注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
instance-id: springcloud-provider-dept-8001 #修改Eureka上的默认描述信息
prefer-ip-address: true #为true,则在eureka中主机名用ip表示
注:1.配置文件eureka下有instance实例,代表的是eureka的服务端,hostname:指的是eureka服务端的主机ip地址。
2.生产者要在eureka中注册,消费者不用注册,但是要开启@EnableEurekaClient,即在消费者微服务的配置中,register-with-register要设置为false
Eureka的发现功能
在controller类中注入DiscoveryClient实例,就可以获取eureka中注册的服务的信息
Eureka的集群
辅助eureka微服务多份,在配置文件中设置好地址,相互注册
负载均衡
1.Ribbon(基于客户端) Ribbon + RestTemplate
在 服务消费者(客户端) 这边写一个配置类(@Configuration),配置类中写一个方法(@Bean),返回RestTemplate,注入到spring容器中。在这个方法上添加注解 @LoadBalanced ,即可实现负载均衡。这种类型的负载均衡是基于客户端的。RestTemplate类中有方法getForObject(url, .class),可以实现远程调用接口。eureka-client中集成了ribbon
2.Feign(基于服务端) @FeignClient @EnableFeignClients
0.要在api的module和消费者module中添加feign的依赖
1.在api的module中的service层中写一个接口,接口方法是对应的服务提供者中service层的方法,接口上添加注解@FeignClient,注解中有value,是对应的服务提供者的服务名(spring.application.name)。
2.在消费者服务的启动类上添加注解@EnableFeignClients(basePackage=“…”),basePackage用来扫描api的moudule中的@FeignClient,从而把接口注入到容器中,然后在controller类中调用它。
3.Feign集成了ribbon,可以替换掉RestTemplate,是负载均衡的另外一种实现。
断路器
服务雪崩:某个微服务的调用响应时间过长,或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。
处理方法:需要对故障和延迟进行隔离和管理,以达到单个依赖关系的失败而不影响整个应用程序或系统运行。
Hystrix 能够保证在一个依赖出问题的情况下,不会导致整个体系服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控 (类似熔断保险丝) ,向调用方返回一个服务预期的,可处理的备选响应 (FallBack) ,而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证了服务调用方的线程不会被长时间,不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
1.服务熔断 (在服务提供者这边配置)
在服务提供者微服务中:
1.添加依赖
2.在controller类中,写一个备选方法,然后在主选方法上添加注解@HystrixCommand(fallbackMethod = “…”),fallbackMethod 中填的是备选方法的名字。主选方法其实就是正常url访问的方法,当主选方法中响应时间过长或者出现异常的时候就会去调用备选方法,备选方法其实就是一种紧急响应,熔断有问题的微服务方法调用,避免无效占用资源,避免资源耗尽。
3.在启动类上添加注解:@EnableHystrix 开启熔断机制
2.服务降级 (在服务的消费者这边配置)
在高并发的情况下,停掉不必要的服务,尽可能的把系统资源让给优先级高的服务,称之为服务降级。
我们希望被关掉的服务不被访问,希望某些服务被关掉之后,客户来访问时会被告知不可访问。
1.在api的module中,写一个服务降级的配置类,类上添加注解@Component。该类实现了FallBackFactory.
然后要重写create方法,在该方法中返回的是之前添加了@FeignClient注解的接口的匿名内部类,在该匿名内部类中要重写该接口的方法,可以在这些方法中设置服务降级的信息。
2.在添加了@FeignClient注解的接口上,注解@FeignClient中设置属性fallbackFactory,指向刚刚配置的服务降级配置类
3.在消费者服务的配置类中开启服务降级的配置
#开启降级feign.hystrix
feign:
circuitbreaker:
enabled: true
3.Dashboard 流监控
新增一个监控微服务:
1.添加依赖
<!--dashboard依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
2.配置文件
server:
port: 9001
hystrix:
dashboard:
proxy-stream-allow-list: "localhost"
3.在消费者启动类上添加注解 @EnableHystrixDashboard ,开启Dashboard
在服务的生产者这边:
1.添加依赖
<!--actuator完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.在生产者启动类中,写一个servlet
//增加一个 Servlet
@Bean
public ServletRegistrationBean hystrixMetricsStreamServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
//访问该页面就是监控页面
registrationBean.addUrlMappings("/actuator/hystrix.stream");
return registrationBean;
}
访问监控页面
访问:http://localhost:9001/hystrix
输入生产者的地址+“/actuator/hystrix.stream” 即可访问监控页面
zuul路由网关
1.添加依赖
<!--导入zuul依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
2.配置文件,配置路由
zuul:
routes:
#第一种配置
sale:
path: /sale/**
serviceId: spring-zuul-sale
#第二种配置
spring-zuul-sale:
path: /sale/**
#第三种配置
abc:
path: /sale/**
url: spring-zuul-sale
配置说明
第一种配置:标准配置,path是路径,serviceId是微服务名称。
第二种配置:第一种配置的简写,spring-zuul-sale充当微服务的名称。
第三种配置:如果url既不是简单路由也不是跳转路由,那么这里的url就充当serviceId的作用,和第一种效果一样。
3.在网关微服务的启动类上添加注解@EnableZuulProxy
4.访问地址 路由微服务地址+“/sale/…”