1

1.hystrix+turbine 集群聚合监控

image.png

hystrix dashboard一次只能监控一个服务实例 使用turbine可以汇集监控信息 将聚合后的信息提供给hystrix dahsboard来集中展示和监控

新建sp10-turbine项目

1.添加 Turbine Eureka Discovery Client两个依赖
2.配置yml文件

spring:
application:

name: turbin

server:
port: 5001

eureka:
client:

service-url:
  defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
  

turbine:
app-config: order-service
cluster-name-expression: new String("default")

3.主程序 添加@EnableTurbine和@EnableDiscoveryClient注解

访问测试
image.png

zuul API网关

zuul API网关 为微服务应用提供统一的对外访问接口
zuul还提供过滤器 对所有微服务提供统一的请求校验

新建sp11-zuul项目

1.添加Eureka Discoery Client Zuul sp01-commons项目依赖
2.yml文件 zuul路由配置可以省略 缺省以服务id作为访问路径
3.在主程序添加@EnableZuulProxy和@EnableDiscoveryClient注解
4.启动测试

zuul+ribbon负载均衡
zuul已经集成了ribbon 默认已经实现了负载均衡

zuul+ribbon重试
1.添加spring-retry依赖
2.需要开启重试 默认不开启
image.png

zuul+hystrix降级

创建降级类

getRoute() 方法中指定应用此降级类的服务id,星号或null值可以通配所有服务

package cn.tedu.sp11.fallback;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

import cn.tedu.web.util.JsonResult;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class ItemServiceFallback implements FallbackProvider {

@Override
public String getRoute() {
    //当执行item-service失败,
    //应用当前这个降级类
    return "item-service";
    //星号和null都表示所有微服务失败都应用当前降级类
    //"*"; //null;
}

//该方法返回封装降级响应的对象
//ClientHttpResponse中封装降级响应
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
    return response();
}

private ClientHttpResponse response() {
    return new ClientHttpResponse() {
        //下面三个方法都是协议号
        @Override
        public HttpStatus getStatusCode() throws IOException {
            return HttpStatus.OK;
        }
        @Override
        public int getRawStatusCode() throws IOException {
            return HttpStatus.OK.value();
        }
        @Override
        public String getStatusText() throws IOException {
            return HttpStatus.OK.getReasonPhrase();
        }

        @Override
        public void close() {
        }

        @Override
        public InputStream getBody() throws IOException {
            log.info("fallback body");
            String s = JsonResult.err().msg("后台服务错误").toString();
            return new ByteArrayInputStream(s.getBytes("UTF-8"));
        }

        @Override
        public HttpHeaders getHeaders() {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            return headers;
        }
    };
}

}

image.png

zuul降级类实现 FallbackProvider这个接口

zull+hystrix数据监控

暴露hystrix.stream监控端点

zuul已经包含了actuator的依赖

management:
endpoints:

web:
  exposure:
    include: hystrix.stream
    

启动服务 查看暴露的监控端点
(http://localhost:3001/actuator)(http://localhost:3001/actuator/hystrix.stream)

zuul+turbine聚合监控

修改turbine项目 聚合zuul服务实例

image.png

zuul请求过滤

定义过滤器 继承ZuulFilter

新建过滤器

package cn.tedu.sp11.filter;

import javax.servlet.http.HttpServletRequest;

import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import cn.tedu.web.util.JsonResult;

@Component
public class AccessFilter extends ZuulFilter{

@Override
public boolean shouldFilter() {
    //对指定的serviceid过滤,如果要过滤所有服务,直接返回 true
    
    RequestContext ctx = RequestContext.getCurrentContext();
    String serviceId = (String) ctx.get(FilterConstants.SERVICE_ID_KEY);
    if(serviceId.equals("item-service")) {
        return true;
    }
    return false;
}

@Override
public Object run() throws ZuulException {
    RequestContext ctx = RequestContext.getCurrentContext();
    HttpServletRequest req = ctx.getRequest();
    String token = req.getParameter("token");
    if (token == null) {
        //此设置会阻止请求被路由到后台微服务
        ctx.setSendZuulResponse(false);
        //向客户端的响应
        ctx.setResponseStatusCode(200);
        ctx.setResponseBody(JsonResult.err().code(JsonResult.NOT_LOGIN).toString());
    }
    //zuul过滤器返回的数据设计为以后扩展使用,
    //目前该返回值没有被使用
    return null;
}

@Override
public String filterType() {
    return FilterConstants.PRE_TYPE;
}

@Override
public int filterOrder() {
    //该过滤器顺序要 > 5,才能得到 serviceid
    return FilterConstants.PRE_DECORATION_FILTER_ORDER+1;
}

}


廾匸
1 声望3 粉丝

« 上一篇
第五阶段day04