《Spring Guides系列学习》guide56 - guide60

news2024/11/27 8:38:08

要想全面快速学习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的可靠性和稳定性。

仅了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/577716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Entity Framework Core 简明教程(3)- 关系处理

在数据库层面&#xff0c;表之间关系&#xff0c;通过主键、外键来实现&#xff0c;基于约束 (constraint) 和数据完整性来制约。 在 EF Core 技术层面&#xff0c;并不是简单地与数据库这些关系和约束对应&#xff0c;EF Core 有它自己的机制。本篇介绍 EF core 在处理表关系方…

HTML+CSS实训——Day03——仿网易云音乐的发现页界面

仓库链接:https://github.com/MengFanjun020906/HTML_SX 一些今天需要用到的知识点 弹性盒子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedg…

二次元的登录界面

今天还是继续坚持写博客&#xff0c;然后今天给大家带来比较具有二次元风格的登录界面&#xff0c;也只是用html和css来写的&#xff0c;大家可以来看看&#xff01; 个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &…

[acwing周赛复盘] 第 105 场周赛20230527

[acwing周赛复盘] 第 105 场周赛20230527 总结5029. 极值数量1. 题目描述2. 思路分析3. 代码实现 5030. 核心元素1. 题目描述2. 思路分析3. 代码实现 5031. 矩阵扩张1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 又是笨比的一周&#xff0c;只做出1题。T1 模拟T2 计…

leetcode刷题之链表相关问题(js)

21.合并两个有序链表 var mergeTwoLists function(list1, list2) {if(list1null) return list2if(list2null) return list1let newHead new ListNode(0,null) //创建一个虚拟节点let cur newHeadlet cur1 list1,cur2 list2while(cur1&&cur2){if(cur1.val<cur2.…

PowerToys Windows 工具集

Microsoft PowerToys | Microsoft Learn Microsoft PowerToys&#xff1a;用于自定义 Windows 的实用工具 项目2023/04/1918 个参与者 反馈 Microsoft PowerToys 是一组实用工具&#xff0c;可帮助高级用户调整和简化其 Windows 体验&#xff0c;从而提高工作效率。 安装 …

Unity之效应器

主要作用&#xff1a;在一个区域内让游戏对象受到力和扭矩力的作用 1、创建一个精灵&#xff08;绿色区域&#xff09; 2、为其添加碰撞器&#xff08;要将Used By Effector和is Trigger打钩&#xff09; 3、添加效应器组件 4、区域效应器参数 Use Collider Mask&#xff1a;…

第3章 Class and Object

构造函数 Guaranteed initialization with the constructor使用构造函数保证初始化 • If a class has a constructor, the compiler automatically calls that constructor at the point an object is created, before client programmers can get their hands on the o…

Solidity基础五

暂时的一事无成也代表将来万事皆有可能&#xff01; 目录 一、对Solidity文件的理解 二、Solidity的导sol文件&#xff08;库、合约&#xff09; 三、Solidity的继承 1.继承的分类 2.继承的可见性 3.父合约构造函数的传参 4.调用父合约成员 5.重写 四、Solidity的抽象…

Solidity基础八

别慌&#xff0c;月亮也在大海某处迷茫 目录 一、Solidity 编程风格 1. 代码布局 2. 代码中各部分的顺序 3. 命名约定 二、Solidity 智能合约编写过程 1. solidity Hello World 2. 版本声明 3. 导入声明 4. 合约声明 三、Solidity 合约结构 智能合约 Test 四、So…

Solidity基础六

生活本来就是平凡琐碎的&#xff0c;哪有那么多惊天动地的大事&#xff0c;快乐的秘诀就是不管对大事小事都要保持热情 目录 一、Solidity的特殊变量(全局) 二、Solidity的不可变量 immutable的赋值方式 三、Solidity的事件与日志 事件和日志加深理解 四、Solidity的异常…

EMLP2021 | Google大模型微调经典论文prompt tuning

一、概述 title&#xff1a;The Power of Scale for Parameter-Efficient Prompt Tuning 论文地址&#xff1a;https://arxiv.org/abs/2104.08691 代码&#xff1a;GitHub - google-research/prompt-tuning: Original Implementation of Prompt Tuning from Lester, et al, …

系列一、RuoYi前后端分离(登录密码加密)

一、部署前后端服务 http://doc.ruoyi.vip/ruoyi-vue/ 二、现象 若依前后端环境分离版本&#xff0c;本地部署好前后端环境后&#xff0c;访问登录接口密码是明文的&#xff0c;这样显然hi不安全的&#xff0c;如下图所示&#xff1a; 三、解决方法 3.1、加密流程 ①、后端…

Linux-0.11 文件系统namei.c详解

Linux-0.11 文件系统namei.c详解 模块简介 namei.c是整个linux-0.11版本的内核中最长的函数&#xff0c;总长度为700行。其核心是namei函数&#xff0c;即根据文件路径寻找对应的i节点。 除此以外&#xff0c;该模块还包含一些创建目录&#xff0c;删除目录&#xff0c;创建目…

Day2:Windows网络编程-TCP

今天开始进入Windows网络编程的学习&#xff0c;在学习的时候总是陷入Windows复杂的参数&#xff0c;纠结于这些。从老师的讲解中&#xff0c;这些内容属于是定式&#xff0c;主要学习写的逻辑。给自己提个醒&#xff0c;要把精力放在正确的位置&#xff0c;不要无端耗费精力。…

【JavaScript】文件分片上传

文章目录 普通文件上传分片上传整体流程技术点分析文件选择方式隐藏input框&#xff0c;自定义trigger拖拽上传 分片动态分片 计算哈希workerrequestIdleCallback抽样 请求并发控制进度展示手动中止/暂停 合并流式并发合并 反思分片命名问题并发控制代码实现的问题 参考文献 普…

ChatGPT桌面客户端支持gpt4模型,附使用说明

#软件核心功能&#xff1a; 1、支持OpenAI官方秘钥及API2D双秘钥使用&#xff1b;如果全局魔法&#xff0c;可以自己用官方秘钥&#xff1b;没魔法国内可直接使用API2D秘钥&#xff1b; 2、内置GPT4模型选项&#xff0c;如果你的官方秘钥支持可直接使用&#xff1b;你也可以注册…

【Labview如何显示数据库表格中的内容】

Labview如何显示数据库表格中的内容 前提操作思路框图 前提 已经成功将数据库与Labview相连接&#xff0c;若还没有链接可以查看&#xff1a;Labview与SQL Server互联 进行操作 操作 思路 首先创建一个表格控件&#xff0c;通过一个按钮启动程序&#xff0c;通过程序调用数…

SAP MM 根据采购订单反查采购申请

如何通过采购订单号查询到其前端的采购申请号。 首先从采购申请的相关报表着手&#xff0c;比如ME5A, 发现它是可以满足需求的。 例如&#xff1a;如下的采购订单&#xff0c; 该订单是由采购申请10003364转过来的。 如果想通过这个采购订单找到对应的采购申请&#xff0c;在…

Packet Tracer – 配置命名标准 IPv4 ACL

Packet Tracer – 配置命名标准 IPv4 ACL 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 F0/0 192.168.10.1 255.255.255.0 N/A F0/1 192.168.20.1 255.255.255.0 N/A E0/0/0 192.168.100.1 255.255.255.0 N/A E0/0/1 192.168.200.1 255.255.2…