第一节,为什么要用网关?它解决了什么问题?
第二节,编写网关的入门例子
(1)在e-book模块下新建子模块zuul,在pom文件中加入eureka的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
(2)在zuul模块下新建maven项目,命名为zuul-gateway。
(3)修改pom文件,加入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
(4)添加一个配置文件application.properties,加入如下配置:
spring.application.name=zuul-gateway
server.port=8114
eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/
(5)添加一个启动类。
package com.twf.zuul.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
(6)启动该项目,并且启动ProductCoreApplication。
(7)先用浏览器访问http://localhost:8088/product/list,结果如下:
(8)然后通过网关访问这个接口,浏览器访问http://localhost:8114/e-book-product/product/list,结果和上面的一样。
(这个例子是由网关的IP端口加微服务的应用名及具体接口路径组成)
第三节,路由器的4种规则方法
(1)在zuul模块下新建maven项目,命名为zuul-gateway-route,拷贝zuul-gateway的文件和代码到该项目。
(2)修改配置文件。这里总共介绍了7种方式,每试一种就解开这一种的注释,然后注释其他的配置。
spring.application.name=zuul-gateway-route
server.port=8115
eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/
#默认是hostname 注册,改成IP 注册
eureka.instance.perferIpAddress=true
## 1 ###################### 路由指定:URL指定 #############################
## URL匹配关键字,如果包含关键字就跳转到指定的URL中
#zuul.routes.book-product.path=/book-product/**
#zuul.routes.book-product.url=http://127.0.0.1:8088/
## 2 ###################### 路由指定:服务指定1 #############################
##将路径的/book-product/引到 eureka的e-book-product服务上
##规则:zuul.routes.路径名.path
##规则:zuul.routes.路径名.serviceId=eureka的服务名
##http://127.0.0.1:9010/book-product/product/list
##等同于
##http://127.0.0.1:9010/e-book-product/product/list
#zuul.routes.book-product.path=/book-product/**
#zuul.routes.book-product.serviceId=e-book-product
## 3 ###################### 路由指定:服务指定1 #############################
#zuul.routes后面跟着的是服务名,服务名后面跟着的是路径规则,这种配置方式更简单。
#zuul.routes.e-book-product.path=/book-product/**
## 4 ###################### 路由排除:排除某几个服务 #############################
##排除后,这个地址将为空 http://127.0.0.1:9010/e-book-product/product/list
## 多个服务逗号隔开
#zuul.ignored-services=e-book-product
## 5 ###################### 路由排除:排除所有服务 #############################
#由于服务太多,不可能手工一个个加,故路由排除所有服务,然后针对要路由的服务进行手工加
#zuul.ignored-services=*
#zuul.routes.e-book-consumer-hystrix.path=/book-consumer/**
## 6 ###################### 路由排除:排除指定关键字的路径 #############################
# 排除所有包括/list/的路径
#zuul.ignored-patterns=/**/list/**
#zuul.routes.e-book-product.path=/book-product/**
## 7 ###################### 路由添加前缀:为所有路径添加前缀 #############################
##http://127.0.0.1:9010/book-product/product/list
##必须改成
##http://127.0.0.1:9010/api/book-product/product/list
#zuul.prefix=/api
#zuul.routes.e-book-product.path=/book-product/**
第四节,如何定义自己的过滤器
(1)在zuul模块下新建maven项目,命名为zuul-gateway-filter。
(2)修改配置文件,添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
(3)修改配置文件,添加如下配置:
spring.application.name=zuul-gateway-filter
server.port=8117
eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/
(4)添加一个过滤类。
package com.twf.zuul.gateway.filter.filter;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
@Component
public class LogFilter extends ZuulFilter{
private static final Logger logger = LoggerFactory.getLogger(LogFilter.class);
/**
* 是否开启过滤器,默认为false,不开启。我们现在开启它,就设为true。
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 过滤器的作用,打印请求的信息
*/
@Override
public Object run() {
RequestContext rc=RequestContext.getCurrentContext();
HttpServletRequest request=rc.getRequest();
logger.info("method={},url={}",request.getMethod(),request.getRequestURL().toString());
return null;
}
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
}
(5)添加一个启动类。
package com.twf.zuul.gateway.filter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy
public class ZuulFilterApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulFilterApplication.class, args);
}
}
(6)启动该项目,然后启动ProductCoreApplication。
(7)浏览器访问http://localhost:8117/e-book-product/product/findAllProduct,后台过滤日志打印如下:
第五节,过滤器有哪些类型?它有何用?
源码点这里。