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的方法。如果你自己定义了方法,改成了你的映射就可以了。