目录前言1.编写集成测试1.1服务通常与其他服务交互1.2集成测试的策略1.3针对持久化层的集成测试1.4针对基于REST的请求/响应式交互的集成测试1.5针对发布/订阅式交互的集成测试1.6针对异步请求/响应式交互的集成契约测试2.编写组件测试2.1定义验收测试2.2使用Gherkin编写验收测试2.2.1使用Gherkin定义验收测试2.2.2使用Cucumber执行规范2.3设计组件测试2.4为FTGO的OrderService编写组件测试2.4.1OrderService的组件测试设计2.4.2OrderServiceComponentTestStepDefinitions类2.4.3
目录前言1.使用API组合模式进行查询1.1findOrder()查询操作1.2什么是API组合模式1.3使用API组合模式实现findOrder()查询操作1.4设计问题一:由谁来担任API组合器的角色1.5设计问题二:如何编写有效的聚合逻辑1.6API组合模式的好处与弊端2.使用CQRS模式2.1为什么要使用CQRS2.2CQRS隔离命令与查询2.3CQRS和查询专用服务2.4CQRS的好处与弊端3.设计CQRS视图3.1选择视图存储库3.2设计数据访问模块3.3添加和更新CQRS视图4.实现基于AWSDynamoDB的CQRS视图4.1OrderHistoryService的设计4.2O
目录前言1.使用API组合模式进行查询1.1findOrder()查询操作1.2什么是API组合模式1.3使用API组合模式实现findOrder()查询操作1.4设计问题一:由谁来担任API组合器的角色1.5设计问题二:如何编写有效的聚合逻辑1.6API组合模式的好处与弊端2.使用CQRS模式2.1为什么要使用CQRS2.2CQRS隔离命令与查询2.3CQRS和查询专用服务2.4CQRS的好处与弊端3.设计CQRS视图3.1选择视图存储库3.2设计数据访问模块3.3添加和更新CQRS视图4.实现基于AWSDynamoDB的CQRS视图4.1OrderHistoryService的设计4.2O
目录前言1.外部API的设计难题1.1FTGO应用程序的服务及客户端1.2FTGO移动客户端API的设计难题1.3其他类型客户端API的设计难题与特点2.APIGateway模式2.1APIGateway实现的功能2.1.1请求路由2.1.2API组合2.1.3协议转换2.1.4能够为每一个客户端提供它们专用的API2.1.5实现边缘功能2.2APIGateway的架构2.3APIGateway的所有者模式2.4APIGateway的后端前置模式2.5APIGateway模式的好处与弊端2.6APIGateway的设计难题3.实现一个APIGateway3.1实现APIGateway的两种方法
目录前言1.外部API的设计难题1.1FTGO应用程序的服务及客户端1.2FTGO移动客户端API的设计难题1.3其他类型客户端API的设计难题与特点2.APIGateway模式2.1APIGateway实现的功能2.1.1请求路由2.1.2API组合2.1.3协议转换2.1.4能够为每一个客户端提供它们专用的API2.1.5实现边缘功能2.2APIGateway的架构2.3APIGateway的所有者模式2.4APIGateway的后端前置模式2.5APIGateway模式的好处与弊端2.6APIGateway的设计难题3.实现一个APIGateway3.1实现APIGateway的两种方法
今天这篇笔记重点讲goroutine首先怎么定义goroutine很简单,在方法前面加上go就可以了funcmain(){ gosayHello()}funcsayHello(){ fmt.Println("hello")}也可以直接这样写,基于匿名函数gofunc(){ fmt.Println("hello")}()go语言至少有一个maingoroutine,另外调用的sayhellogoroutine和maingoroutine并发执行,会在maingoroutine退出后退出,所以我们上面的代码是有问题的,它不会打印出"hello".因为maingoroutine退出了,它没有机会执行
已经把《Go语言并发之道》通读了一遍,非常不错的一本书,对于理解掌握Go语言的并发知识有很大的帮助,接下来我会把书中有用的知识通过代码示例出来,把一些比较好的知识点记录下来。首先我们来看一段代码vardataintgofunc(){data++}()ifdata==0{ fmt.Println("thevalueis0.")}else{ fmt.Printf("thevalueis%v.\n",data)}这段代码我们想把data+1后打印出来,但是结果打印出来的效果是“thevalueis0.”,没有达到我们的预期,主要是因为调用data++的这个goroutine没有先执行。并发的难点就是
今天这篇笔记重点讲goroutine首先怎么定义goroutine很简单,在方法前面加上go就可以了funcmain(){ gosayHello()}funcsayHello(){ fmt.Println("hello")}也可以直接这样写,基于匿名函数gofunc(){ fmt.Println("hello")}()go语言至少有一个maingoroutine,另外调用的sayhellogoroutine和maingoroutine并发执行,会在maingoroutine退出后退出,所以我们上面的代码是有问题的,它不会打印出"hello".因为maingoroutine退出了,它没有机会执行
已经把《Go语言并发之道》通读了一遍,非常不错的一本书,对于理解掌握Go语言的并发知识有很大的帮助,接下来我会把书中有用的知识通过代码示例出来,把一些比较好的知识点记录下来。首先我们来看一段代码vardataintgofunc(){data++}()ifdata==0{ fmt.Println("thevalueis0.")}else{ fmt.Printf("thevalueis%v.\n",data)}这段代码我们想把data+1后打印出来,但是结果打印出来的效果是“thevalueis0.”,没有达到我们的预期,主要是因为调用data++的这个goroutine没有先执行。并发的难点就是
今天这篇笔记我们来学习锁:互斥锁(Mutex)和读写锁(RWMutex)互斥锁(Mutex)首先我们来看一段代码,没有加锁的情况下,两个goroutine同时修改一个变量,会发生什么funcmain(){ varcountint increment:=func(){ count++ fmt.Printf("Incrementing:%d\n",count) } decrement:=func(){ count-- fmt.Printf("Decrementing:%d\n",count) } vararithmeticsync.WaitGroup fori:=0;i上面的代码定义了一个