1 什么是网关
网关是一种可提供路由资源统一管理的工具, 将"1对N"问题 转换成了"1对1”问题。通过服务路由的功能,可以在对外提供服务时,只暴露 网关中配置的调用地址,而调用方就不需要了解后端具体的微服务主机。
有点Facade设计模式的感觉
服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用。
Zuul通过与Eureka的整合,将自身注册到服务中心,从而可以获到所有其他微服务实例信息。
作用:
- 服务路由
- 过滤器
- 负载均衡
- 权限控制
- ...
2 本文结构
下面进行实验,使用到的组件包括:Eureka、Feign、Zuul,包括以下四个项目:
- spring-zuul-server:Eureka服务器
- spring-zuul-member : 服务提供者,提供查询会员的信息服务
- spring-zuul-sale : 服务调用者,调用会员信息
- spring-zuul-gateway : Zuul网关
关于前三个项目本文不再多少,前面的文章中已解释
3 Zuul的基本使用
创建一个spring boot项目,pom文件中加入Zuul依赖和httpclient依赖,因为Zuul的底层是通过httpclient实现的
org.springframework.cloud
spring-cloud-starter-config
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-zuul
org.apache.httpcomponents
httpclient
4.5.2
添加启动类,增加注解@EnableEurekaClient标识该项目也为Eureka服务,增加注解@EnableZuulProxy开启网关代理功能
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class GatewayApp {
public static void main(String[] args) {
new SpringApplicationBuilder(GatewayApp.class).
web(true).run(args);
}
}
增加yml配置文件,先配置该项目使用端口,Eureka服务器地址,服务名称。然后配置Zuul路由信息,http://localhost:9000/sale/...的请求都会指向http://localhost:8081/...
server:
port: 9000
spring:
application:
name: spring-zuul-gateway
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
zuul:
routes:
sale:
path: /sale/**
serviceId: spring-zuul-sale
4 Zuul路由断点查看
可以通过向网关项目中引入Spring boot Actuator来查看网关中代理的所有信息,具体做法:
- pom文件中引入spring-boot-starter-actuator依赖
- 配置文件中增加management.security.enabled = false,关闭安全认证
org.springframework.boot
spring-boot-starter-actuator
1.5.3.RELEASE
management:
security:
enabled: false
然后访问:http://localhost:9000/routes,则会出现以下信息:
{
"/sale/**":"spring-zuul-sale",
"/spring-zuul-member/**":"spring-zuul-member",
"/spring-zuul-sale/**":"spring-zuul-sale"
}
参考:
- https://www.cnblogs.com/yjmyzz/p/spring-cloud-zuul-demo.html
- spring cloud入门指南
- https://github.com/Netflix/zuul
- http://www.ityouknow.com/springcloud/2018/01/20/spring-cloud-zuul.html