zuul的主要作用是代理,路由、过滤(如权限),对外提供统一访问入口。
书签:
1、小小例子
2、路由规则
3、小小过滤
- 小小例子
测试路由功能:新建一个项目:gateway-zuul
主要依赖:pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> |
主启动类加入注解:@EnableZuulProxy
package cn.ywj.gatewayzuul;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication @EnableZuulProxy public class GatewayZuulApplication {
public static void main(String[] args) { SpringApplication.run(GatewayZuulApplication.class, args); } } |
application.yml 修改配置
#应用名 spring: application: name: gateway-zuul # 端口号 server: port: 8803 # eureka配置 eureka: instance: hostname: localhost prefer-ip-address: true client: serviceUrl: defaultZone: http://eureka0:8080/eureka/,http://eureka1:8180/eureka/,http://eureka2:8280/eureka/
# 上面是普通的基本配置
zuul: routes: xxx-provider: # 指定一个路由,名字随便写,最好和服务名一样 path: /ep/** #当访问/ep/** url时,就会请求到下面的serviceId对应的服务的请求中,如请求/ep/abc.do后会请求到eureka-provider的abc.do方法里 serviceId: eureka-provider # 配合上面的path跳转使用 |
完毕。启动访问http://127.0.0.1:8803/ep/t 即可看到请求到结果。
- 路由规则
- 多个写法,在配置文件里配置多个routes子节点即可
zuul: routes: xxx-provider: path: /ep/** serviceId: eureka-provider yyy-provider: path: /ep2/** serviceId: eureka-provider |
- 忽略原服务名请求方式,之前可以通过http://127.0.0.1:8803/ep/t 访问,也可以通过http://127.0.0.1:8803/eureka-provider/t 访问,现在想禁止到通过服务名请求的方式,加上配置:ignored-services
zuul: routes: xxx-provider: path: /ep/** serviceId: eureka-provider
yyy-provider: path: /ep2/** serviceId: eureka-provider
ignored-services: eureka-provider #忽略服务名请求,多个就有逗号,隔开;如果想全部忽略,就用 * 符号 |
此时http://127.0.0.1:8803/ep/t可以访问,而http://127.0.0.1:8803/eureka-provider/t 不再可以访问
3、访问加前缀: prefix
zuul: routes: xxx-provider: path: /ep/** serviceId: eureka-provider
yyy-provider: path: /ep2/** serviceId: eureka-provider prefix: /ywj #访问加前缀,也就是最终访问要在path前面加上 /ywj ignored-services: eureka-provider #忽略服务名请求,多个就有逗号,隔开;如果想全部忽略,就用 * 符号 |
此时访问为:http://127.0.0.1:8803//ywj/ep/t
- 小小过滤
模拟过滤操作,也可以做相关权限功能啦
创建一个类MyFilter继承ZuulFilter
package cn.ywj.gatewayzuul;
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
/** * 参考:http://www.spring4all.com/article/303 * 参考:https://www.cnblogs.com/qdhxhz/p/9601170.html */ @Component public class MyFilter extends ZuulFilter {
private static String FILTER_TYPE = "pre";
@Override public String filterType() { return FILTER_TYPE; }
@Override public int filterOrder() { return 0; }
@Override public boolean shouldFilter() {
RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest(); String url = request.getRequestURI(); // 这里可以放开登录之类的请求,return false return true; }
@Override public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest();
// 想怎么搞都行 String p = request.getParameter("p"); if(!"ywj".equalsIgnoreCase(p)){
// 权限不对之类的就设置下面信息就不会再访问下去了
// 过滤该请求,不对其进行路由 requestContext.setSendZuulResponse(false); //返回错误代码 requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); // 返回的描述信息 requestContext.setResponseBody("{\"result\":\"fk\"}"); } // 一切没问题,ok,放开访问 return null; } } |
Ok,完毕。
基佬网址:https://github.com/woshiyinweijian/SpringCloudTestV2