SpringCloud学习 - 网关服务--ZUUL

zuul的主要作用是代理,路由、过滤(如权限),对外提供统一访问入口。

 

书签:

1、小小例子

2、路由规则

3、小小过滤

  1. 小小例子

测试路由功能:新建一个项目: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 即可看到请求到结果。

 

  1. 路由规则
  1. 多个写法,在配置文件里配置多个routes子节点即可

zuul:
  routes:


    xxx-provider:
        path: /ep/**
        serviceId: eureka-provider


    yyy-provider:
            path: /ep2/**
            serviceId: eureka-provider

 

  1. 忽略原服务名请求方式,之前可以通过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

 

  1. 小小过滤

模拟过滤操作,也可以做相关权限功能啦

创建一个类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

猜你喜欢

转载自blog.csdn.net/u013845177/article/details/83278516
今日推荐