spring cloud的网关服务Zuul

傷城~ 2022-06-04 23:57 307阅读 0赞

微服务架构讲究系统的高内聚性,即只做该系统该做的事情,而其他的事情可以通过网关去做。spring cloud的zuul可以快速的搭建一个网关系统,其主要功能如下:
这里写图片描述
当加入了spring cloud的zuul后,架构图大致如下:
这里写图片描述

下面我们使用zuul来快速搭建一个官网系统


1.添加依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.5.4.RELEASE</version>
  5. </parent>
  6. <!-- 导入Spring Cloud的依赖管理 -->
  7. <dependencyManagement>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework.cloud</groupId>
  11. <artifactId>spring-cloud-dependencies</artifactId>
  12. <version>Dalston.SR3</version>
  13. <type>pom</type>
  14. <scope>import</scope>
  15. </dependency>
  16. </dependencies>
  17. </dependencyManagement>
  18. <dependencies>
  19. <dependency>
  20. <groupId>org.springframework.cloud</groupId>
  21. <artifactId>spring-cloud-starter-zuul</artifactId>
  22. </dependency>
  23. </dependencies>
  24. <build>
  25. <finalName>${project.artifactId}</finalName>
  26. <plugins>
  27. <!-- 资源文件拷贝插件 -->
  28. <plugin>
  29. <groupId>org.apache.maven.plugins</groupId>
  30. <artifactId>maven-resources-plugin</artifactId>
  31. <configuration>
  32. <encoding>UTF-8</encoding>
  33. </configuration>
  34. </plugin>
  35. <!-- java编译插件 -->
  36. <plugin>
  37. <groupId>org.apache.maven.plugins</groupId>
  38. <artifactId>maven-compiler-plugin</artifactId>
  39. <configuration>
  40. <source>1.8</source>
  41. <target>1.8</target>
  42. <encoding>UTF-8</encoding>
  43. </configuration>
  44. </plugin>
  45. </plugins>
  46. </build>

2.编写启动类

  1. @EnableZuulProxy
  2. @SpringBootApplication
  3. public class ApiGatewayApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ApiGatewayApplication.class, args);
  6. }
  7. }

3.编写yml配置文件

  1. server:
  2. port: 6677 #服务端口
  3. spring:
  4. application:
  5. name: spring-cloud-gateway #指定服务名
  6. zuul:
  7. routes:
  8. caclulate: #caclulate这个名字是任意写的
  9. path: /caclulate/** #配置请求URL的请求规则
  10. serviceId: com-spring-caclu #指定Eureka注册中心中的服务id
  11. eureka:
  12. client:
  13. registerWithEureka: true #是否将自己注册到Eureka服务中,默认为true
  14. fetchRegistry: true #是否从Eureka中获取注册信息,默认为true
  15. serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
  16. defaultZone: http://cloud:cloud@127.0.0.1:6868/eureka/
  17. instance:
  18. prefer-ip-address: true #将自己的ip地址注册到Eureka服务中

前往eureka的注册中心,我们发现该服务已经注册到该服务中心了。
此时,我们只需要访问/caclulate/**,该网关服务执行玩自己该做的事情之后,就会转发到对应的服务(com-spring-caclu)下面去执行目标代码。

上面配置文件中,转发路由的配置是比较常用的一种写法,也是比较好用的,它不会破坏Hystrix、Ribbon特性,下面还有几种配置路由的方式可以参考一下:

3.1 指定服务id

这里写图片描述

3.2 忽略指定服务

这里写图片描述

3.3 忽略所有服务,只是有路由指定

这里写图片描述

3.4 同时配置path和url

这里写图片描述

3.5 使用正则表达式指定路由规则

这里写图片描述

3.6 路由前缀

这里写图片描述

3.7 忽略某些路径

这里写图片描述


下面我们通过一个示例来演示一下zuul如何来使用
我们只需要创建一个类来继承ZuulFilter这个抽象类,并实现其4个抽象方法即可:

  1. 1shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true执行,返回false不执行。
  2. 2run:过滤器的具体业务逻辑。
  3. 3filterType:返回字符串代表过滤器的类型
  4. a)pre:请求在被路由之前执行
  5. b)routing:在路由请求时调用
  6. c)post:在routingerrror过滤器之后调用
  7. d)error:处理请求时发生错误调用
  8. filterOrder:通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高。

下面是一个实例代码:

  1. @Component //加入到Spring容器
  2. public class UserLoginZuulFilter extends ZuulFilter{
  3. @Override
  4. public boolean shouldFilter() {
  5. return true; // 该过滤器需要执行
  6. }
  7. @Override
  8. public Object run() { //编写业务逻辑
  9. RequestContext requestContext = RequestContext.getCurrentContext();
  10. HttpServletRequest request = requestContext.getRequest();
  11. String token = request.getParameter("token");
  12. if(StringUtils.isEmpty(token)){
  13. requestContext.setSendZuulResponse(false); // 过滤该请求,不对其进行路由
  14. requestContext.setResponseStatusCode(401); // 设置响应状态码
  15. return null;
  16. }
  17. return null;
  18. }
  19. @Override
  20. public String filterType() {
  21. return "pre"; // 设置过滤器类型为:pre
  22. }
  23. @Override
  24. public int filterOrder() {
  25. return 0;// 设置执行顺序
  26. }
  27. }

这个时候,当我们再次访问的时候,如果没有token这个参数,那么就会直接返回,并抛出401状态码。

发表评论

表情:
评论列表 (有 0 条评论,307人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring cloud服务Zuul

    微服务架构讲究系统的高内聚性,即只做该系统该做的事情,而其他的事情可以通过网关去做。spring cloud的zuul可以快速的搭建一个网关系统,其主要功能如下: ![这里