在传统的网站中,我们还会引入如Nginx、F5的网关功能。网关的功能对于分布式网站是十分重要的,首先它可以将请求路由到真实的服务器上,进而保护真实服务器的IP地址,避免直接地攻击真实服务器;其次它也可以作为一种负载均衡的手段,使得请求按照一定的算法平摊到多个节点上,减缓单点的压力;最后它还能提供过滤器,过滤器的使用可以判定请求是否为有效请求,一旦判定失败,就可以将请求阻止,避免发送到真实的服务器,这样就能降低真实服务器的压力。
在Spring Cloud的组件中,Zuul是支持API网关开发的组件,首先来搭建一个最简单的zuul网关
新建项目,添加zuul组件
在pom文件中添加的组件表示为
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
然后在main函数中启动网关
添加yml配置文件
server:
port: 80
spring:
application:
name: zuul
eureka:
client:
service-url:
defaultZone: http://peer2:8002/eureka/
这里端口直接配置为80
基础网管配置就完成了,我们首先通过初始方式来访问product节点下的getUser服务,访问地址为:
http://192.168.1.129:9001/product/getUser/1
需要注意这里的组成,http://192.168.1.129:9001/这是我们的访问主机地址+端口号,/product/getUser/1这里是访问具体路径,我们在代码中这样配置的
访问结果成功:
我们启动zuul网关,然后现在我们的zuul(我们的网关配置为80端口,所以不需要输入端口号了)
我们依旧访问上边的product下边的getuser服务,不过这次以zuul的方式去访问(通过80端口),但是现在需要在原来的基础上修改下访问路径了
访问路径为:
http://127.0.0.1/product/product/getUser/1
这里的访问规则为:<主机:端口>/节点名称/访问路径
我们的zuul走的是80端口,所以这里不需要写端口号,第一个/product是指要访问product节点下边的请求,最后的/product/getUser/1是指需要访问这个具体路径
我们对比一下
1:这是直接访问product节点
2:这是访问zuul
这样就完成了一个基础网关的配置了
除此之外,Zuul也允许配置请求映射,在Zuul中有面向传统网关的配置方式,也有面向服务的配置方式(推荐使用这种方式,可以隐藏真实的访问地址)
代码如下:
# 指定ANT风格的URL匹配
zuul.routes.user-service.path=/u/**
# 指定映射的服务用户地址,这样Zuul就会将请求转发到用户微服务上了
zuul.routes.user-service.url=http://localhost:8001/
这种方式将http://localhost:8001/这个请求路径下的所有请求都转向了/u/** 这种路径,我们要访问user节点下边的的请求可以这样
http://127.0.0.1/u/pro/getUserById?id=1
但是这种方式是硬性指向了8001这个端口,所以做不了负载均衡
推荐下边这种方式:
zuul:
routes:
product-service:
path: /p/**
serviceId: product
现在去使用zuul网关访问就是:
http://127.0.0.1/p/pro/getUserById?id=1
这样简约多了
注意点:我们看在启动文件中添加的这个注解:@EnableZuulProxy
点进去看到源代码:
@EnableCircuitBreaker
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({ZuulProxyMarkerConfiguration.class})
public @interface EnableZuulProxy {
}
发现这个位置使用了@EnableCircuitBreaker,也就是我们的段容器,所以这里需要配置一下短融相关的(上面一章有这个类容)