zuul服务网关

2019-05-13  本文已影响0人  寂静的春天1988
1、zuul快速入门

pom文件导入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

yml文件

server:
  port: 8083
spring:
  application:
    name: zuul

zuul:
  routes:
    teacherZuul: #这个是随意起的,表示路由名称
      path: /**  #配置请求url的请求规则
      url: http://127.0.0.1:8081 #真正的微服务地址

启动类

@EnableZuulProxy
@SpringBootApplication
public class SpringCloudZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudZuulApplication.class, args);
    }

}

在启动类上加@EnableZuulProxy开启服务网关

2、面向服务路由

将上面的代码url改成serviceId
yml文件

server:
  port: 8083
spring:
  application:
    name: zuul

zuul:
  routes:
    teacherZuul: #这个是随意起的,表示路由名称
      path: /**  #配置请求url的请求规则
      #url: http://127.0.0.1:8081 #真正的微服务地址
      service-id: teacher
      
eureka:
  client:
    register-with-eureka: true #是否将自己注册到eureka,默认为true
    fetch-registry: true #是否从eureka中获得注册信息,默认为true
    service-url:
       defaultZone: http://root:123@127.0.0.1:1234/eureka/
  instance:
    prefer-ip-address: true #将自己的ip注册到eureka服务中
    ip-address: 127.0.0.1

http://127.0.0.1:8083/queryTeacherId?id=1](http://127.0.0.1:8083/queryTeacherId?id=1
请求上面地址,先经过8083在到达teacher服务

使用zuul写一个进入方法前判断是否登录的demo

filter类

package com.ganlong.filter;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Component;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

@Component
public class MyFilter extends ZuulFilter{

    /**
     * 返回一个布尔值,表示过滤器是否执行,true执行,false不执行
     */
    @Override
    public boolean shouldFilter() {
        // TODO Auto-generated method stub
        return true;
    }
    /**
     * 过滤器的业务逻辑
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
            ctx.setSendZuulResponse(false);//过滤该请求,不进行路由
            ctx.setResponseStatusCode(401);//设置响应状态码
            try {
                ctx.getResponse().getWriter().write("token is empty");
            }catch (Exception e){}
            return null;
        }
        return null;
    }
    /**
     * 通过返回的int来定义过滤器的执行顺序,数字越小优先级越高
     */
    @Override
    public int filterOrder() {
        // TODO Auto-generated method stub
        return 0;
    }

    /**
     *   过滤器类型
     * pre:请求被路由之前执行
     * routing:在路由时调用
     * post:在routing和error之后调用
     * error:处理请求发生错误时调用
     */
    @Override
    public String filterType() {
        // TODO Auto-generated method stub
        return "pre";
    }

}
上一篇 下一篇

猜你喜欢

热点阅读