SpringCloud之zuul(网关)转发服务(四)

简介:zuul

在Spring Cloud微服务系统中,客户端的请求首先经过负载均衡(zuul、Ngnix),再到达服务网关(zuul集群),再到具体的路由(服务)。

主要功能:主要是转发请求与过滤器,还有全局处理异常,它默认集成了ribbon实现负载均衡的效果。

有时候还和Spring security配合使用,达到对每个服务安全和高可用的效果。(此处不举例子,以后更新)

开始搞!!!:

一丶创建module项目

二丶我的核心依赖供参考

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

 三丶启动类书写

@SpringBootApplication
/**
*开启网关
**/
@EnableZuulProxy
/**
*将网关注册到(eureka)服务中心去
**/
@EnableEurekaClient
public class XwlZuulServerApplication {

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


}

四丶配置文件如下

server:
  port: 5786
spring:
  #设置网关在规定时间响应时进行重机制
  #cloud:
   # loadbalancer:
    #  retry:
     #   enabled: true
  application:
    name: xwl-zuul-server
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://localhost:8764/eureka/
    register-with-eureka: true
    fetch-registry: true
    #设置熔断器执行时间
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000
            #客户端响应等待时间
ribbon:
  ReadTimeout: 60000
  ConnectTimeout: 60000
zuul:
  routes:
    ##意味着通过/xwlget 的http呼叫将转发到xwl-git-server 服务,
    #标识
    xwl-get-server:
      path: /xwlget/**
      serviceId: xwl-git-server
    xwl-gitxiao-server:
      path: /xwlgitxiao/**
      serviceId: xwl-gitxiao-server
      ##为所有路由添加前缀
  prefix: /test
  #设置敏感标题
  sensitive-headers: Cookie,Set-Cookie
  #待核实
endpoints:
  routes:
    enabled: false

五丶全局控制异常类

说明:主要控制所有服务的请求转发时由zuul监控,如果出现超时等情况,这里会回退异常,可自行关闭之前的服务进行请求测试。

package com.itxwl.xwlzuulserver.filter;

import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 全局控制异常信息
 */
@Component
public class ServiceFallbackProvider implements ZuulFallbackProvider {
    @Override
    public String getRoute() {
        return "*";
    }

    @Override
    public ClientHttpResponse fallbackResponse() {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.OK;
            }

            @Override
            public int getRawStatusCode() throws IOException {
                return 200;
            }

            @Override
            public String getStatusText() throws IOException {
                return "OK";
            }

            @Override
            public void close() {

            }
            //这个就是控制全局异常的核心方法
            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream("服务故障,请稍后重试!".getBytes());
            }
            //设置编码为utf-8
            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
                return headers;
            }
        };
    }
}

六丶过滤器拦截处理

说明:这里就拦截通过网关访问其它服务时,没有带参数tocken的情况,如果携带了验证通过返回信息,如果未通过,拦截。

package com.itxwl.xwlzuulserver.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Component
public class ZuulFilterEveryServer extends ZuulFilter {
    /**
     * pre:可以在请求被路由之前调用
     * route:在路由请求时候被调用
     * post:在route和error过滤器之后被调用
     * error:处理请求时发生错误时被调用
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 优先级为0,数字越大,优先级越低
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * // 是否执行该过滤器,此处为true,说明需要过滤
     * @return
     */
    @Override
    public boolean shouldFilter() {
        //RequestContext currentContext = RequestContext.getCurrentContext();
        //if ((boolean)currentContext.get("isSuccess")==true){
            return true;
        //}
        //return false;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String tocken = request.getParameter("tocken");
        if (tocken==null||tocken.isEmpty()){
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            ctx.setResponseBody("token is null,please add tocken !");
        }
        return null;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值