本文共 7229 字,大约阅读时间需要 24 分钟。
4.0.0 com.kgf chapter5-2 1.0-SNAPSHOT eureka-zuul-client eureka-zuul-client org.springframework.cloud spring-cloud-starter-netflix-zuul org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test
package com.kgf.eureka.zuul.hystrix;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;@Componentpublic class MyFallbackProvider implements FallbackProvider { @Override public String getRoute() { return "eureka-client";//实现对eureka-client服务的熔断 } @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { return new ClientHttpResponse() { @Override public InputStream getBody() throws IOException { return new ByteArrayInputStream("Error,I am the fallback".getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } @Override public int getRawStatusCode() throws IOException { return 200; } @Override public String getStatusText() throws IOException { return "OK"; } @Override public void close() { } }; }}
package com.kgf.eureka.zuul.filter;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.ZuulException;/** * 自定义过滤器 * @author 86136 * */@Componentpublic class MyFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(MyFilter.class); /** * filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下: * 1:pre:路由之前 * 2:routing:路由之时 * 3:post: 路由之后 * 4:error:发送错误调用 */ @Override public String filterType() { return "pre";//这里必须小写 } /** * 这个方法表示该过滤器是否过滤逻辑,如果为true,则执行run方法,如果为false,则不执行run方法 */ @Override public boolean shouldFilter() { return true; } /** * 这个run方法中是主要写具体过滤的逻辑的。 * 这里我们测试的例子是判断用户是否在请求参数中传递了token这个参数, * 如果没有传递这个参数,那么请求就不会被传递到具体的服务实例,直接返回相应状态码401 */ @Override public Object run() throws ZuulException { //获取RequestContext对象,因为过滤器直接不能直接通信,必须通过RequestContext来共享数据 RequestContext context = RequestContext.getCurrentContext(); //获取HttpServletRequest对象 HttpServletRequest request = context.getRequest(); //获取我们的参数标识 String accessToken = request.getParameter("token"); if(StringUtils.isBlank(accessToken)) { log.warn("token is empty!"); //如果参数为空,那么我们设置网关返回直接不路由到具体服务 context.setSendZuulResponse(false); //返回状态码为401 context.setResponseStatusCode(401); try { //将错误信息返回到前台 context.getResponse().getWriter().write("token is empty!"); } catch (IOException e) { return null; } } log.info("ok"); return null; } /** * 过滤的顺序 ,值越小越先执行该过滤器 */ @Override public int filterOrder() { return 0; }}⑵依次启动工程eureka-server,eureka-client(注意这里需要启动两个实例,端口分别为8762,8763),eureka-ribbon-client, eureka-feign-client和eureka-zuul-client服务 a:访问浏览器路径:
转载地址:http://myql.baihongyu.com/