共计 2770 个字符,预计需要花费 7 分钟才能阅读完成。
作用
API 网关
- 后盾服务对立的调用入口
- 转发的路由规定如下:
zuul:
routes:
# 近程服务: 调用门路
# 上面配置的是默认规定,不配置也能够主动配置
# 如果不配置,能够依据注册表主动配置
实现步骤
1. 增加依赖:Zuul/eureka client
2. 配置 application.yml:application.name/server.port/zuul.route. 服务
spring:
application:
name: zuul
server:
port: 3001
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
zuul:
routes:
item-service: /item-service/**
user-service: /user-service/**
order-service: /order-service/**
3. 启动类增加注解@EnableZuulProxy
@EnableZuulProxy
@SpringBootApplication
public class Sp11ZuulApplication {public static void main(String[] args) {SpringApplication.run(Sp11ZuulApplication.class, args);
}
}
对立的权限校验
定义过滤器
通过继承 ZuulFilter 过滤器,来实现权限判断
没登陆就阻止拜访
已登录就容许拜访 –http://…/…?token=…
@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;
}
}
zuul 集成 ribbon
默认启用了负载平衡,但没有启用重试
启用重试
- 增加 spring-retry 依赖
- zuul.retryable=true
- 有默认重试参数(无需配置重试参数)
zuul + hystrix 降级
创立降级类
- getRoute() 办法中指定利用此降级类的服务 id,星号或 null 值能够通配所有服务
@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;
}
};
}
}
正文完