环境: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::discovery:client:simple:instances::service-id: OrderService: OrderService001host: localhostport: 9000service-id: OrderService: OrderService002host: localhostport: 9001
SimpleDiscoveryClient将使用上面的配置作为实例信息。
2.2 服务注册
Commons 现在提供了一个 ServiceRegistry 接口,它提供了 register(Registration) 和 deregister(Registration) 等方法,让你可以提供自定义的注册服务。使用示例:
(autoRegister=false)public class PackConfig {private final ServiceRegistry registry;public PackConfig(ServiceRegistry registry) {this.registry = registry;}public void register() {// Registration继承了ServiceInstanceRegistration 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限定符,如下:
public class PackConfig {RestTemplate restTemplate() {return new RestTemplate() ;}}public 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注解,如下:
public class PackConfig {public WebClient.Builder loadBalancedWebClientBuilder() {return WebClient.builder();}}public 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限定符,如下:
public class MyConfiguration {RestTemplate loadBalanced() {return new RestTemplate();}RestTemplate restTemplate() {return new RestTemplate();}}public class PackComponent {private RestTemplate restTemplate;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:docker0veth.*
还可以使用正则表达式列表强制指定网络地址,如下面的例子所示:
spring:cloud:inetutils:preferredNetworks:192.16810.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.enabled或spring.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
public HasFeatures rpcFeatures() {return HasFeatures.namedFeatures(new NamedFeature("RPC", PackRpcService.class)) ;}
通过actuator查看

该功能仅仅是展当前Spring Cloud提供了那些功能而已。
以上是本篇文章的全部内容,希望对你有帮助
完毕!!!



