本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

springcloud 服务与服务之间实现灰度发布 基于Aspect

发布于2021-05-29 22:41     阅读(747)     评论(0)     点赞(20)     收藏(1)


灰度发布定义可查看我上一篇文章:基于zuul实现灰度发布

1、创建工程

创建三个工程:分别为:订单、eureka、user-server

(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.  
  5.     @Value("${server.port}")
  6.     private String port;
  7.     public static void main(String[] args) {
  8.         SpringApplication.run(OrderApplication.class, args);
  9.     }
  10.  
  11.     @RequestMapping
  12.     public String test(){
  13.         return "port:" + port;
  14.     }
  15. }

(2)eureka工程,就是一个普通的eureka server
(3)user-server工程

是另一个服务提供者。

调用关系图:

从图可看出use-server需要调用order服务。在调用接口时候需要实现灰度发布。

pom.xml配置如下:

  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.11.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.kingdee</groupId>
  12. <artifactId>user-server</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>user-server</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.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. <exclusions>
  34. <exclusion>
  35. <groupId>org.junit.vintage</groupId>
  36. <artifactId>junit-vintage-engine</artifactId>
  37. </exclusion>
  38. </exclusions>
  39. </dependency>
  40. <dependency>
  41. <groupId>io.jmnarloch</groupId>
  42. <artifactId>ribbon-discovery-filter-spring-cloud-starter</artifactId>
  43. <version>2.1.0</version>
  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>

启动类代码如下:

  1. @SpringBootApplication
  2. @RestController
  3. public class UserServerApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(UserServerApplication.class, args);
  6. }
  7. @LoadBalanced
  8. @Bean
  9. public RestTemplate restTemplate(){
  10. return new RestTemplate();
  11. }
  12. @RequestMapping
  13. public String test(){
  14. return "user-server";
  15. }
  16. }
使用切面编程,增加RequestAspect类:
  1. @Aspect
  2. @Component
  3. public class RequestAspect {
  4. @Pointcut("execution(* com.kingdee.userserver.controller..*Controller*.*(..))")
  5. private void anyMehtod() {
  6. }
  7. @Before(value = "anyMehtod()")
  8. public void before(JoinPoint joinPoint) {
  9. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  10. String version = request.getHeader("version");
  11. // 灰度规则 匹配的地方 查db,redis ====
  12. if (version.trim().equals("v2")) {
  13. RibbonFilterContextHolder.getCurrentContext().add("version", "v2");
  14. } else if (version.trim().equals("v1")) {
  15. RibbonFilterContextHolder.getCurrentContext().add("version", "v1");
  16. }
  17. }
  18. }

此时可看出被调用服务是需要配置元数据,可查看order的yml配置(order其实就是普通的一个基础服务,order其他配置可查看我的上一篇:基于zuul实现的灰度发布):

  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: server-order
  13. ---
  14. spring:
  15. profiles: 8081
  16. server:
  17. port: 8081
  18. eureka:
  19. instance:
  20. metadata-map:
  21. version: v2

controller类:

  1. @RestController
  2. @RequestMapping("/test")
  3. public class TestCallOrderController {
  4. @Autowired
  5. private RestTemplate restTemplate;
  6. @GetMapping("/call")
  7. public String testCall() {
  8. ResponseEntity<String> forEntity = restTemplate.getForEntity("http://SERVER-ORDER/order/getPort", String.class);
  9. String body = forEntity.getBody();
  10. return body;
  11. }
  12. }

yml配置文件:

  1. server:
  2. port: 8001
  3. eureka:
  4. client:
  5. service-url:
  6. defaultZone: http://localhost:7900/eureka
  7. spring:
  8. application:
  9. name: user-server

2、测试

使用http://localhost:8001/test/call访问order接口,且在header上配置version=v2,则系统会永远只访问order服务元数据配置了version: v2的服务,如果header中的version配置成v1,则只访问order服务元数据配置了version: v1的服务,其他情况则使用默认的负载均衡规则(轮询)。

 

如果有问题,欢迎大家留言,一起探讨,一起进步。

 



所属网站分类: 技术文章 > 博客

作者:程序员之神

链接:http://www.javaheidong.com/blog/article/207642/4ade235184c4663cdb03/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

20 0
收藏该文
已收藏

评论内容:(最多支持255个字符)