前提:
1.eureka-server注册服务中心。
2.准备两个服务提供者,分别在端口8090,8091
3.启动Eureka服务器和两个服务提供者,访问http://localhost:8761/,如下图
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TUNh3ZE1keNpXT3lFRidHbzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYvwFd4VGdvwlMvw1ayFWbyVGdhd3P1EjNyITNzETNyYDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
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);
}
}
开启服务后如下图:
演示:
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接口。