什么是服务网关
通常情况,服务内部的各个进程是独立的,也就是每个服务都部署在不同的服务器上,如果外部服务需要访问内部的服务,每个请求都得必须通过网关服务。
为什么使用服务网关
如果一个项目有N个微服务,客户端完成一个请求可以需要调用n个微服务,一个一个打交道吗?这样肯定是不现实的,那么就需要一个角色充当request请求的统一入口,充当这个角色的就是Zuul网关,一旦有了网关,所有请求都通过网关,再由网关进行各个微服务的调用。
什么是Zuul
Zuul是Spring Cloud中所用的服务网关,是Netflix公司开源的一个API网关组件,Spring Cloud对其进行封装做到开箱即用,同时,Zuul还可以和Eureka、Ribbon、Hystrix等组件配合使用。在目前的网关解决方案里,有Nginx+Lua、Kong、Tyk。
Zuul的特点
一句话概括Zuul就是: 路由+过滤器=Zuul。所以Zuul的两大功能就是路由转发和过滤器。
路由转发的实现
1、添加Zuul依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2、配置bootstrap.yml文件,注册到8761Eureka Server上
spring:
application:
name: api-gateway
cloud:
config:
discovery:
enabled: true
service-id: CONFIG
profile: dev
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
3、在启动类添加@EnableZuulProxy注解,开启路由功能
@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
4、将api-gateway,product,config注册到同一个EurEka Server上
5、然后便可以通过网关Zool路由到其他服务
访问localhost:9090/product/product/list便可以路由到localhost:8085/product/list;
访问Localhost:9090/config/order-test.yml便可以路由到Localhost:8080/order-test.yml;
注:9090是网关服务端口,9090后边的product和config是服务名称
但是 这种方式,必须使用固定的方式,比如固定的服务名称,如果我們想將服务名称自定义的话,可以使用自定义路由
自定义路由
在配置文件添加Zuul即可
spring:
application:
name: api-gateway
cloud:
config:
discovery:
enabled: true
service-id: CONFIG
profile: dev
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
zuul:
routes:
myProduct:
path: /myProduct/** # /myProduct/product/list -> /product/product/list
serviceId: product
sensitiveHeaders: #不过滤到cookie,设置为空
#product: /myProduct/** #简洁写法
ignored-patterns: #排除某些路由
- /**/product/listForOrder
访问localhost:9090/myproduct/product/list便可以路由到localhost:8085/product/list;myproduct自定义的服务名称。
Zuul的四类过滤器API实践
四类过滤器
- 前置pre:路由请求前的加工–参数校验、限流、鉴权
- 路由 route:将http请求转发到服务
- 后置post:结果的加工 --统计、日志
4)错误error:上边三类过滤器发生异常后的处理