欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Springcloud学习——Zuul服务网关及路由权限控制

程序员文章站 2022-06-21 14:31:19
...

1. Github项目地址 https://github.com/zengzhen1994/springboot-learning (选择Springcloud/Springcloud-learning-2)

2. 准备工作

2.1 Eureka服务器用来注册服务,如果还没有搭建,点击这里

2.2 准备两个服务提供者,分别在端口78,79

2.3 开启服务提供者和Eureka服务器,访问 http://localhost:81/ 如图表示服务注册成功

Springcloud学习——Zuul服务网关及路由权限控制

3. Zuul服务网关搭建

在之前的pom.xml中加入zuul所需的jar包,如下

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-zuul</artifactId>
		</dependency>
编写一个zuul过滤器,用来控制权限。每次发送请求的时候都需要一个token,如果没有token就没有权限,在被路由之前过滤器就会自动拦截掉返回401错误。
package com.zz.springcloud.zuulfilter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import javax.servlet.http.HttpServletRequest;

public class Filter extends ZuulFilter  {

	/**
	 * 返回一个字符串代表过滤器的类型
	 * pre表示被路由之前
	 */
    @Override
    public String filterType() {
        return "pre";
    }

	/**
	 * 过滤顺序
	 */

    @Override
    public int filterOrder() {
        return 0;
    }

    @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(401);
            return null;
        }
        return null;
    }

}
写完过滤器之后,以bean的形式导入到主程序,并开启zuul网关服务。

package com.zz.springcloud;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;

import com.zz.springcloud.zuulfilter.Filter;

@EnableZuulProxy
@SpringCloudApplication
public class GateWayApplication {

	public static void main(String[] args) {
		new SpringApplicationBuilder(GateWayApplication.class).web(true).run(args);
	}

	@Bean
	public Filter getFilter() {
		return new Filter();
	}

}
到这里,网关服务和权限过滤就搭建好了。还需要更改配置,让zuul去管理各个服务。

修改application.properties如下

spring.application.name=Service-Gateway
server.port=100

# routes to service1
zuul.routes.service1.path=/service-1/**
zuul.routes.service1.serviceId=eureka-service-1
# routes to service2
zuul.routes.service2.path=/service-2/**
zuul.routes.service2.serviceId=eureka-service-2
eureka.client.serviceUrl.defaultZone=http://localhost:81/eureka/
serviceId指向你之前建立服务的application name,这样就可以通过链接映射到服务上,启动网关

4. 运行演示

4.1 发送请求到service-1(不带token):http://localhost:100/service-1/plus?number=0

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

Springcloud学习——Zuul服务网关及路由权限控制

4.2 发送请求到service-1(带token):http://localhost:100/service-1/plus?number=1&Token=zz

Springcloud学习——Zuul服务网关及路由权限控制

4.3 发送请求给service-2(带token):http://localhost:100/service-2/plus?number=1&Token=zz

效果同上

4.4 plus是我service里定义的rest接口,对应一个+1的方法。如果你自己定义了方法,改成了你的映射就可以了。