1.hystrix+turbine 集群聚合监控
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注解
访问测试
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.需要开启重试 默认不开启
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;
}
};
}
}
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服务实例
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;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。