路由在微服务体系结构的一个组成部分。
例如,/可以映射到您的Web应用程序,/api/users映射到用户服务,并将/api/shop映射到商店服务。
Zuul是Netflix的基于JVM的路由器和服务器端负载均衡器。
本案例示例代码在 spring-cloud(三)声明性REST客户端[Feign] 及 spring-cloud(五)客户端负载平衡器[Ribbon] 基础上进行改造。
1.创建一个maven工程,tm-service-zuul
2.在pom文件中引入zuul的依赖支持
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency>
3.在application.yml文件中增加zuul的路由规则
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8767 spring: application: name: service-zuul zuul: routes: api-ribbon: path: /api-r/** serviceId: service-ribbon api-feign: path: /api-f/** serviceId: service-feign
4.在主启动类上增加注解 @EnableZuulProxy
@EnableZuulProxy @SpringBootApplication @EnableDiscoveryClient public class ServiceZuulApplication {
public static void main(String[] args) { SpringApplication.run(ServiceZuulApplication.class, args); } }
5.分别启动 tm-eureka-server,tm-service,tm-service-feign,tm-service-ribbon,tm-service-zuul
6.浏览器访问 http://192.168.2.14:8767/api-f/hello
http://192.168.2.14:8767/api-r/hello
出现如上图所示响应,说明路由规则生效了。
7.再增加filter类,创建TmFilter
package cn.majingjing.tm.filter;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component;
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext;
@Component public class TmFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(TmFilter.class);
@Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); log.info("{} , {}", request.getMethod(), request.getRequestURL().toString()); Object token = request.getParameter("token"); if (token == null || !"zuul".equals(token)) { ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); try { ctx.getResponse().getWriter().write("token is invalid"); } catch (Exception e) { }
return null; } return null; }
@Override public boolean shouldFilter() { return true; }
@Override public int filterOrder() { return 0; }
@Override public String filterType() { return "pre"; }
}
8.再次启动服务,并重复步骤6,发现请求被禁止。token无效
可以基于zuul的过滤器也生效了。
以上就是zuul的简单使用示例。
|