Zuul 简介
Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如 /api/admin 转发到到 Admin 服务,/api/member 转发到到 Member 服务。Zuul 默认和 Ribbon 结合实现了负载均衡的功能。
引入依赖
在 pom.xml 中主要添加 spring-cloud-starter-netflix-eureka-server 和 spring-cloud-starter-netflix-zuul 依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-serverorg.springframework.cloud spring-cloud-starter-netflix-zuul
相关配置
在 application.yml 中主要添加 Zuul 路由配置
zuul:
routes:
api-a:
path: /api/ribbon
@Component
public class WebAdminFeignFallbackProvider implements FallbackProvider {
@Override
public String getRoute() {
// ServiceId,如果需要所有调用都支持回退,则 return "*" 或 return null
return "hello-spring-cloud-web-admin-feign";
}
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
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 {
ObjectMapper objectMapper = new ObjectMapper();
Map map = new HashMap<>();
map.put("status", 200);
map.put("message", "无法连接");
return new ByteArrayInputStream(objectMapper.writevalueAsString(map).getBytes("UTF-8"));
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
// 和 getBody 中的内容编码一致
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
}
};
}
}
测试路由访问
依次运行 EurekaApplication > ServiceAdminApplication > WebAdminRibbonApplication > WebAdminFeignApplication > ZuulApplication 各服务
访问:http://localhost:8769/api/ribbon/hi?message=zuul
浏览器显示
port : 8763,message : zuul
访问:http://localhost:8769/api/feign/hi?message=zuul
浏览器显示
port : 8763,message : zuul
至此说明 Zuul 的路由功能配置成功。
使用 Zuul 的服务过滤功能
Zuul 不仅仅只是路由,还有很多强大的功能。比如用在安全验证方面。
创建服务过滤器
@Component
public class LoginFilter extends ZuulFilter {
private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String token = request.getParameter("token");
if (token == null) {
logger.warn("Token is empty");
context.setSendZuulResponse(false);
context.setResponseStatusCode(401);
try {
context.getResponse().getWriter().write("Token is empty");
} catch (IOException e) {
}
} else {
logger.info("OK");
}
return null;
}
}
测试过滤器
访问:http://localhost:8769/api/feign/hi?message=zuul
网页显示
Token is empty
访问:http://localhost:8769/api/feign/hi?message=zuul&token=1
网页显示
port : 8763,message : zuul
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



