对于分布式系统来说,服务网关是不可或缺的部分,它具备了服务路由、负载均衡、权限控制等功能,为内部的所有微服务提供了一个前门保护的作用,spring cloud netflix的zuul就担任了这样一个角色。
1.新建工程,工程的pom文件追加依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dongjin.springcloud</groupId>
<artifactId>springcloud-root</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>springcloud-gateway</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- 路由网管zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
</project>
2.创建CatewayApplication.java程序,实例一个Filter
package com.dongjin.springcloud;
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;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy //zuul路由网关
public class CatewayApplication {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(CatewayApplication.class, args);
}
@Bean
public MyFilter accessFilter(){
return new MyFilter();
}
}
3.构建Filter的java程序
package com.dongjin.springcloud;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
/**
* Created by Administrator on 2018/3/8.
*/
public class MyFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre"; //定义filter的类型,有pre、route、post、error四种
}
@Override
public int filterOrder() {
return 0; //定义filter的顺序,数字越小表示顺序越高,越先执行
}
@Override
public boolean shouldFilter() {
return true; //表示是否需要执行该filter,true表示执行,false表示不执行
}
@Override
public Object run() {
RequestContext rt = RequestContext.getCurrentContext();
HttpServletRequest request = rt.getRequest();
Enumeration<String> parameterName = request.getParameterNames();
List<String> list = new ArrayList<>();
while (parameterName.hasMoreElements()) {
String name = parameterName.nextElement();
list.add(name);
System.out.println(name + ":" + request.getParameter(name));
}
if (list.size() <= 0) {
rt.setSendZuulResponse(false);
rt.setResponseBody("At least one parameter");
}
return null; // filter需要执行的具体操作
}
}
4.修改application.yml
server:
port: 8000
spring:
application:
name: springcloud-gateway
eureka:
instance:
instance-id: ${server.port}
client:
service-url:
defaultZone: http://admin:123@localhost:8888/eureka/
zuul:
routes:
springcloud-consumer:
path: api/consumer/**
serviceId: springcloud-consumer
springcloud-user:
path: /api/user/**
serviceId: springcloud-user
5.开始试验
过滤器正确的在调用前拦截了参数不正确
加上参数,能够正确的通过api调用到eureka上的服务
经过试验,zuul中自带了负载均衡ribbon和断路器hystrix,作为接口调用时不许用重新依赖打开。