作用

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

默认启用了负载平衡,但没有启用重试

启用重试

  1. 增加 spring-retry 依赖
  2. zuul.retryable=true
  3. 有默认重试参数(无需配置重试参数)

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;            }        };    }}