当前位置:   article > 正文

基于zuul实现灰度发布_zuul灰度发布功能实现

zuul灰度发布功能实现

目录

1、定义

2、创建工程

(1)order服务

(2)eureka工程,就是一个普通的eureka server。

(3)zuul,网关

3、测试


 


1、定义

灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。(百度来的)

 

2、创建工程

创建三个工程:分别为:订单、eureka、zuul

订单作为提供服务方,eureka作为注册中心,zuul作为网关。

具体创建就不在此详细赘述了。

(1)order服务

order服务提供方,提供两个服务,端口分别为:8080、8081,配置如下:

  1. server:
  2. port: 8080
  3. eureka:
  4. instance:
  5. metadata-map:
  6. version: v1
  7. client:
  8. service-url:
  9. defaultZone: http://localhost:7900/eureka
  10. spring:
  11. application:
  12. name: order
  13. ---
  14. spring:
  15. profiles: 8081
  16. server:
  17. port: 8081
  18. eureka:
  19. instance:
  20. metadata-map: #自定义元数据区
  21. version: v2

order服务为了测试只提供一个controller,打印出各自的端口,代表访问到不同的机器。如下:

  1. @SpringBootApplication
  2. @RestController
  3. public class OrderApplication {
  4. @Value("${server.port}")
  5. private String port;
  6. public static void main(String[] args) {
  7. SpringApplication.run(OrderApplication.class, args);
  8. }
  9. @RequestMapping
  10. public String test(){
  11. return "port:" + port;
  12. }
  13. }

(2)eureka工程,就是一个普通的eureka server。

(3)zuul,网关

      yml配置:

  1. server:
  2. port: 9100
  3. spring:
  4. application:
  5. name: zuul-gray
  6. eureka:
  7. client:
  8. service-url:
  9. defaultZone: http://localhost:7900/eureka
  10. instance:
  11. hostname: localhost
  12. instance-id: zuul-gray

pom.xml:需要引入eureka客户端、zuul、ribbon-discovery-filter-spring-cloud-starter这三个。

ribbon-discovery-filter-spring-cloud-starter主要用于网关选择集群中的某一个节点。主要方法是RibbonFilterContextHolder.getCurrentContext().add("version","v2");(详情见java代码)
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.3.10.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.kingdee</groupId>
  12. <artifactId>zuul</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>zuul</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Hoxton.SR11</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>io.jmnarloch</groupId>
  31. <artifactId>ribbon-discovery-filter-spring-cloud-starter</artifactId>
  32. <version>2.1.0</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-test</artifactId>
  37. <scope>test</scope>
  38. <exclusions>
  39. <exclusion>
  40. <groupId>org.junit.vintage</groupId>
  41. <artifactId>junit-vintage-engine</artifactId>
  42. </exclusion>
  43. </exclusions>
  44. </dependency>
  45. </dependencies>
  46. <dependencyManagement>
  47. <dependencies>
  48. <dependency>
  49. <groupId>org.springframework.cloud</groupId>
  50. <artifactId>spring-cloud-dependencies</artifactId>
  51. <version>${spring-cloud.version}</version>
  52. <type>pom</type>
  53. <scope>import</scope>
  54. </dependency>
  55. </dependencies>
  56. </dependencyManagement>
  57. <build>
  58. <plugins>
  59. <plugin>
  60. <groupId>org.springframework.boot</groupId>
  61. <artifactId>spring-boot-maven-plugin</artifactId>
  62. </plugin>
  63. </plugins>
  64. </build>
  65. </project>

java代码:

  1. package com.kingdee.zuul.filter;
  2. import com.netflix.zuul.ZuulFilter;
  3. import com.netflix.zuul.context.RequestContext;
  4. import com.netflix.zuul.exception.ZuulException;
  5. import io.jmnarloch.spring.cloud.ribbon.support.RibbonFilterContextHolder;
  6. import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
  7. import org.springframework.stereotype.Component;
  8. import javax.servlet.http.HttpServletRequest;
  9. /**
  10. * @author :zhouhaitao
  11. * @date :Created in 2021/5/20 23:39
  12. * @description
  13. * @modified By:
  14. * @version: v1.0
  15. */
  16. @Component
  17. public class GrayFilter extends ZuulFilter {
  18. @Override
  19. public String filterType() {
  20. return FilterConstants.ROUTE_TYPE;
  21. }
  22. @Override
  23. public int filterOrder() {
  24. return 0;
  25. }
  26. @Override
  27. public boolean shouldFilter() {
  28. return true;
  29. }
  30. @Override
  31. public Object run() throws ZuulException {
  32. RequestContext currentContent = RequestContext.getCurrentContext();
  33. HttpServletRequest request = currentContent.getRequest();
  34. String userId = request.getHeader("userId");
  35. //根据用户Id查规则
  36. if("1".equals(userId)){
  37. RibbonFilterContextHolder.getCurrentContext().add("version","v2");
  38. }else{
  39. RibbonFilterContextHolder.getCurrentContext().add("version","v1");
  40. }
  41. return null;
  42. }
  43. }

 主逻辑在run()方法中控制,目前代码中的逻辑是,如果header中userId,设置值为1则走order 服务中元数据设置了version: v2的服务。

3、测试

使用postman测试

直接访问8080端口服务结果:

直接访问8081端口服务结果:

使用zuul header传入userId=1访问结果:

使用zuul header传入userId !=1 访问结果:

多次访问发现结果都一样,说明配置的灰度发布成功了。

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号