Spring Cloud的Web项目中如何使用Zuul

66次阅读
没有评论

共计 3038 个字符,预计需要花费 8 分钟才能阅读完成。

这篇文章给大家分享的是有关 Spring Cloud 的 Web 项目中如何使用 Zuul 的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。

Web 项目中使用 Zuul 关于 Zuul

 Spring Cloud 集群提供了多个组件,用于进行集群内部的通信,例如服务管理组件 Eureka,负载均衡组件 Ribbon。如果集群提供了 API 或者 Web 服务,需要与外部进行通信,比较好的方式是添加一个网关,将集群的服务都隐藏到网关后面。这样的做法,对于外部客户端来说,无需关心集群的内部结构,只需关心网关的位置等信息;对于 Spring Cloud 集群来说,不必过多的暴露服务,提升了集群的安全性。

  代理层作为应用集群的大门,在技术选取上尤为重要,很多传统的解决方案,在软件上选择了 Nginx、Apache 等服务器。Netflix 提供了自己的解决方案:Zuul。Zuul 是 Netflix 的一个子项目,Spring Cloud 将 Zuul 做进一步的实现与封装,整合到 spring-netflix 项目中,为微服务集群提供过代理、过滤、路由等功能。

Web 项目整合 Zuul

  新建一个名称为“first-router”的 Maven 项目,项目使用的依赖如下:

  dependency 
  groupId org.springframework.cloud /groupId 
  artifactId spring-cloud-starter-zuul /artifactId 
  /dependency 
  dependency 
  groupId org.apache.httpcomponents /groupId 
  artifactId httpclient /artifactId 
  version 4.5.3 /version 
  /dependency

  需要加入“spring-cloud-starter-zuul”的依赖,由于 Zuul 底层使用了 HttpClient,因此还要加入相应的依赖。为了能让 Web 项目开启对 Zuul 的支持,在应用类中加入 @EnableZuulProxy 注解,请见代码清单 7 -1。

  代码清单 7 -1:

 codes\07\02\first-router\src\main\java\org\crazyit\cloud\GatewayApplication.java

@EnableZuulProxy
@SpringBootApplication
public class GatewayApplication { public static void main(String[] args) { new SpringApplicationBuilder(GatewayApplication.class).properties(  server.port=8080).run(args);
 }
}

  注意该项目的启动端口为 8080。完成以上工作后,一个拥有 Zuul 功能的 Web 项目已经建立,接下来,将测试它的路由功能。

测试路由功能

  前一小节已经建立了路由器项目,接下来建立源服务的项目,测试例子的结构请见图 7 - 1 所示。

图 7 -1 测试例子结构图

  新建名称为“book-server”的 Maven 项目,该项目是一个最普通的 Spring Boot 项目,使用以下的依赖:

  dependency 
  groupId org.springframework.boot /groupId 
  artifactId spring-boot-starter-web /artifactId 
  version 1.5.4.RELEASE /version 
  /dependency

  为“book-server”添加一个“/hello”的服务,项目的启动类以及控制器,请见代码清单 7 -2。

  代码清单 7 -2:codes\07\02\book-server\src\main\java\org\crazyit\cloud\BookApplication.java

@SpringBootApplication
@RestController
public class BookApplication { @RequestMapping(value =  /hello/{name} , method = RequestMethod.GET) public String hello(@PathVariable String name) {
 return  hello   + name;
 }
 public static void main(String[] args) { new SpringApplicationBuilder(BookApplication.class).properties(  server.port=8090).run(args);
 }
}

  为了简单起见,本例将启动类与控制器写到一起,注意“book-server”的端口为 8090。在控制器中,建立了一个“/hello/{name}”的服务,成功调用后,会返回相应的字符串。接下来,修改“first-router”项目的配置文件,让其进行转发工作。

  修改“first-router”项目的 application.yml 文件,加入以下内容:

zuul: 
 routes:
 books:
 url: http://localhost:8090

  加入以上配置后,发送给 http://localhost:8080/books 的所有请求,都会被转发到 8090 端口,也就是访问“first-router”项目,实际上最终会调用“book-server”的服务。启动两个应用,在浏览器中输入以下地址:http://localhost:8080/books/hello/crazyit,可以看到浏览器输出如下:

hello crazyit

  根据输出结果可知,发送的请求已经被转发到“book-server”进行处理。

过滤器运行机制

  前面例子的路由项目,我们使用了 @EnableZuulProxy 注解,开启该注解后,在 Spring 容器初始化时,会将 Zuul 的相关配置初始化,其中包含一个 Spring Boot 的 bean:ServletRegistrationBean,该类主要用于注册 Servlet。Zuul 提供了一个 ZuulServlet 类,在 Servlet 的 service 方法中,执行各种 Zuul 过滤器(ZuulFilter)。图 7 - 2 为 HTTP 请求在 ZuulServlet 中的生命周期。

图 7 -2 HTTP 请求的生命周期

 ZuulServlet 的 service 方法接收到请求后,会执行“pre”阶段的过滤器,再执行“routing”阶段的过滤器,最后执行“post”阶段的过滤器。其中“routing”的过滤器,会将请求转发到“源服务”,源服务可以是第三方的 Web 服务,也可以是 Spring Cloud 的集群服务。在执行 pre 和 routing 阶段的过滤器时,如果出现异常,则会执行“error”过滤器。整个过程的 HTTP 请求、HTTP 响应、状态等数据,都会封装到一个 RequestContext 的对象中,这将在后面章节中讲述。

感谢各位的阅读!关于“Spring Cloud 的 Web 项目中如何使用 Zuul”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计3038字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)