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/ 如图表示服务注册成功
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页面。
4.2 发送请求到service-1(带token):http://localhost:100/service-1/plus?number=1&Token=zz
4.3 发送请求给service-2(带token):http://localhost:100/service-2/plus?number=1&Token=zz
效果同上
4.4 plus是我service里定义的rest接口,对应一个+1的方法。如果你自己定义了方法,改成了你的映射就可以了。