我们为什么要构建 Zuul?

Netflix API 流量的数量和多样性有时会导致生产问题在没有警告的情况下迅速出现。我们需要一个允许我们快速改变行为以应对这些情况的系统。
Zuul 使用一系列不同类型的过滤器,使我们能够快速灵活地将功能应用到我们的边缘服务。这些过滤器帮助我们执行以下功能:

  • 身份验证和安全性 - 确定每个资源的身份验证要求并拒绝不满足要求的请求。
  • 洞察力和监控 - 在边缘跟踪有意义的数据和统计数据,以便为我们提供准确的生产视图。
  • 动态路由 - 根据需要将请求动态路由到不同的后端集群。
  • 压力测试 - 逐渐增加集群的流量以衡量性能。
  • 减载 - 为每种类型的请求分配容量并丢弃超出限制的请求。
  • 静态响应处理 - 直接在边缘构建一些响应,而不是将它们转发到内部集群
  • 多区域弹性 - 跨 AWS 区域路由请求,以使我们的 ELB 使用多样化并使我们的优势更接近我们的成员

以父工程SpringCloud创建zuul子工程

image.png

导入相关jar包至pom文件

  1. <?xml version="1.0"?>
  2. <project
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
  4. xmlns="http://maven.apache.org/POM/4.0.0"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  6. <modelVersion>4.0.0</modelVersion>
  7. <parent>
  8. <groupId>com.junjay</groupId>
  9. <artifactId>SpringCloud</artifactId>
  10. <version>0.0.1-SNAPSHOT</version>
  11. </parent>
  12. <groupId>com.junjay</groupId>
  13. <artifactId>springcloud-zuul-9527</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <name>springcloud-zuul-9527</name>
  16. <url>http://maven.apache.org</url>
  17. <properties>
  18. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>junit</groupId>
  23. <artifactId>junit</artifactId>
  24. <scope>test</scope>
  25. </dependency>
  26. <!-- 消费者只需要实体类+web -->
  27. <dependency>
  28. <groupId>com.junjay</groupId>
  29. <artifactId>springcloud-pai</artifactId>
  30. <version>0.0.1-SNAPSHOT</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-web</artifactId>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.mybatis.spring.boot</groupId>
  38. <artifactId>mybatis-spring-boot-starter</artifactId>
  39. </dependency>
  40. <!-- 热部署工具 -->
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-devtools</artifactId>
  44. </dependency>
  45. <!-- 添加负载均衡Ribbon依赖 -->
  46. <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon -->
  47. <dependency>
  48. <groupId>org.springframework.cloud</groupId>
  49. <artifactId>spring-cloud-starter-ribbon</artifactId>
  50. <version>1.4.6.RELEASE</version>
  51. </dependency>
  52. <!-- 加入eureka依赖进行服务注册 -->
  53. <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
  54. <dependency>
  55. <groupId>org.springframework.cloud</groupId>
  56. <artifactId>spring-cloud-starter-eureka</artifactId>
  57. <version>1.4.6.RELEASE</version>
  58. </dependency>
  59. <!-- 增加hystrix依赖 -->
  60. <dependency>
  61. <groupId>org.springframework.cloud</groupId>
  62. <artifactId>spring-cloud-starter-hystrix</artifactId>
  63. <version>1.4.6.RELEASE</version>
  64. </dependency>
  65. <!-- 增加dashboard依赖 -->
  66. <dependency>
  67. <groupId>org.springframework.cloud</groupId>
  68. <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
  69. <version>1.4.6.RELEASE</version>
  70. </dependency>
  71. <!-- 增加zuul配置 -->
  72. <dependency>
  73. <groupId>org.springframework.cloud</groupId>
  74. <artifactId>spring-cloud-starter-zuul</artifactId>
  75. <version>1.4.6.RELEASE</version>
  76. </dependency>
  77. </dependencies>
  78. </project>

配置yml文件配置zuul

  1. server:
  2. port: 9527
  3. #spring配置
  4. spring:
  5. application:
  6. name: springcloud-zuul-geteway
  7. #eureka 的配置
  8. eureka:
  9. client:
  10. service-url:
  11. # 服务注册到哪里 打开eureka服务配置以配置中的地址为准
  12. # eureka配置好之后,开启eureka功能注解
  13. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7001.com:7002/eureka,http://eureka7001.com:7003/eureka
  14. instance:
  15. # 修改eureka——Status up 描述
  16. instance-id: zuul9527.com
  17. prefer-ip-address: true
  18. # actuator 监控配置
  19. info:
  20. app.name: junjay.com
  21. company.name: blog.junjay.com
  22. # 服务开发者名称(作者)
  23. author: junjay

编写启动类开启@EnableZuulProxy

  1. package org.springcloud.zuul;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  6. import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
  7. @SpringBootApplication
  8. @EnableZuulProxy // 开启zuul代理
  9. @EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
  10. public class ZuulApplication_9527 {
  11. public static void main(String[] args) {
  12. SpringApplication.run(ZuulApplication_9527.class, args);
  13. }
  14. }

在C:\Windows\System32\drivers\etc添加zuul地址

  1. 0.0.0.0 account.jetbrains.com
  2. 127.0.0.1 activate.navicat.com
  3. 127.0.0.1 eureka7001.com
  4. 127.0.0.1 eureka7002.com
  5. 127.0.0.1 eureka7003.com
  6. 127.0.0.1 www.junjay.com

启动服务集群,服务提供者

image.png
image.png
image.png

使用zuul访问

http://www.junjay.com:9527 zuul
springcloud-provider-dept 服务地址
dept/queryById/1 接口访问地址
http://www.junjay.com:9527/springcloud-provider-dept**/**dept/queryById/1
访问不在需要使用服务端地址,以zuul配置地址隐藏服务地址和端口
image.png

修改zuul配置完全隐藏服务端信息

  1. server:
  2. port: 9527
  3. #spring配置
  4. spring:
  5. application:
  6. name: springcloud-zuul-geteway
  7. #eureka 的配置
  8. eureka:
  9. client:
  10. service-url:
  11. # 服务注册到哪里 打开eureka服务配置以配置中的地址为准
  12. # eureka配置好之后,开启eureka功能注解
  13. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7001.com:7002/eureka,http://eureka7001.com:7003/eureka
  14. instance:
  15. # 修改eureka——Status up 描述
  16. instance-id: zuul9527.com
  17. prefer-ip-address: true
  18. # actuator 监控配置
  19. info:
  20. app.name: junjay.com
  21. company.name: blog.junjay.com
  22. # 服务开发者名称(作者)
  23. author: junjay
  24. # zuul 配置
  25. zuul:
  26. routes:
  27. # 原来要用springcloud-provider-dept 现在可以使用/mydept 代替微服务名称
  28. provider:
  29. path: /mydept/**
  30. url: springcloud-provider-dept

配置zuul,使其完全隐藏

http://www.junjay.com:9527/mydept/dept/queryById/1
image.png
现在是俩个路径都可以访问,设置zuul不在使用原项目路径访问

  1. # zuul 配置
  2. zuul:
  3. ignored-services: springcloud-provider-dept #不能再使用本服务路径访问,ignored忽略
  4. routes:
  5. # 原来要用springcloud-provider-dept 现在可以使用/mydept 代替微服务名称
  6. provider:
  7. path: /mydept/**
  8. url: springcloud-provider-dept

image.png
仅仅可用配置的访问路径访问
image.png

  1. # 配置ignored-patterns之后 使用 http://localhost:9100/suibian/send/msg 不可以访问,
  2. # 其他的 /mytttttt/send/msg,/mysuibian/send/msg,/service-sms/send/msg都可以访问
  3. ignored-patterns: /**/suibian/**
  4. #配置prefix之后,所有的请求都需要加上/api才能访问,
  5. #/mytttttt/send/msg,/mysuibian/send/msg,/service-sms/send/msg无法访问,
  6. #需要使用/api/mytttttt/send/msg,/api/service-sms/send/msg进行访问
  7. prefix: /api