服务熔断:释放资源,减轻服务器压力。当某一个环节的微服务调用失败后,它将会导致上一层服务失败,服务访问越大则失败率越高,而这一连串的失败就是雪崩效益,下层失败导致上层所有服务崩溃。
官方架构图示意: 当API调用远程服务,而远程服务报错时,Hystrix将执行fallback方法来返回给api调用。
注意,Hystrix在熔断期间会对服务进行一次请求测试,如果服务能够正常访问,则会重新关闭熔断。
注意:@DefaultProperties 和 @HystrixCommand可以共存,后者的优先级大于前者。
Openfeign组件中默认是由集成Hystrix的,只需要在配置文件中开启即可使用Hystrix的功能。使用集成功能不需要像手动创建Hystrix服务那样繁琐,使用@DefaultProperties 和 @HystrixCommand注解,而是直接在@FeignClient上标记Hystrix的fallback,在yml中对Hystrix进行配置即可。
创建fallback类
修改FeignClient
在服务调用端(Order)中修改FeignClient,加入fallback属性,并赋值定义好的fallback类。在开发大型的项目,我们会提供一个公共的数据model来进行数据装载这样会更加利于后续的判断。所有的Controller都必须基于该model进行数据返回。
创建fallbackFactory类
修改FeignClient
fallbackFactory类需要实现FallbackFactory接口和当前实现的具体类型,fallbackFactory的作用与fallback类似,只是前者会获取client端的报错信息。
由于config本身提供高可用集群方案,而这个集群方案需要依赖Eureka Server,所以在创建Config服务时,需要引入Eureka客户端,同时引入Config连接SVN需要的依赖库。
使用向导创建项目
加入svn依赖
<dependency> <groupId>org.tmatesoft.svnkit</groupId> <artifactId>svnkit</artifactId> <version>1.9.3</version> </dependency> 上传配置文件至版本控制工具 将其他客户端的配置文件上传至版本控制工具,这里以svn举例。分支文件夹中的文件说明 svn作为版本协同工具,拥有创建多个分支的功能,多个分支标记着多个版本环境。用于在线服务回滚。
url可作为config连接的地址分支版本可在config端连接时指定,默认是trunk目录分支文件夹下存放所有的客户端的配置文件,这里存放了三个版本的文件。分别是userService.yml、userService-dev.yml(开发环境)、userService-pro.yml(生产环境)。
这三个文件又有各自不同的作用域。其中两个通过名称很好理解。userService-dev.yml 用于开发测试环境,后缀dev可以随意自定义。userService-pro.yml 用于正式生产环境,后缀pro 可以随意自定义。userService.yml 用来存放不同环境的公共配置信息(可省略)。控制中心需要实现高可用,除了SpringBoot规范中的开启配置中心服务注解以外,还需要加入Eureka客户端连接的注解
属性详解:
spring.cloud.config.server.svn 配置svn相关的属性 uri :svn地址username : svn账户password :svn密码basedir :下载的配置文件本地存放路径default-label :引用分支,默认为trunk。若需要使用其他的分支需要声明属性并指定值 spring.profiles.active = subversion 指定配置中心使用svnuserService.yml(存放微服务的注册中心配置信息,不带后缀的文件,config是当做公共配置使用的,无法直接访问。)
userService-dev.yml(开发环境)
userService-pro.yml(生产环境)
注意:这里只是为了测试才将两个文件的应用名设置为不同,在后续真正开发的过程中,一定要将所有的相同的服务设置为相同的应用名。
访问userService-dev.yml(访问开发环境配置文件,config会将公共配置文件同样引入进来。)
访问userService-pro.yml(生产环境)
SpringCloud所有的组件都是依赖SpringBoot进行二次封装的,默认的配置文件是application.properties。项目在启动时会按照启动类赋予的功能加载配置文件中的属性。但是目前的配置文件是一个远程地址,需要先拉取配置再加载,所以配置文件需要在SpringBoot加载配置内容前就拿到具体配置。这里就需要预加载。
重命名配置文件为:bootstrap.yml/propertiesSpring Cloud Zuul 是一套边缘服务,它能实现动态路由、监控、负载和流量管理等功能。简单来说,Zuul就是服务应用端的一套负载均衡器。它是由一个核心ZuulServlet和一些列的过滤器组成。
Zuul是单独的一个服务,需要重新创建一个新项目,除了加入Zuul相关依赖以外,还需要加入Config客户端和Eureka客户端依赖。 Zuul可以通过Config拉取配置文件,并注册至Eureka直接完成高可用,这个过程不需要任何配置信息。
与配置中心客户端连接一样,连接配置中心,起名为api-config,同时在版本控制工具中上传对应的配置文件。配置文件可以参考Config示例创建同样的三个配置文件,并命名为api-config.yml、api-config-dev.yml、api-config-pro.yml。
api-gateway.yml api-gateway-dev.yml、api-gateway-pro.yml在当前版本中,启动完Zuul服务直接访问zuul服务并加上需要访问的ServiceId(注册在Eureka的Application名)和请求路径即可完成转发。
从测试结果中可以看到,通过zuul服务地址+服务实例+接口地址 就可以完成请求转发的功能。整个过程如下图所示:
通过指定serviceId的方式自定义路径(通过实例名:映射路径 可以简洁的声明实例名和映射路径)
禁用所有默认映射的服务
连接及超时配置 Zuul的连接数,超时等常见配置在ZuulProperties的内部类Host类中。超时配置有两种情况:
当zuul使用了服务注册中心时,会有ribbon组件负责连接。开发者需要设置ribbon.ReadTimeout 和ribbon.SocketTimeout两项配置属性当使用了zuul节点和url映射时,需要配置 zuul.host.connect-timeout-millis和zuul.host.socket-timeout-milli属性连接超时配置
Ribbon超时设置