当前位置:   article > 正文

Eureka、Zuul、Hystrix、Actuator、Turbine_zuul actuator

zuul actuator

目录

Eureka

Eureka的四条运行机制

依赖

 application.yml

修改 hosts 文件,添加 eureka 域名映射

微服务注册到Eureka服务器

Eureka 高可用

配置启动参数 --spring.profiles.active 和 --server.port

Feign 集成 Ribbon

Zuul网关

依赖

application.yml

Zuul 统一权限校验

Zuul 集成 Ribbon

Zuul集成Hystrix

Hystrix

 Hystrix数据监控

依赖

application.yml

Actuator

 Turbine

依赖

application.yml


Eureka

Eureka的四条运行机制

- 注册

  客户端一次次的反复连接注册中心进行注册,直到注册成功为止

- 拉取

  客户端每30秒拉取一次注册表,刷新注册表

- 心跳

  客户端每30秒发送一次心跳数据,如果服务器端连续三次收不到一个服务的心跳,会删除它的注册信息

- 自我保护模式

  - 由于网络故障,15分钟内,85%服务器出现心跳异常,会自动进入自我保护模式
  - 保护所有注册信息不删除
  - 等待网络恢复后,可以退出保护模式,恢复正常
  - 开发调试期间应该关闭保护模式,避免影响测试

依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  4. </dependency>

 application.yml

  1. spring:
  2. application:
  3. name: eureka-server
  4. server:
  5. port: 2001
  6. eureka:
  7. server:
  8. enable-self-preservation: false
  9. instance:
  10. hostname: eureka1
  11. client:
  12. register-with-eureka: false
  13. fetch-registry: false
  • eureka 集群服务器之间,通过 hostname 来区分
  • eureka.server.enable-self-preservation
  • eureka 的自我保护状态:心跳失败的比例,在15分钟内是否超过85%,如果出现了超过的情况,Eureka Server会将当前的实例注册信息保护起来,同时提示一个警告,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据。也就是不会注销任何微服务
  • eureka.client.register-with-eureka=false
  • 不向自身注册
  • eureka.client.fetch-registry=false
  • 不从自身拉取注册信息
  • eureka.instance.lease-expiration-duration-in-seconds
  • 最后一次心跳后,间隔多久认定微服务不可用,默认90

启动类添加@EnableEurekaServer注解

修改 hosts 文件,添加 eureka 域名映射

C:\Windows\System32\drivers\etc\hosts

添加内容

  1. 127.0.0.1 eureka1
  2. 127.0.0.1 eureka2

微服务注册到Eureka服务器

在pom.xml中添加以下依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  4. </dependency>

application.yml 添加 eureka注册配置

  1. eureka:
  2. client:
  3. service-url:
  4. defaultZone: http://eureka1:2001/eureka
  • eureka.instance.lease-renewal-interval-in-seconds
  • 心跳间隔时间,默认 30 秒
  • defaultZone,默认位置,可以修改为具体地理位置,比如:beiJing, shangHai, shenZhen 等,表示 eureka 服务器的部署位置, 需要云服务器提供
  • eureka.client.registry-fetch-interval-seconds
  • 拉取注册信息间隔时间,默认 30 秒

启动类添加@EnableDiscoveryClient注解

Eureka 高可用

application-eureka1.yml

  1. eureka:
  2. instance:
  3. hostname: eureka1
  4. client:
  5. register-with-eureka: true #profile的配置会覆盖公用配置
  6. fetch-registry: true #profile的配置会覆盖公用配置
  7. service-url:
  8. defaultZone: http://eureka2:2002/eureka #eureka1启动时向eureka2注册
  9. server:
  10. port: 2001

application-eureka2.yml

  1. eureka:
  2. instance:
  3. hostname: eureka2
  4. client:
  5. register-with-eureka: true #profile的配置会覆盖公用配置
  6. fetch-registry: true #profile的配置会覆盖公用配置
  7. service-url:
  8. defaultZone: http://eureka1:2001/eureka #eureka2启动时向eureka1注册
  9. server:
  10. port: 2002

配置启动参数 --spring.profiles.active--server.port

--spring.profiles.active=eureka1 --server.port=2001

 

 如果在命令行运行,可以在命令行中添加参数

java -jar xxx.jar --spring.profiles.active=eureka1 --server.port=2001

Feign 集成 Ribbon

- 负载均衡 -- 默认启用了负载均衡
- 重试 -- 默认启用了重试:调用后台服务失败(异常、服务器崩溃、超时),可以自动发起重试调用

重试参数

- ribbon.MaxAutoRetries - 单台服务器的重试次数,默认0
- ribbon.MaxAutoRetriesNextServer - 更换服务器的次数,默认1
- ribbon.ReadTimeout - 接收响应的超时时间,默认1000
- ribbon.ConnectTimeout - 与后台服务器建立连接等待超时时间,默认1000
- ribbon.OkToRetryOnAllOperations - 是否对所有类型请求都进行重试,默认只对 GET 请求重试

Zuul网关

依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
  4. </dependency>

application.yml

  1. spring:
  2. application:
  3. name: zuul
  4. server:
  5. port: 3001
  6. eureka:
  7. client:
  8. service-url:
  9. defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
  10. zuul:
  11. routes:
  12. item-service: /item-service/**
  13. user-service: /user-service/**
  14. order-service: /order-service/**

启动类添加@EnableZuulProxy@EnableDiscoveryClient 注解

Zuul 统一权限校验

1. 新建过滤器类:AccessFilter,继承 ZuulFilter

2.添加注解:`@Component`

  1. package cn.tedu.sp06.filter;
  2. import cn.tedu.web.util.JsonResult;
  3. import com.netflix.zuul.ZuulFilter;
  4. import com.netflix.zuul.context.RequestContext;
  5. import com.netflix.zuul.exception.ZuulException;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.apache.commons.lang.StringUtils;
  8. import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
  9. import org.springframework.stereotype.Component;
  10. import javax.servlet.http.HttpServletRequest;
  11. @Component
  12. @Slf4j
  13. public class AccessFilter extends ZuulFilter {
  14. //设置过滤器的类型:pre,routing,post,error
  15. //zuul自动配置的回调方法
  16. @Override
  17. public String filterType() {
  18. //return "pre";
  19. log.info("Zuul自动配置过滤器类型");
  20. return FilterConstants.PRE_TYPE;
  21. }
  22. //过滤器的顺序号
  23. @Override
  24. public int filterOrder() {
  25. /*
  26. 在默认的第5个过滤器中,向上下文对象放入了serviceId
  27. 后面过滤器中才能访问这个数据
  28. */
  29. log.info("Zuul自动配置过滤器的顺序号");
  30. return 6;
  31. }
  32. //针对当前请求进行判断,是否要执行过滤代码
  33. @Override
  34. public boolean shouldFilter() {
  35. //如果客户端调用商品,要判断权限
  36. //否则调用用户或订单,不判断权限
  37. //获得当前请求的上下文对象
  38. RequestContext ctx = RequestContext.getCurrentContext();
  39. //从上下文对象取出正在访问的serviceId
  40. String serviceId = (String) ctx.get("serviceId");
  41. //判断serviceId是否是“item-service”
  42. return "item-service".equalsIgnoreCase(serviceId);
  43. }
  44. //过滤代码
  45. @Override
  46. public Object run() throws ZuulException {
  47. //获得上下文对象
  48. RequestContext ctx = RequestContext.getCurrentContext();
  49. //从上下文对象取出request对象
  50. HttpServletRequest request = ctx.getRequest();
  51. //用request接收token参数
  52. String token = request.getParameter("token");
  53. //如果token不存在
  54. if(StringUtils.isBlank(token)){
  55. //阻止继续访问
  56. ctx.setSendZuulResponse(false);
  57. //直接返回响应:JsonResult{code:500,msg:"xxx",data:null}
  58. String json = JsonResult.build().code(500).msg("没有登录!").toString();
  59. ctx.addZuulResponseHeader("Content-Type","application/json;charset=UTF-8");
  60. ctx.setResponseBody(json);
  61. }
  62. return null;//zuul当前版本没有使用这个返回值,返回任何数据都可以,不起任何作用
  63. }
  64. }

Zuul 集成 Ribbon

- 默认已经启动 ribbon 的负载均衡
- 默认不启用 ribbon 的重试
  - 在网关重试,可能造成后台服务大面积出现压力翻倍
  - 重试功能应该尽量往后放
- 启用重试

1. 添加 spring-retry 依赖

  1. <dependency>
  2. <groupId>org.springframework.retry</groupId>
  3. <artifactId>spring-retry</artifactId>
  4. </dependency>

  2. yml配置启用重试:  zuul.retryable=true

  1. zuul:
  2. retryable: true

Zuul集成Hystrix

- zuul默认已经启用了Hystrix
- 添加降级
  1. 添加降级类,实现 FallbackProvider 接口
  2. 添加 `@Component`
     - zuul的自动配置会从spring容器自动发现降级类的实例,完成自动配置

  1. package cn.tedu.sp06.fb;
  2. import cn.tedu.web.util.JsonResult;
  3. import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
  4. import org.springframework.http.HttpHeaders;
  5. import org.springframework.http.HttpStatus;
  6. import org.springframework.http.client.ClientHttpResponse;
  7. import org.springframework.stereotype.Component;
  8. import java.io.ByteArrayInputStream;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11. /*
  12. 当调用后台商品服务失败,执行网关中的这个降级类,向客户端返回降级结果
  13. */
  14. @Component
  15. public class ItemFB implements FallbackProvider {
  16. /*
  17. 设置当前降级类,针对哪个后台服务降级
  18. - item-service:只针对商品降级
  19. - *:对所有服务都应用当前降级类
  20. - null:对所有服务都应用当前降级类
  21. */
  22. @Override
  23. public String getRoute() {
  24. return "item-service";
  25. }
  26. //发回给客户端的降级响应数据
  27. @Override
  28. public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
  29. return new ClientHttpResponse() {
  30. @Override
  31. public HttpStatus getStatusCode() throws IOException {
  32. return HttpStatus.INTERNAL_SERVER_ERROR;
  33. }
  34. @Override
  35. public int getRawStatusCode() throws IOException {
  36. return HttpStatus.INTERNAL_SERVER_ERROR.value();
  37. }
  38. @Override
  39. public String getStatusText() throws IOException {
  40. return HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase();
  41. }
  42. @Override
  43. public void close() {
  44. //用来关闭下面的输入流
  45. //ByteArrayInputStream 不占用底层系统资源
  46. }
  47. @Override
  48. public InputStream getBody() throws IOException {
  49. //JsonResult {code:500,msg:调用后台服务失败,data:null}
  50. String json = JsonResult.build().code(500).msg("调用后台服务失败").toString();
  51. return new ByteArrayInputStream(json.getBytes("UTF-8"));
  52. }
  53. @Override
  54. public HttpHeaders getHeaders() {
  55. HttpHeaders h = new HttpHeaders();
  56. h.add("Content-Type", "application/json;charset=UTF-8");
  57. return h;
  58. }
  59. };
  60. }
  61. }

Hystrix

- 容错 -- 通过降级来容错
  - 调用后台服务失败,执行当前模块的一段降级代码,返回降级结果
    - 错误提示
    - 缓存数据
    - 根据具体业务逻辑,返回任何结果都可以
- 限流 -- 通过熔断来限制后台服务的流量
  - 流量过大时,后台服务出现大量错误,会自动触发熔断
  - 10秒20次请求(必须首先满足)
  - 50%出错,执行了降级
  - 半开状态
    - 断路器打开后一段时间,会进入半开状态
    - 会尝试发送一次客户端调用
      调用成功,关闭断路器,恢复正常链路
      调用失败,继续保持打开状态

 Hystrix数据监控

Hystrix利用 springboot 的 Actuator 工具来暴露自己的监控数据

依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
  4. </dependency>

application.yml

  1. server:
  2. port: 4001
  3. hystrix:
  4. dashboard:
  5. #允许抓取日志的服务器列表
  6. proxy-stream-allow-list: localhost

启动类添加注解:@EnableHystrixDashboard

Actuator

springboot提供的项目监控指标工具,提供了多种监控数据

- 健康状态
- 环境变量、配置参数
-  spring mvc 的映射路径
- JVM 虚拟机堆内存镜像
- spring 容器中所有的对象
- .....

1. 添加 actuator 依赖:已经被Zuul集成,添加zuul依赖后无需添加

2. 在网关模块的yml配置暴露的监控数据

  1. #暴露所有监控数据
  2. management:
  3. endpoints:
  4. web:
  5. exposure:
  6. include: "*"

 Turbine

从多台服务器抓取 Hystrix 日志,进行聚合,

Hystrix dashboard从Turbine抓取聚合后的日志数据

依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
  4. </dependency>

application.yml

  1. spring:
  2. application:
  3. name: turbine
  4. server:
  5. port: 5001
  6. eureka:
  7. client:
  8. service-url:
  9. defaultZone: http://eureka1:2001/eureka,http://eureka2:2002/eureka
  10. turbine:
  11. app-config: zuul
  12. cluster-name-expression: new String("default")
turbine.app-config   聚合的服务列表:zuul,a,b,c
turbine.cluster-name-expression   对聚合的日志数据命名:new String("default")

启动类注解:@EnableTurbine

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/963420
推荐阅读
相关标签
  

闽ICP备14008679号