我们很高兴地宣布,我们已经发布了Spring Cloud Square孵化器项目的第一个公开的里程碑版本。该项目为OkHttpClient和Retrofit提供了Spring Cloud LoadBalancer集成,以及非阻塞的WebClient支持的Retrofit客户端。Retrofit是Square的一个声明式HTTP客户端。
你可以在下面找到更多关于如何开始项目的信息。你也可以查看项目仓库和项目文档。
OkHttpClient Spring Cloud LoadBalancer集成
应用程序拦截器被添加到通过自动配置创建的 OkHttpClient
中。它从Spring Cloud LoadBalancer解析方案、主机和端口,并重写URL。
要使用 SC LoadBalancer 来解析和选择要发送请求的实例,请将 spring-cloud-square-okhttp
依赖关系添加到您的项目中。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-square-okhttp</artifactId>
<version>0.4.0-M1</version>
</dependency>
然后创建一个@LoadBalanced
-annotated OkHttpClient.Builder
bean:
@Configuration
class OkHttpClientConfig{
@Bean
@LoadBalanced
public OkHttpClient.Builder okHttpClientBuilder() {
return new OkHttpClient.Builder();
}
}
现在您可以在请求中使用serviceId
或虚拟主机名,而不是实际的host:port
。SC LoadBalancer 通过选择一个可用的服务实例来解决。
Request request = new Request.Builder()
.url("http://serviceId/hello").build();
Response response = builder.build().newCall(request).execute();
改造OkHttpClient和Spring Cloud LoadBalancer
我们还使用负载平衡的OkHttpClient
实例来运行Retrofit调用。
要使用Retrofit与Spring Cloud LoadBalancer支持的OkHttpClient
一起使用,请在下面添加
spring-cloud-square-retrofit
和 spring-cloud-square-okhttp
依赖关系到你的项目。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-square-retrofit</artifactId>
<version>0.4.0-MILESTONE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-square-okhttp</artifactId>
<version>0.4.0-MILESTONE</version>
</dependency>
</dependencies><dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-square-retrofit</artifactId>
<version>0.4.0-MILESTONE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-square-okhttp</artifactId>
<version>0.4.0-MILESTONE</version>
</dependency>
</dependencies>
使用@EnableRetrofitClients
注解,让我们自动为你实例化和注入Retrofit客户端。然后创建一个@LoadBalanced
注解的OkHttpClient.Builde.bean
来在引擎下使用。
@Configuration
@EnableRetrofitClients
class OkHttpClientConfig {
@Bean
@LoadBalanced
public OkHttpClient.Builder okHttpClientBuilder() {
return new OkHttpClient.Builder();
}
}
创建一个Retrofit客户端,并用@RetrofitClient
对其进行注解,传递你的服务的serviceId
作为参数(你也可以使用注解传递一个自定义配置,该配置包含Retrofit客户端的用户自定义拦截器)。创建一个Retrofit客户端,并用@RetrofitClient对其进行注解,传递你的服务的serviceId作为参数(你也可以使用注解传递一个自定义配置,该配置包含Retrofit客户端的用户自定义拦截器)。
@RetrofitClient("serviceId")
interface HelloClient {
@GET("/")
Call<String> hello();
}
确保使用Retrofit方法注释,如@GET("/")
。现在您可以注入Retrofit客户端,并使用它来运行负载均衡的调用(使用serviceId
而不是实际的host:port
)。
class AService {
@Autowired
HelloClient client;
public String hello() throws IOException {
return client.hello().execute().body();
}
}
我们为基于负载平衡-OkHttpClient的Retrofit客户端创建了一个完整的样本
使用WebClient和Spring Cloud LoadBalancer进行改造
我们还使用适配器为 Retrofit 提供 WebClient
支持。 要将 Retrofit 与 Spring Cloud LoadBalancer 支持的 WebClient 一起使用,请添加 spring-cloud-square-retrofit
和spring-boot-starter-webflux starter
依赖关系到你的项目:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-square-retrofit</artifactId>
<version>0.4.0-MILESTONE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
</dependencies>
使用 @EnableRetrofitClients
注解,让我们自动为您实例化并注入 Retrofit 客户端。然后创建一个@LoadBalanced
注解的WebClient.Builder
bean,以便在下面使用:
@Configuration
@EnableRetrofitClients
class OkHttpClientConfig {
@Bean
@LoadBalanced
public WebClient.Builder okHttpClientBuilder() {
return WebClient.builder();
}
}
创建一个Retrofit客户端并使用@RetrofitClient
对其进行注解,将您的服务的serviceId
作为参数。
@RetrofitClient("serviceId")
interface HelloClient {
@GET("/")
Mono<String> hello();
}
确保使用Retrofit方法注释,如@GET("/")
。现在您可以注入Retrofit客户端,并使用它来运行负载均衡的调用(使用serviceId
而不是实际的host:port
):
class AService {
@Autowired
HelloClient client;
public String hello() throws IOException {
return client.hello();
}
}
我们为基于WebClient的负载均衡的Retrofit客户端创建了一个完整的样本。
提示:
由于当前可用的版本是一个里程碑,因此对于本篇博文中介绍的所有示例,你需要将Spring Milestone仓库链接添加到你的项目中。
<repositories>
<repository>
<id>spring-milestones</id>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
我们建议对其他Spring Cloud的依赖关系使用依赖管理:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>