返回

Spring Cloud 云原生应用(二)

发布时间:2022-12-07 00:12:52 242
# 后端# spring# java# git# github

Spring Cloud 云原生应用(二)_spring

4. 弹簧云断路器

4.1. 简介

春云断路器提供了跨不同断路器实现的抽象。 它提供了可在应用程序中使用的一致 API,使开发人员能够选择最适合应用程序需求的断路器实现。

4.1.1. 支持的实现

Spring Cloud 支持以下断路器实现:

  • 弹性4J
  • 哨兵
  • 春季重试

4.2. 核心概念

若要在代码中创建断路器,可以使用 API。当您在类路径中包含 Spring Cloud Breaker 启动器时,将自动为您创建实现此 API 的 Bean。 以下示例显示了如何使用此 API 的简单示例:​​CircuitBreakerFactory​

@Service
public static class DemoControllerService {
private RestTemplate rest;
private CircuitBreakerFactory cbFactory;

public DemoControllerService(RestTemplate rest, CircuitBreakerFactory cbFactory) {
this.rest = rest;
this.cbFactory = cbFactory;
}

public String slow() {
return cbFactory.create("slow").run(() -> rest.getForObject("/slow", String.class), throwable -> "fallback");
}

}

API 创建调用的类的实例。 该方法需要a和a。 这是您要包装在断路器中的代码。 这是断路器跳闸时运行的回退。 传递的函数导致触发回退。 如果不想提供回退,可以选择排除回退。​​CircuitBreakerFactory.create​​​​CircuitBreaker​​​​run​​​​Supplier​​​​Function​​​​Supplier​​​​Function​​​​Throwable​

4.2.1. 反应式代码中的断路器

如果 Project Reactor 位于类路径上,则还可以将响应式代码用于响应式代码。 以下示例演示如何执行此操作:​​ReactiveCircuitBreakerFactory​

@Service
public static class DemoControllerService {
private ReactiveCircuitBreakerFactory cbFactory;
private WebClient webClient;


public DemoControllerService(WebClient webClient, ReactiveCircuitBreakerFactory cbFactory) {
this.webClient = webClient;
this.cbFactory = cbFactory;
}

public Mono slow() {
return webClient.get().uri("/slow").retrieve().bodyToMono(String.class).transform(
it -> cbFactory.create("slow").run(it, throwable -> return Mono.just("fallback")));
}
}

API 创建调用的类的实例。 该方法采用aor a并将其包裹在断路器中。 您可以选择分析回退,如果断路器跳闸并通过导致故障,将调用回退。​​ReactiveCircuitBreakerFactory.create​​​​ReactiveCircuitBreaker​​​​run​​​​Mono​​​​Flux​​​​Function​​​​Throwable​

4.3. 配置

您可以通过创建类型的 bean 来配置断路器。 该接口有一个方法(称为),该方法采用自定义。​​Customizer​​​​Customizer​​​​customize​​​​Object​

有关如何自定义给定实现的详细信息,请参阅 以下文档:

  • 弹性4J
  • 哨兵
  • 春季重试

每次调用一些实现,例如调用方法。 它可能效率低下。在这种情况下,您可以使用方法。在多次调用没有意义的情况下很有用, 例如,在使用 Resilience4j 的事件的情况下。​​CircuitBreaker​​​​Resilience4JCircuitBreaker​​​​customize​​​​CircuitBreaker#run​​​​CircuitBreaker#once​​​​customize​

以下示例显示了每个事件使用事件的方式。​​io.github.resilience4j.circuitbreaker.CircuitBreaker​

Customizer.once(circuitBreaker -> {
circuitBreaker.getEventPublisher()
.onStateTransition(event -> log.info("{}: {}", event.getCircuitBreakerName(), event.getStateTransition()));
}, CircuitBreaker::getName)

5. 缓存随机属性源

Spring Cloud 上下文提供基于键缓存随机值的功能。缓存之外 功能它的工作方式与Spring Boot的RandomValuePropertySource​相同。 此随机值在您希望即使在 Spring 应用程序之后也保持一致的随机值的情况下可能很有用 上下文将重新启动。属性值采用缓存中的键 where is 的形式。该值可以 是Spring Boot支持的任何类型。​​PropertySource​​​​cachedrandom.[yourkey].[type]​​​​yourkey​​​​type​​​​RandomValuePropertySource​

myrandom=${cachedrandom.appname.value}

6. 安全

6.1. 单点登录

所有 OAuth2 SSO 和资源服务器功能都迁移到 Spring Boot 在 1.3 版中。您可以在Spring 引导用户指南中找到文档。

6.1.1. 客户端令牌中继

如果您的应用程序是面向 OAuth2 客户端的用户(即具有声明者),那么它具有来自 Spring Boot 的请求范围。您可以 从此上下文创建自己的上下文和 自动连线,然后上下文将 始终将访问令牌转发到下游,同时刷新访问 令牌在过期时自动。(这些是春天的特点 安全性和春季启动。​​@EnableOAuth2Sso​​​​@EnableOAuth2Client​​​​OAuth2ClientContext​​​​OAuth2RestTemplate​​​​OAuth2ProtectedResourceDetails​

6.1.2. 资源服务器令牌中继

如果您的应用程序有您可能想要中继 传入令牌下游到其他服务。如果您使用 ato 联系下游服务,那么这只是一个 如何创建具有正确上下文的模板的问题。​​@EnableResourceServer​​​​RestTemplate​

如果您的服务用于对传入进行身份验证 令牌(即它正在使用配置),然后您可以简单地创建一个使用自动连线(它将由 在到达后端代码之前进行身份验证过程)。等效 (使用 Spring Boot 1.4),您可以注入 a并抓取它的 您的配置。例如:​​UserInfoTokenServices​​​​security.oauth2.user-info-uri​​​​OAuth2RestTemplate​​​​OAuth2ClientContext​​​​UserInfoRestTemplateFactory​​​​OAuth2RestTemplate​

我的配置.java

@Bean
public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) {
return factory.getUserInfoRestTemplate();
}

然后,此 rest 模板将具有身份验证过滤器使用的相同(请求范围),因此您可以 使用它来发送具有相同访问令牌的请求。​​OAuth2ClientContext​

如果您的应用未使用但仍是客户端 (即它声明者),然后 与 弹簧安全云 任何用户 从安威尔也向前创建 令 牌。默认情况下,此功能作为 MVC 处理程序实现 拦截器,所以它只在Spring MVC中工作。如果您没有使用 MVC 您可以使用自定义过滤器或 AOP 拦截器包装 ANTO 提供相同的功能。​​UserInfoTokenServices​​​​@EnableOAuth2Client​​​​@EnableOAuth2Sso​​​​OAuth2RestOperations​​​​@Autowired​​​​OAuth2Context​​​​AccessTokenContextRelay​

这是一个基本的 显示使用已创建的自动连线 REST 模板的示例 其他地方(“foo.com”是接受与 周围的应用程序):

我的控制器.java

@Autowired
private OAuth2RestOperations restTemplate;

@RequestMapping("/relay")
public String relay() {
ResponseEntity response =
restTemplate.getForEntity("https://foo.com/bar", String.class);
return "Success! (" + response.getBody() + ")";
}

如果您不想转发令牌(这是一个有效的 选择,因为您可能想扮演自己,而不是 向您发送令牌的客户端),那么您只需要创建自己的令牌而不是自动连接默认令牌。​​OAuth2Context​

Feign 客户端还将选取一个拦截器,该拦截器使用 if 它可用,因此他们也应该做一个 令牌中继任何地方。​​OAuth2ClientContext​​​​RestTemplate​

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
elasticsearch 聚合之 date_histogram 聚合 2022-12-06 23:52:12