springCloud-Zuul网关配置

上一篇

1.搭建工程引入依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>
2.配置启动项
package cn.itcast;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@EnableZuulProxy
@SpringBootApplication
public class GetwayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GetwayApplication.class);
        System.out.println("getWay 启动成功");
    }
}
3.配置文件application.yml
server:
  port: 10010
zuul:
  routes:
    hehe:
      path: /user-service/**
      url: http://127.0.0.1:8081

这样我们就可以访问http://localhost:10010/user-service/user/1去访问我们再user-service的方法了。但是路径写死了,没用做到负载均衡

所有这里的做法是不合理的我们不能去访问这个,我们应该去访问eureka的服务,去达到负载均衡。

1.引入pom
<dependency>
     <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  </dependency>
1.引入eureka配置
server:
  port: 10010

#注册到服务中心
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka

zuul:
  routes:
    # key 是服务的id wvlue 是服务的路径
    #这样的配置太常见了服务的id正好等于映射路径,默认的服务回去eureka服务器上把这个配置成这样的
    #如果这样我们就可以不用配置了
    #user-service: /user-service/**
   #但是我们一帮自定义配置
    user-service: /user/**
  #要忽略的配置
  ignored-services:
     - consumer-service

server:
  port: 10010

#注册到服务中心
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka

zuul:
  routes:
    # key 是服务的id wvlue 是服务的路径
    #这样的配置太常见了服务的id正好等于映射路径,默认的服务回去eureka服务器上把这个配置成这样的
    #如果这样我们就可以不用配置了
    #user-service: /user-service/**
   #但是我们一帮自定义配置
    user-service:
      path: /user/**
      serviceId: user-service
      strip-prefix: false
  #要忽略的配置
  ignored-services:
     - consumer-service
server:
  port: 10010

#注册到服务中心
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka

zuul:
  prefix: /api
  routes:
    # key 是服务的id wvlue 是服务的路径
    #这样的配置太常见了服务的id正好等于映射路径,默认的服务回去eureka服务器上把这个配置成这样的
    #如果这样我们就可以不用配置了
    #user-service: /user-service/**
   #但是我们一帮自定义配置
    user-service: /user/**
  #要忽略的配置
  ignored-services:
     - consumer-service

配置一个网关的拦截器

1.使用之前的配置

server:
  port: 10010

#注册到服务中心
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka

zuul:
  prefix: /api
  routes:
    # key 是服务的id wvlue 是服务的路径
    #这样的配置太常见了服务的id正好等于映射路径,默认的服务回去eureka服务器上把这个配置成这样的
    #如果这样我们就可以不用配置了
    #user-service: /user-service/**
   #但是我们一帮自定义配置
    user-service:
      path: /user/**
      serviceId: user-service
      strip-prefix: false

  #要忽略的配置
  ignored-services:
     - consumer-service
  • 写一拦截器继承ZuulFilter实现方法,每当你访问的时候拦截判断。
  • 我们这判断有没有access-token
package cn.itcast.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class LoginFilter extends ZuulFilter {
    //过滤器类型 - 前置
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    //过滤器的顺序
    @Override
    public int filterOrder() {
        return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
    }

    //是否启动过滤器
    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        //获取请求上下文
        RequestContext ctx = RequestContext.getCurrentContext();
        //获取request
        HttpServletRequest request = ctx.getRequest();
        //获取请求的参数 access-token
        String token = request.getParameter("access-token");
        //判断是否存在
        //这个方法是判断字符串是否存在的,这个是lang3包里面的工具我们没有写trim这个方法去判断,
        // 应为这个方法的底层是截取形成新的字符串,容易找出内存溢出,效率很差
        if(StringUtils.isBlank(token)){
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
        }
        //不存在,未登录,则拦截
        return null;
    }
}

当我们访问http://localhost:10010/api/user/1?access-token=123 可以成功

配置负载均衡和熔断

server:
  port: 10010

#注册到服务中心
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka

zuul:
  prefix: /api
  routes:
    # key 是服务的id wvlue 是服务的路径
    #这样的配置太常见了服务的id正好等于映射路径,默认的服务回去eureka服务器上把这个配置成这样的
    #如果这样我们就可以不用配置了
    #user-service: /user-service/**
   #但是我们一帮自定义配置
    user-service:
      path: /user/**
      serviceId: user-service
      strip-prefix: false

  #要忽略的配置
  ignored-services:
     - consumer-service

#############################负载均衡熔断
#配置全局超时
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000

ribbon:
  ConnectionTimeout: 500
  ReadTimeout: 1000
  MaxAutoRetriesNextServer: 0 #不重试

微服务框架
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值