Spring Boot在微服务中的最佳实践,springcloud架构面试




  

在添加了logstash-logging-spring-boot-starter之后,你就可以使用Logstash中的日志标记功能。下图是来自Kibana中的单条日志记录的截图。



![](https://imgconvert.csdnimg.cn/aHR0cDovL3A5LXR0LWlwdjYuYnl0ZWltZy5jb20vbGFyZ2UvcGdjLWltYWdlL2YxNmEzN2ZlMDY3NjRlZjg5NDYyZjIwMGZhNzQ5OWE5?x-oss-process=image/format,png)



  

我们还可以将库Spring Cloud Sleuth添加到我们的依赖项中。



 

org.springframework.cloud

spring-cloud-starter-sleuth




  

Spring Cloud Sleuth传递与Zipkin(一种流行的分布式跟踪工具)兼容的标头。它的主要特点是:



*   它将跟踪(相关请求)和span IDs添加到Slf4J MDC

*   它记录时间信息以帮助进行延迟分析

*   它修改了日志的格式,以添加一些信息,比如附加的MDC字段

*   它提供与其他Spring组件的集成,如OpenFeign、RestTemplate或Spring Cloud Netflix Zuul



让你的API易用

========



在大多数情况下,其他应用程序将通过REST API调用你的应用程序。因此我们需要小心的维护一份API文档。文档应该由代码生成。当然有一些工具可以做到这一点。其中最受欢迎的是Swagger。你可以使用SpringFox项目轻松地将Swagger 2集成到你的Spring Boot应用程序中。为了使用Swagger,我们需要添加如下依赖。第一个库负责从Spring MVC控制器代码中生成Swagger descriptor,而第二个库负责解析Swagger descriptor并在你的浏览器中展示页面。



io.springfox

springfox-swagger2

2.9.2

io.springfox

springfox-swagger-ui

2.9.2




  

我们还必须提供一些Bean来修改Swagger的默认行为。它应该只展示我们自己提供的REST API,而不展示Spring Boot Actuator的API。我们也可以通过定义UiConfiguration bean来定制UI外观。



@Configuration

@EnableSwagger2

public class ConfigurationSwagger {

@Autowired

Optional build;

@Bean

public Docket api() {

String version = “1.0.0”;

if (build.isPresent())

version = build.get().getVersion();

return new Docket(DocumentationType.SWAGGER_2)

.apiInfo(apiInfo(version))

.select()

.apis(RequestHandlerSelectors.any())

.paths(PathSelectors.regex("(/components.*)"))

.build()

.useDefaultResponseMessages(false)

.forCodeGeneration(true);

}

@Bean

public UiConfiguration uiConfig() {

return UiConfigurationBuilder.builder().docExpansion(DocExpansion.LIST).build();

}

private ApiInfo apiInfo(String version) {

return new ApiInfoBuilder()

.title(“API - Components Service”)

.description(“Managing Components.”)

.version(version)

.build();

}

}




  

下图是Swagger 2 UI的例子。



![](https://imgconvert.csdnimg.cn/aHR0cDovL3A2LXR0LWlwdjYuYnl0ZWltZy5jb20vbGFyZ2UvcGdjLWltYWdlLzM2YzUzOWJhYWU3MDQzZTBhY2VmYmM0YjJjZDhjZTVk?x-oss-process=image/format,png)



  

接下来是为所有微服务定义相同的REST API准则。如果你始终如一地为你的微服务构建API,那么对于外部和内部客户端,集成微服务要简单得多。指南应该包含如何构建API的说明,需要在请求和响应上设置哪些HTTP header,如何生成错误码等。这些准则应该与组织中的所有开发人员和供应商共享。有关为Spring Boot微服务生成Swagger文档(包括为API网关上的所有应用程序公开它)的更详细说明,您可以参考我的文章《Microservices API Documentation with Swagger2》。



不要害怕使用断路器

=========



如果你使用Spring cloud在微服务之间进行通信,你可以利用Spring Cloud Netflix Hystrix或Spring Cloud断路器来实现断路。然而,由于Netflix不再开发Hystrix,Pivotal团队已经将第一个解决方案转移到了维护模式。推荐的解决方案是构建在**resilience4j**项目之上的新的Spring Cloud断路器。



org.springframework.cloud

spring-cloud-starter-circuitbreaker-resilience4j




  

然后,我们需要为断路器设置所需的配置,方法是定义一个Customizer bean,该bean被传递给Resilience4JCircuitBreakerFactory。以下示例使用默认值。



@Bean

public Customizer defaultCustomizer() {

return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)

.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(5)).build())

.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())

.build());

}




  

有关将Hystrix断路器与Spring Boot应用程序集成的详细信息,请参阅我的另一篇文章:《Part 3: Creating Microservices: Circuit Breaker, Fallback and Load Balancing with Spring Cloud》。



使应用程序透明

=======



我们不应该忘记,迁移到微服务的最重要原因之一是持续交付的需求。今天,快速交付变更的能力在市场上具有优势。你甚至应该能够在一天内多次交付更改。因此,重要的是当前是什么版本,它在哪里发布,以及它包括哪些更改。  

在使用Spring Boot和Maven时,我们可以很容易地发布诸如最后更改日期、Git的commit id或应用程序的多个版本等信息。要实现这一点,我们只需要在我们的pom.xml中包含以下Maven插件。



org.springframework.boot

spring-boot-maven-plugin

build-info

pl.project13.maven

git-commit-id-plugin

false




  

假设你已经启用了Spring Boot Actuator(参见第1节),你必须启用/info端点来显示所有有趣的数据。



management.endpoint.info.enabled: true




  

当然,我们有许多微服务组成的一个大系统,并且每个微服务都有一些正在运行的实例。最好是在一个应用程序中监视我们所有的实例——就像收集度量指标和收集日志一样。幸运的是,有一个专门用于Spring Boot应用程序的工具,它能够从所有Actuator端点收集数据并在UI中显示它们。它是由Codecentric开发的**Spring Boot Admin**。使用Spring Boot Admin最方便的方式是创建一个专门的Spring Boot应用程序,该程序需要添加Spring Boot Admin的依赖项和服务发现的依赖项,例如Spring Cloud Netflix Eureka。



de.codecentric

spring-boot-admin-starter-server

2.1.6

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client




  

然后,我们应该通过使用@EnableAdminServer注解来启用Spring Boot Admin。



@SpringBootApplication

@EnableDiscoveryClient

@EnableAdminServer

@EnableAutoConfiguration

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}




  

通过Spring Boot Admin,我们可以轻松地浏览在服务发现中注册的应用程序列表,并检查每个应用程序的版本或提交信息。



![](https://imgconvert.csdnimg.cn/aHR0cDovL3A2LXR0LWlwdjYuYnl0ZWltZy5jb20vbGFyZ2UvcGdjLWltYWdlL2Y4Y2NiNjc5MjdiZjRkZDk4ZDkwY2RkOTJkN2U3MzQw?x-oss-process=image/format,png)



  

我们可以点击“Details”按钮查看更多详细信息,这些信息都来自于/info端点和从其他Actuator端点收集到的数据。



![](https://imgconvert.csdnimg.cn/aHR0cDovL3A2LXR0LWlwdjYuYnl0ZWltZy5jb20vbGFyZ2UvcGdjLWltYWdlL2RkNWYxZGQ2ZmQ3ZTQ3YmM4MmUwZDNiYTllYjFmYjNj?x-oss-process=image/format,png)



编写合同测试

======



消费者驱动契约(Consumer Driven Contract,CDC)测试是一种方法,它允许你验证系统内应用程序之间的集成。系统内部的集成数量可能非常大,尤其是在维护基于微服务的系统时。由于**Spring Cloud Contract**项目的存在,在Spring Boot中进行契约测试会相对容易一些。还有一些专门为CDC设计的框架,如Pact,但Spring Cloud Contract可能是首选,因为我们使用的是Spring Boot。  

要在生产者端使用Spring Cloud Contract,我们需要添加Spring Cloud Contract Verifier。



org.springframework.cloud

spring-cloud-starter-contract-verifier

test




  

在消费者端,我们需要添加Spring Cloud Contract Stub Runner。



org.springframework.cloud

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](

)**

ud-starter-contract-verifier

test




  

在消费者端,我们需要添加Spring Cloud Contract Stub Runner。



org.springframework.cloud

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](

)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值