大数跨境
0
0

Spring Cloud 这些通用基础功能你必须要掌握

Spring Cloud 这些通用基础功能你必须要掌握 Spring全家桶实战案例
2024-02-04
0
导读:Spring Cloud 这些通用基础功能你必须要掌握

环境:SpringBoot2.7.12 + Spring Cloud 2021.0.8



1. 简介

Spring Cloud Commons对服务发现、负载平衡和断路器等模式提供了一个公共抽象层,所有Spring Cloud客户端都可以使用该抽象层,与实现无关(例如,Eureka或Nacos的发现)。下面将分别介绍这些功能。

2. 通用服务

2.1 @EnableDiscoveryClient注解

该注解已经不被要求了,可以直接将DiscoverClient注册为Bean即可。当然你也可以使用该注解,该注解会从META-INF/spring.factories中查找以org.springframework.cloud.client.discovery.EnableDiscoveryClient为key的配置,将其对应的值注册为Bean。

SimpleDiscoveryClient

如果类路径中没有服务注册中心支持的 DiscoveryClient,则将使用使用属性获取服务和实例信息的 SimpleDiscoveryClient 实例。如下配置

spring:  cloud:    discovery:      client:        simple:          instances:            order-service-ack:            - service-id: OrderService              instance-id: OrderService001              host: localhost              port: 9000            - service-id: OrderService              instance-id: OrderService002              host: localhost              port: 9001

SimpleDiscoveryClient将使用上面的配置作为实例信息。

2.2 服务注册

Commons 现在提供了一个 ServiceRegistry 接口,它提供了 register(Registration) 和 deregister(Registration) 等方法,让你可以提供自定义的注册服务。使用示例:

@Configuration@EnableDiscoveryClient(autoRegister=false)public class PackConfig {  private final ServiceRegistry registry;
public PackConfig(ServiceRegistry registry) {    this.registry = registry; }
public void register() {    // Registration继承了ServiceInstance    Registration registration = // 服务实例信息; this.registry.register(registration); }}


服务自动注册

默认情况下,ServiceRegistry实现自动注册正在运行的服务。要禁用该行为,可以设置:@EnableDiscoveryClient(autoRegister=false)永久禁用自动注册。也可通过spring.cloud.service-registry.auto-registration.enabled=false配置禁用自动注册。

服务注册事件

当服务自动注册时(注意:必须是自动注册)会在服务注册前发触发InstancePreRegisteredEvent事件,服务注册后会触发InstanceRegisteredEvent。我们可以通过监听该事件

2.3 RestTemplate负载均衡

你可以配置一个RestTemplate来使用负载均衡器客户端。要创建一个负载均衡的RestTemplate,只需要创建一个RestTemplate @Bean,并使用@LoadBalanced限定符,如下:

@Configurationpublic class PackConfig {  @LoadBalanced  @Bean  RestTemplate restTemplate() {      return new RestTemplate() ;  }}@Servicepublic class UserService{  private final RestTemplate restTemplate;  public UserService(RestTemplate restTemplate) {    this.restTemplate = restTemplate ;  }
  public String query() {    String results = restTemplate.getForObject("http://order-service/orders/666", String.class); return results; }}

通过上面的配置在查询订单服务时就能够实现负载均衡。order-service是远程接口的服务名。

2.4 WebClient负载均衡

你可以配置WebClient来自动使用负载均衡器客户端。要创建一个负载均衡的WebClient,创建一个WebClient。并且使用@LoadBalanced注解,如下:

@Configurationpublic class PackConfig {  @Bean  @LoadBalanced  public WebClient.Builder loadBalancedWebClientBuilder() {    return WebClient.builder();  }}@Servicepublic class UserService {  private final WebClient.Builder webClientBuilder;  public UserService(WebClient.Builder webClientBuilder) {    this.webClientBuilder = webClientBuilder ;  }  public Mono<String> doOtherStuff() {    return webClientBuilder.build().get().uri("http://order-service/orders/666")      .retrieve().bodyToMono(String.class);  }}


2.5 多个RestTemplate配置

如果你想要一个负载不均衡的RestTemplate,创建一个RestTemplate bean并注入它。要访问负载均衡的RestTemplate,在创建@Bean时使用@LoadBalanced限定符,如下:

@Configurationpublic class MyConfiguration {  @LoadBalanced  @Bean  RestTemplate loadBalanced() {    return new RestTemplate();  }
@Primary @Bean RestTemplate restTemplate() {    return new RestTemplate(); }}
public class PackComponent { @Resource private RestTemplate restTemplate; @Resource @LoadBalanced private RestTemplate loadBalanced;
  public String createOrder() {    return loadBalanced.postForObject("http://order-service/orders/create", String.class); }
public String query() {    return restTemplate.getForObject("http://192.168.1.2/storage/666", String.class); }}

如果有多个WebClient,那么配置方法与上面一致。

2.6 忽略网络接口

有时,忽略某些命名网络接口很有用,这样它们就可以被排除在服务发现注册之外(例如,在Docker容器中运行时)。可以设置正则表达式列表,使所需的网络接口被忽略。下面的配置忽略docker0接口和所有以veth开头的接口:

spring:  cloud:    inetutils:      ignoredInterfaces:        - docker0        - veth.*

还可以使用正则表达式列表强制指定网络地址,如下面的例子所示:

spring:  cloud:    inetutils:      preferredNetworks:        - 192.168        - 10.0

也可以强制只使用站点本地地址,如下面的例子所示:

spring:  cloud:    inetutils:      useOnlySiteLocalInterfaces: true


2.7 HTTP Client工厂

Spring Cloud Commons提供了用于创建Apache HTTP客户端(ApacheHttpClientFactory)和OK HTTP客户端(OkHttpClientFactory)的bean。只有在classpath中有OK HTTP jar时,才会创建OkHttpClientFactory bean。此外,Spring Cloud Commons提供了用于创建两个客户端都使用的连接管理器的bean: ApacheHttpClientConnectionManagerFactory用于Apache HTTP客户端,OkHttpClientConnectionPoolFactory用于OK HTTP客户端。如果你想自定义如何在下游项目中创建HTTP客户端,则可以提供自己的这些bean实现。此外,如果你提供HttpClientBuilder或OkHttpClient类型的bean。构建器,默认工厂使用这些构建器作为返回下游项目的构建器的基础。你也可以通过将spring.cloud.httpclientfactories.apache.enabledspring.cloud.httpclientfactories.ok.enabled设置为false来禁用这些bean的创建。

2.8 自定义特性

我们可以开发一个自定义的功能,生成jar,在项目中引入,而该jar中的清单文件内容大体如下:

Manifest-Version: 1.0Implementation-Title: Spring Cloud Commons RPCImplementation-Version: 1.0.1Build-Jdk-Spec: 17Created-By: PackImplementation-Vendor: Pack Software, Inc.

Spring Cloud 能够通过上面的配置获取相应的信息。

自定义Features

@Beanpublic HasFeatures rpcFeatures() {  return HasFeatures.namedFeatures(new NamedFeature("RPC", PackRpcService.class)) ;}

通过actuator查看

该功能仅仅是展当前Spring Cloud提供了那些功能而已。

以上是本篇文章的全部内容,希望对你有帮助

完毕!!!

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读38
粉丝0
内容832