作用
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/eurekazuul: routes: item-service: /item-service/** user-service: /user-service/** order-service: /order-service/**
3.启动类增加注解@EnableZuulProxy
@EnableZuulProxy@SpringBootApplicationpublic class Sp11ZuulApplication { public static void main(String[] args) { SpringApplication.run(Sp11ZuulApplication.class, args); }}
对立的权限校验
定义过滤器
通过继承 ZuulFilter 过滤器,来实现权限判断
没登陆就阻止拜访
已登录就容许拜访--http://.../...?token=...
@Componentpublic 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@Componentpublic 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; } }; }}