Spring Cloud 应用篇 之 Spring Cloud Zuul(一)路由功能

微服务架构中,是很多微小的服务组成,那么调用这些服务接口,如果直接调用每个服务提供的接口,是不现实的,这个时候我们就需要一个请求的统一入口,也就是服务网关,而 Spring Cloud 已为我们提供了 Zuul。

(一)简介

Zuul 的特点是路由+过滤器,核心是一系列的过滤器,Zuul 定义了四种过滤器

  • 前置(Pre)
  • 路由(Route)
  • 后置(Post)
  • 错误(Error)

Zuul 默认集成 Ribbon 实现了负载均衡的功能。

(二)创建 spring-cloud-gateway 模块

2.1 添加依赖,pom 文件:



    
        spring-cloud-componets
        com.geny
        1.0-SNAPSHOT
    
    4.0.0

    spring-cloud-gateway

    
        
            org.springframework.cloud
            spring-cloud-config-client
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-zuul
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

2.2 配置文件 bootstrap.yaml 如下:

server:
  port: 9001

spring:
  application:
    name: spring-cloud-gateway
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
management:
  endpoints:
    web:
      exposure:
        include: '*'

2.3 启动类

@SpringBootApplication
@EnableZuulProxy
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

在启动类上添加 @EnableZuulProxy 注解,开启 Zuul 的功能

2.4 启动相关服务

依次启动 eureka-server、spring-cloud-config、spring-demo-service、spring-cloud-gateway,访问 localhost:8761

Spring Cloud 应用篇 之 Spring Cloud Zuul(一)路由功能_第1张图片

可以看到,服务都已经注册到 eureka 中了

2.5 实现路由功能

在 spring-cloud-gateway 启动中,查看启动日志,截图如下

Spring Cloud 应用篇 之 Spring Cloud Zuul(一)路由功能_第2张图片

可以看到,/actuator/routes 这个被暴露的接口,我们访问 http://localhost:9001/actuator/routes

Spring Cloud 应用篇 之 Spring Cloud Zuul(一)路由功能_第3张图片

这个接口是可以查看所有的路由规则,按照上面这个路由的规则,我们访问一下 http://localhost:9001/spring-demo-service/port,结果如下

Spring Cloud 应用篇 之 Spring Cloud Zuul(一)路由功能_第4张图片

这说明路由功能已经起作用了,但是这个是按照 Zuul 的默认规则路由,不灵活,我们可以实现自定义的路由规则。

(三)自定义路由

自定义路由规则很简单,只需要在配置文件里进行一些配置即可,如下对 spring-demo-service 服务进行自定义路由规则:

server:
  port: 9001

spring:
  application:
    name: spring-cloud-gateway
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
management:
  endpoints:
    web:
      exposure:
        include: '*'
zuul:
  routes:
    demoService:
      path: /demoService/**
      serviceId: spring-demo-service

加了红色部分,即可自定义路由规则,以 /demoService/ 开头的请求都转发给 spring-demo-service 服务,重新启动 spring-cloud-gateway 服务,访问 http://localhost:9001/demoService/port


由此可见,我们自定义的路由规则也已生效,再次访问 http://localhost:9001/actuator/routes,可以看到,我们自定义的路由规则已在其中。

Spring Cloud 应用篇 之 Spring Cloud Zuul(一)路由功能_第5张图片

(四)隐藏接口功能

Zuul 可以路由接口服务,也可以让服务接口不暴露给外界调用,同样只需在配置文件里进行相应的配置即可。

server:
  port: 9001

spring:
  application:
    name: spring-cloud-gateway
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
management:
  endpoints:
    web:
      exposure:
        include: '*'
zuul:
  routes:
#    demoService:
#      path: /demoService/**
#      serviceId: spring-demo-service
    #简洁写法
    spring-demo-service: /demoService/**
  ignored-patterns:
    - /spring-demo-service/port

只需要配置上面红色部分,就可以让 /spring-demo-service/port 这个接口不能被外界访问,重启 spring-cloud-gateway,访问 http://localhost:9001/spring-demo-service/port,结果如下

Spring Cloud 应用篇 之 Spring Cloud Zuul(一)路由功能_第6张图片

返回状态 404,可见配置已经生效,但是这个时候,我们自定义的 /demoService/** 还能继续访问,访问 http://localhost:9001/demoService/port,结果如下


所以要想这个接口服务不能被调用,还要加上 /demoService/port

zuul:
  routes:
#    demoService:
#      path: /demoService/**
#      serviceId: spring-demo-service
    #简洁写法
    spring-demo-service: /demoService/**
  ignored-patterns:
    - /spring-demo-service/port
    - /demoService/port

再次访问 http://localhost:9001/demoService/port,结果如下

Spring Cloud 应用篇 之 Spring Cloud Zuul(一)路由功能_第7张图片

此时也返回 404,配置已生效。

Zuul 除了路由功能,还有过滤器功能,过滤功能在下一篇讲解。


源码下载:https://github.com/shmilyah/spring-cloud-componets


你可能感兴趣的:(Spring,Cloud,应用篇,Spring,Cloud,Finchley)