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的例子。
接下来是为所有微服务定义相同的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,我们可以轻松地浏览在服务发现中注册的应用程序列表,并检查每个应用程序的版本或提交信息。
我们可以点击“Details”按钮查看更多详细信息,这些信息都来自于/info端点和从其他Actuator端点收集到的数据。
编写合同测试
======
消费者驱动契约(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
spring-cloud-starter-contract-stub-runner
test
第一步是定义契约。编写它的一种方法是使用Groovy语言。合同应在生产者和消费者双方进行核实。例如:
import org.springframework.cloud.contract.spec.Contract
Contract.make {
request {
method ‘GET’
urlPath(‘/persons/1’)
}
response {
status OK()
body([
id: 1,
firstName: ‘John’,
lastName: ‘Smith’,
address: ([
city: $(regex(alphaNumeric())),
country: $(regex(alphaNumeric())),
postalCode: $(regex(‘[0-9]{2}-[0-9]{3}’)),
houseNo: $(regex(positiveInt())),
street: $(regex(nonEmpty()))
])
])
headers {
contentType(applicationJson())
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
最后
最后,强调几点:
- 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
- 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
- 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。
面试答案
对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
- 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
- 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。
面试答案
[外链图片转存中…(img-loR85R2b-1711579516564)]
[外链图片转存中…(img-2OisuZ0R-1711579516564)]
[外链图片转存中…(img-HKhd2Zvp-1711579516565)]