天天看点

springcloud zuul网关对微服务路由及权限的控制

前提:

1.eureka-server注册服务中心。

2.准备两个服务提供者,分别在端口8090,8091

3.启动Eureka服务器和两个服务提供者,访问http://localhost:8761/,如下图

springcloud zuul网关对微服务路由及权限的控制

4.zuul网关服务搭建

pom文件依赖如下:

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

配置文件application.yml

spring:
  application:
    name: gateway
server:
  port: 

eureka:
  client:
    serviceUrl:
       defaultZone: http://localhost:/eureka/  #注册中心地址
  instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ipAddress}:${spring.application.name}:${server.port}

#访问路径直接指向 serviceId实例对应服务的接口 
#如:http://localhost:8761/server-kl/user(这里的server-kl指的是path)通过网关访问的是http://server-kl/user(此处server-kl指的是serviceId)
zuul:
  routes:
    api-kls:
      path: /server-kl/**
      serviceId: server-kl #指向服务server-kl的application name
      customSensitiveHeaders: true                    
   api-klc:
      path: /client-kl/**
      serviceId: client-kl #指向服务client-kl的application name
      customSensitiveHeaders: true
  add-proxy-headers: true  #X-Forwarder-Host请求头默认添加到转发请求中

#目的:防止服务重启后,第一次访问超时
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: false
          strategy: SEMAPHORE #Request请求头设置token
           

编写一个zuul过滤器,用来控制权限等。每次发送请求的时候都需要判断是否有token。

package com.kl.getaway.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;

import javax.servlet.http.HttpServletRequest;

@Configuration//该注解是让服务器启动时将奔雷作为配置类注入到spring容器。如若不加此注解,需在启动类配置该bean
public class AccessFilter extends ZuulFilter{
    private static Logger log = LoggerFactory.getLogger(AccessFilter.class);

    //可以在请求被路由之前调用
    @Override
    public String filterType() {
        return "pre";
    }

    //通过int值来定义过滤器的执行顺序,越小的值越优先处理。
    @Override
    public int filterOrder() {
        return ;
    }

    //返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关。true:总是生效,false:不生效
    @Override
    public boolean shouldFilter() {
        return true;
    }

    //过滤器的具体逻辑根据业务自行编写。
    @Override
    public Object run() {
         RequestContext ctx = RequestContext.getCurrentContext();  
        HttpServletRequest request = ctx.getRequest();  
        String accessToken = String.valueOf(request.getParameter("Token"));  
        if(!accessToken.equals("zz")) {  
            ctx.setSendZuulResponse(false);  
            ctx.setResponseStatusCode();  
            return null;  
        }  
        return null; 
}
           

启动类如下:

package com.kl.getaway;

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


@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {

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

}
           

开启服务后如下图:

springcloud zuul网关对微服务路由及权限的控制

演示:

1 发送请求到service-kl(不带token):http://localhost:8761/service-kl/getNum?number=0

由于没有权限,页面跳转401页面。

2 发送请求到service-1(带token):http://localhost:8761/service-kl/getNum?number=1&Token=zz

返回方法运行结果

3 发送请求给service-2(带token):http://localhost:8761/client-kl/getNum?number=1&Token=zz

效果同上

getNum是service里定义的rest接口。

继续阅读