一.Hystrix(续)
1.Ribbon整合Hystrix
(1)在Ribbon的工程中,添加Hystrix的依赖
<!-- hystrix 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)在启动类上添加注解
@EnableHystrix
(3)在使用RestTemplate的地方,通过注解实现资源隔离
//使用注解,隔离其他服务的调用资源,被该注解标记的方法会被Hystrix提供的线程调用(线程池隔离)
//fallbackMethod就是指定降级方法,当资源不足或者服务报错时,会走降级方法
//熔断器默认已经开启
@HystrixCommand(fallbackMethod = "myFallBack")
@RequestMapping("/queryName")
public String getNameById(Integer sid){
......
}
/**
* 降级方法
* @param sid
* @return
*/
public String myFallBack(Integer sid){
return "服务异常,降级方法调用!!!";
}
2.Feign整合Hystrix
(1)直接通过配置yml文件,开启Hystrix
#开启Feign的断路器功能
feign:
hystrix:
enabled: true
注意:Feign中已经整合了Hystrix,所以不需要添加任何依赖,Feign中的Hystrix功能默认关闭
(2)配置Feign接口,编写降级实现类
@FeignClient(value = "MIRCO-TEACHER", fallback = ITeacherFeign.TeacherFeign.class)
public interface ITeacherFeign {
@RequestMapping("/tea/queryTeaName")
String queryTeaName(@RequestParam("tid") Integer tid);
/**
* Feign接口的实现类
*/
@Component
public static class TeacherFeign implements ITeacherFeign{
//就是对应的降级方法
@Override
public String queryTeaName(Integer tid) {
return "教师服务调用异常,服务进行降级!!!";
}
}
}
3.Hystrix的常用配置-yml文件
#配置Hystrix的常用属性
hystrix:
command:
default:
execution:
isolation:
#资源隔离的策略,线程池隔离(默认)、信号量隔离(SEMAPHORE)
strategy: THREAD
#hystrix超时时间,默认1秒
thread:
timeoutInMilliseconds: 500
timeout:
#是否开启Hystrix的超时时间, 默认为true,如果设置为false,
#意为不超时,但是Feign的超时仍然起作用
enabled: true
#熔断器的相关配置,默认打开熔断器
circuitBreaker:
enabled: true
#单位时间内,失败的次数,如果达到这个阈值,那么熔断器就会打开,默认20次
requestVolumeThreshold: 5
#多久之后,熔断器进入半开状态,默认5S
sleepWindowInMilliseconds: 5000
注意:实际开发过程中,调用超时,需要结合Feign的超时和Hystrix的超时,哪个超时设置的小,哪个就起作用,默认都是1S。
4.Hystrix的仪表盘(图形化界面监控)
(1)简介
Hystrix提供了一个组件,可以监控Hystrix的微服务,来动态掌握各个微服务之间的请求调用情况。
(2)配置Hystrix的仪表盘
1)单独创建一个SPringBoot项目,作为仪表盘工程
2)该工程添加依赖仪表盘工程
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
3)配置启动注解仪表盘工程
@EnableHystrixDashboard
4)启动该工程
5)去到需要监控的工程,配置监控Servlet
①添加依赖
//添加监控依赖
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-metrics-event-stream</artifactId>
<version>1.5.18</version>
<scope>compile</scope>
</dependency>
②配置servlet
//启动类配置监控的Servlet
@Bean
public ServletRegistrationBean<HystrixMetricsStreamServlet> getServlet(){
HystrixMetricsStreamServlet hystrixMetricsStreamServlet
= new HystrixMetricsStreamServlet();
ServletRegistrationBean<HystrixMetricsStreamServlet>
servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(hystrixMetricsStreamServlet);
servletRegistrationBean.addUrlMappings("/hystrix.stream");
servletRegistrationBean.setName("HystrixMetricsStreamServlet");
return servletRegistrationBean;
}
6)去到仪表盘工程,配置监控地址即可
注意:Hystrix的仪表盘,不需要注册到注册中心上,是一个独立的工程就可以了
二.路由网关
1.简介
简单来说,路由网关往往是微服务架构的入口组件,外来的所有的请求,都需要通过路由网关进行分发和过滤。路由网关的核心功能:请求的路由、请求的过滤
2.功能作用
(1)路由网关提供了外部请求的访问入口,所有的外部请求都只需要知道路由网关的地址就行了,无需知道每个微服务的访问地址,路由网关可以将外部的请求负载分发给不同的微服务,这样可以对外屏蔽微服务架构内部的结构。因为路由网关往往是外部请求访问微服务架构的入口,所以可以在路由网关做请求过滤的工作。具体如下图所示:
(2)SpringCloud默认提供了2个路由网关,Zuul和Gateway,Zuul是网飞(netflix)提供的路由组件,而Gateway是SpringCloud团队自己开发的一款路由组件,用来替换Zuul的
3.路由网关的请求路由实现--Gateway
(1)创建一个微服务工程,注意该微服务工程不能添加web依赖
(2)添加Gateway依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
(3)配置application.yml
server:
port: 18888
spring:
application:
name: gateway-server
#配置路由网关的路由规则
cloud:
gateway:
routes:
#id:规则的标识,是一个合法不重复的字符串即可
- id: guize1
#predicates:路由规则,什么样的请求,匹配当前这个规则
predicates:
# http://localhost:18888/stu/a/b
- Path=/stu/**
#当前的规则,分发给哪个微服务
#http://MICRO-STUDENT/stu/a/b
uri: lb://MICRO-STUDENT
eureka:
client:
service-url:
defaultZone: http://localhost:20000/eureka
三.分布式统一配置中心
1.统一配置中心的搭建(服务端)
(1)创建一个工程(可以不是微服务,不用注册到注册中心上)
(2)添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
(3)启动类添加注解
@EnableConfigServer
(4)配置application.yml
server:
port: 40000
spring:
application:
name: config-server
#读取本地配置文件,强制需要配置该属性
profiles:
active: native
cloud:
config:
server:
#配置文件放到本地
native:
search-locations: classpath:config
#配置文件放到svn上的配置
# svn:
# uri: #svn仓库的地址
#配置文件放到git上的配置
# git:
# uri: xxxxxxxx #配git仓库的地址,git仓库里放的就是各种配置文件
(5)在config文件夹中,准备一个样例配置文件
com:
name: zhangsan
(6)运行配置中心,测试是否能都读到管理的配置信息
2.微服务配置的统一管理(其他微服务的配置全部交由统一配置中心管理)
(1)将所有微服务的application.yml放到统一配置中心的指定目录下(git、svn需要传到指定的仓库中)
(2)所有微服务添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
(3)所有的微服务,添加一个配置文件bootstrap.yml
注意:bootstrap.yml用法和application.yml的用法完全一致,但是在SpringBoot启动过程中,是先加载bootstrap.yml再加载application.yml
spring:
cloud:
config:
#配置统一配置中心的地址
uri: http://localhost:40000
#配置文件的名字
name: teacher
#配置文件的环境
profile: local
(4)启动配置中心、再启动微服务
注意:这里有一个强制的顺序要求,必须先启动配置中心,再启动微服务
3.注意事项
(1)如果配置文件是放在Config Server本地管理的,那么每次修改配置文件,都必须重启Config Server才会生效
(2)如果配置文件是放在Config Server的git、SVN仓库中管理的,那么每次修改配置文件,不用重启Config Server,会自动生效
(3)不管配置文件放在哪里,每次修改配置文件,所有的Config Client(微服务),都必须重启才有效。原因在于Config Client只有在启动的时候会去抓一次配置,然后配置就缓存到本地了,后续所有的代码都是从本地获得配置,因此服务的变化,是无感知的,这也是一种优化的结果
4.关于配置修改,需要重启所有微服务的解决方案
(1)统一配置中心的管理方案一
(2)统一配置中心的管理方案二 升级方案