Appearance
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: false3. 配置服务网关
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: true2. 分布式配置
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): 各个小版本修复更新