Skip to content

Spring Cloud Greenwich 版本

官方介绍

Spring Cloud Greenwich 是 Spring Cloud 的一个重大更新版本,于 2019 年初发布。该版本专注于微服务架构中的服务发现、配置管理、负载均衡、断路器等核心组件,提供了完整的微服务解决方案。

Spring Cloud Greenwich 基于 Spring Boot 2.1.x 构建,引入了多项新特性和改进,增强了对云原生应用的支持。

版本特性

1. Spring Cloud Gateway

  • 基于 Spring WebFlux 的响应式 API 网关
  • 支持路由匹配、过滤器链、负载均衡等功能
  • 性能比 Zuul 2.x 更高

2. Spring Cloud Config 增强

  • 支持多个后端存储库配置
  • 更灵活的属性覆盖机制
  • 增强的安全性支持

3. Spring Cloud Sleuth 升级

  • 更好的分布式追踪支持
  • 与 Zipkin 集成更紧密
  • 提供更好的性能监控

4. Spring Cloud Circuit Breaker

  • 新增通用断路器抽象
  • 支持 Resilience4j 和 Hystrix
  • 更简单的断路器使用方式

5. Spring Cloud Security

  • OAuth2 客户端支持增强
  • 更好的 JWT 支持
  • 统一的安全配置模型

官方获取地址

Maven 依赖

xml
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR6</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Gradle 依赖

gradle
dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:Greenwich.SR6"
    }
}

官方文档

环境要求

  • Java 8 或更高版本
  • Spring Boot 2.1.x
  • Maven 3.3+ 或 Gradle 4.10+
  • 推荐使用 Spring Boot 2.1.18.RELEASE 以获得最佳兼容性

部署方法

1. 创建 Spring Cloud 项目

bash
# 使用 Spring Initializr 创建项目
curl https://start.spring.io/starter.tgz \
  -d groupId=com.example \
  -d artifactId=spring-cloud-gateway-service \
  -d name=gateway-service \
  -d packaging=jar \
  -d bootVersion=2.1.18.RELEASE \
  -d javaVersion=8 \
  -d language=java \
  -d type=maven-project \
  -d baseDir=gateway-service \
  -d packageName=com.example \
  -d dependencies=cloud-eureka,cloud-config-client,cloud-gateway \
  | tar -xzvf -

2. 配置 Eureka 服务注册中心

java
package com.example.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

application.yml:

yaml
server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enable-self-preservation: false

3. 配置服务网关

java
package com.example.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("user_service", r -> r.path("/users/**")
                        .uri("http://user-service:8080"))
                .route("order_service", r -> r.path("/orders/**")
                        .uri("http://order-service:8081"))
                .build();
    }
}

4. 部署到容器

Dockerfile:

dockerfile
FROM openjdk:8-jre-alpine
VOLUME /tmp
COPY target/gateway-service.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
bash
# 构建 Docker 镜像
docker build -t spring-cloud-gateway:Greenwich .

# 运行服务
docker run -d -p 8080:8080 spring-cloud-gateway:Greenwich

二次开发

1. 自定义路由过滤器

java
package com.example.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;

@Component
public class CustomRequestFilter extends AbstractGatewayFilterFactory<CustomRequestFilter.Config> {

    public CustomRequestFilter() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest().mutate()
                    .header("X-Custom-Header", config.getValue())
                    .build();

            return chain.filter(exchange.mutate().request(request).build());
        };
    }

    public static class Config {
        private String value;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}

2. 自定义负载均衡策略

java
package com.example.gateway.lb;

import org.springframework.cloud.gateway.config.LoadBalancerProperties;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@Configuration
public class CustomLoadBalancerConfig {

    @Bean
    public ReactorLoadBalancer<ServiceInstance> customLoadBalancer(Environment environment,
                                                                   LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new CustomRoundRobinLoadBalancer(
                loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

配置示例

1. 服务网关配置

application.yml:

yaml
server:
  port: 8080

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://USER-SERVICE
          predicates:
            - Path=/users/**
          filters:
            - StripPrefix=1
        - id: order-service
          uri: lb://ORDER-SERVICE
          predicates:
            - Path=/orders/**
          filters:
            - StripPrefix=1
      default-filters:
        - AddRequestHeader=X-Response-Default-Header, Default-Value

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

management:
  endpoints:
    web:
      exposure:
        include: health,info,gateway
  endpoint:
    gateway:
      enabled: true

2. 分布式配置

bootstrap.yml:

yaml
spring:
  application:
    name: microservice-app
  cloud:
    config:
      uri: http://config-server:8888
      fail-fast: true
      retry:
        initial-interval: 1000
        max-interval: 2000
        multiplier: 2
        max-attempts: 10
  profiles:
    active: dev

eureka:
  client:
    service-url:
      defaultZone: http://eureka-server:8761/eureka/

参考资源

版本历史

  • Greenwich.M1 (2018-10-24): 初始里程碑版本
  • Greenwich.RC1 (2018-12-13): 第一个候选发布版本
  • Greenwich.RELEASE (2019-01-22): 正式发布版本
  • Greenwich.SR1-SR6 (2019-02-12 至 2019-10-22): 各个小版本修复更新