要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。
接着上篇看过的guide55,接着往下看。
guide56、Service Registration and Discovery
用Eureka来做服务注册中心
1、首先要创建一个Eureka服务端,用来接受其他服务注册。
@EnableEurekaServer
@SpringBootApplication
public class ServiceRegistrationAndDiscoveryServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRegistrationAndDiscoveryServiceApplication.class, args);
}
}
@EnableEurekaServer注解:@EnableEurekaServer 是 Spring Cloud Netflix Eureka 服务注册中心的注解之一,用于启用 Eureka 服务注册中心。当应用程序使用该注解时,它会被标记为一个 Eureka 服务注册中心,其他应用程序可以通过该中心注册自己的服务并进行服务发现。
默认情况下,还要禁用服务注册自己,要配置下参数:
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF
现在已经启动了注册中心,需要建立客户端去注册服务了,它既向注册中心注册自己,又使用 Spring Cloud
DiscoveryClient抽象来查询注册中心以获取其自己的主机和端口。
@SpringBootApplication
public class ServiceRegistrationAndDiscoveryClientApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRegistrationAndDiscoveryClientApplication.class, args);
}
}
@RestController
class ServiceInstanceRestController {
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/service-instances/{applicationName}")
public List<ServiceInstance> serviceInstancesByApplicationName(
@PathVariable String applicationName) {
return this.discoveryClient.getInstances(applicationName);
}
}
@EnableDiscoveryClient 是 Spring Cloud 的一个注解,用于启用服务发现客户端。当应用程序使用该注解时,它会被标记为一个服务发现客户端,可以通过服务注册中心(如 Eureka、Consul、Zookeeper 等)发现和调用其他服务。
另外也要在配置文件里配置下spring.application.name。
启动程序,访问接口:http://localhost:8080/service-instances/a-bootiful-client
可以看到客户端的服务注册信息。
guide57、Testing the Web Layer
了解一些spring测试的使用。
新建一个控制器:
@Controller
public class HomeController {
@RequestMapping("/")
public @ResponseBody String greeting() {
return "Hello, World";
}
}
启动程序后既可以直接访问:
如何编写测试类进行单元测试呢,
可以这样:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class HttpRequestTest {
@Value(value="${local.server.port}")
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Test
public void greetingShouldReturnDefaultMessage() throws Exception {
String forObject = this.restTemplate.getForObject("http://localhost:" + port + "/",
String.class);
System.out.println(port);
System.out.println(forObject);
}
}
@SpringBootTest注解是一个Spring Boot测试注解,用于在测试类中标记Spring Boot应用程序的主要入口点。它会加载整个应用程序上下文,包括所有配置文件和bean,并在测试执行之前启动Spring Boot应用程序。这使得测试可以模拟真实环境,并且可以测试应用程序的整个堆栈,包括Spring Boot的自动配置和集成。
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)注解是一个Spring Boot测试注解,它与@SpringBootTest注解类似,但它还指定了要在随机端口上运行测试服务器。这使得测试可以模拟真实环境,因为应用程序将在不同的端口上运行,并且可以测试应用程序的网络层面。此外,使用随机端口可以防止端口冲突,并且可以在并行测试中使用。
执行上述代码中的测试方法,可以得出在不同的port上运行方法。
另一种有用的方法是根本不启动服务器,而只测试它下面的层,其中 Spring 处理传入的 HTTP 请求并将其传递给您的控制器。这样,几乎可以使用整个堆栈,并且您的代码将以与处理真实 HTTP 请求完全相同的方式被调用,但无需启动服务器。
@SpringBootTest
@AutoConfigureMockMvc
public class TestingWebApplicationTest {
@Resource
private MockMvc mockMvc;
@Test
public void shouldReturnDefaultMessage() throws Exception {
this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
.andExpect(content().string(containsString("Hello, World")));
}
}
在此测试中,启动了完整的 Spring 应用程序上下文,但没有服务器。我们可以使用@WebMvcTest注解将测试范围缩小到仅 web 层。
@WebMvcTest(HomeController.class)
public class WebLayerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void shouldReturnDefaultMessage() throws Exception {
this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
.andExpect(MockMvcResultMatchers.content().string(containsString("Hello, World")));
}
}
涉及注解:
@AutoConfigureMockMvc是一个Spring Boot测试注解,用于为测试类自动配置MockMvc实例。MockMvc是Spring Framework提供的一个模拟Web请求和响应的类,可以用于编写集成测试和端到端测试。通过使用@AutoConfigureMockMvc注解,测试类可以自动配置MockMvc实例,以便在测试期间模拟Web请求和响应。这样可以在不依赖于Web服务器的情况下测试控制器层面的逻辑,例如请求参数的解析、响应的生成和返回视图等。
@WebMvcTest是一个Spring Boot测试注解,用于测试Spring MVC控制器层面的逻辑。它会自动配置一个MockMvc实例,并限定自动配置的Bean范围,只包括控制器、控制器通常使用的组件和相关的配置类。这样可以在不启动完整Web服务器的情况下,快速测试控制器层面的逻辑。在测试期间,可以使用MockMvc实例发出模拟请求,并验证控制器的响应是否符合预期。需要注意的是,@WebMvcTest仅仅测试控制器层面的逻辑,不包括服务层面的逻辑,如果需要测试服务层面的逻辑,可以使用@MockBean注解模拟服务组件。
@WebMvcTest(GreetingController.class)
public class WebMockTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private GreetingService service;
@Test
public void greetingShouldReturnMessageFromService() throws Exception {
when(service.greet()).thenReturn("Hello, Mock");
this.mockMvc.perform(get("/greeting")).andDo(print()).andExpect(status().isOk())
.andExpect(content().string(containsString("Hello, Mock")));
}
}
@MockBean是一个Spring Boot测试注解,用于将一个Mock对象添加到Spring上下文中。它可以用于测试中,用于模拟某些Bean的行为,例如服务组件、存储库、消息代理等。在测试类中,使用@MockBean注解可以将一个Mock对象注入到Spring上下文中,这样它就可以被其他Bean所引用。在测试期间,可以使用Mock对象模拟某些行为,例如模拟服务组件返回固定的值或者抛出特定的异常。这样可以在不依赖于真实的服务组件和存储库的情况下,测试控制器层面的逻辑。
guide58、Creating a Multi Module Project
利用maven进行多模块管理, 这个之前已经在项目开发中学习了。
可以参照后端工程模板,利用maven项目管理分为各个功能模块。
分为父工程模块和子模块。父模块pom引入的依赖可供子模块使用,子模块之间的依赖也需要在pom中申明。
注意下:
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)。
guide59、Messaging with Google Cloud Pub/Sub
使用google cloud pub/sub进行消息传输,需要设置前置环境,没有深入了解。
Google Cloud Pub/Sub是一项托管式消息传递服务,由Google Cloud提供。它允许应用程序将数据以异步方式发布到主题(topic),并订阅(subscribe)主题以接收数据。Cloud Pub/Sub能够处理高吞吐量和低延迟的消息传递,支持跨多个数据中心的全球范围内的消息传递。Cloud Pub/Sub还提供了持久性存储,消息传递过程中不会丢失数据,并支持多种消息格式和协议,例如JSON、Avro和gRPC。Cloud Pub/Sub还与其他Google Cloud服务集成,如Google Cloud Functions、Google Cloud Dataflow、Google Cloud Storage等,可以帮助用户构建强大的、高度可扩展的应用程序和系统。
guide60、Consumer Driven Contracts
Consumer Driven Contracts是一种API设计模式,其中API使用者定义了他们期望API提供者提供的行为,并创建了一组契约,以确保API提供者在满足这些契约时遵循这些行为。这种模式强调了API使用者和API提供者之间的协作和相互信任,以提高API的可靠性和稳定性。
仅了解。