Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案(https://gitee.com/mirrors/Spring-Cloud-Alibaba)。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。项目中还包含了示例代码 spring-cloud-alibaba-examples 用于帮助开发者理解和使用项目的功能。
下面介绍的是 集成应用示例 Integerated-example 的程序执行过程。以订单功能实现为例进行介绍。
首先访问:http://integrated-frontend:8080/orderhttp://integrated-frontend:8080/order
请求被下面的控制器处理
@Controller
public class IntegrationController {
@RequestMapping("/order")
public String order() {
return "order";
}
@RequestMapping("/rocketmq")
public String rocketmq() {
return "rocketmq";
}
@RequestMapping("/sentinel")
public String sentinel() {
return "sentinel";
}
}
打开视图order.html:
显示界面如下:
点击“提交”按钮,触发 JavaScript代码:
通过ajax请求服务:http://gateway-service:30010/storage/
Integerated-gateway 模块是路由模块,它的配置文件中配置了路由规则:
从nacos中导入下面的配置文件中定义了路由规则:
其中
- id: queryStorage
uri: lb://integrated-storage
predicates:
- Path=/storage/
是一个配置片段,用于服务路由或请求代理的配置。根据提供的配置,我们可以分析如下:
id: queryStorage —— id 是这个路由或代理规则的标识符,通常用于标识或引用这个特定的规则。
uri: lb://integrated-storage —— uri 表示当这个规则被触发时,请求应该被转发到的目标地址(服务),完整的请求是服务名加上predicates 的Path的内容。lb:// 表示这是一个负载均衡的URI,意味着请求可能会被转发到多个后端服务中的一个,以实现负载均衡和高可用性。integrated-storage 是后端服务的名称或标识符。
predicates: predicates 是用于确定何时应用此路由或代理规则的条件列表。
- Path=/storage/ —— 这是一个具体的条件(predicate),表示只有当请求的路径(Path)以 /storage/ 开头时,这个路由或代理规则才会被应用。
所以,综上所述,这个配置片段定义了一个名为 queryStorage 的路由或代理规则。当请求的路径以 /storage/ 开头时,这个规则会被触发,并将请求转发到名为 integrated-storage 的负载均衡后端服务。这种配置通常出现在微服务架构中,特别是在使用API网关或服务网格时,用于控制请求的路由和转发。
将 /storage 变为 lb://integrated-storage 调用,通过nacos服务发现,找到integrated-storage服务,执行 getRemainCount方法,获取库存数量。
接下来,查询显示账户余额后,执行
$.ajax({
type: "POST",
url: "http://gateway-service:30010/order/create",
去下订单:
- id: placeOrder
uri: lb://integrated-order
predicates:
- Path=/order/create
完整的请求是服务名加上predicates 的Path的内容,也就是 integrated-order 服务的 /order/create 。
再找到 integrated-order 服务,执行下面的createOrder方法。
上面控制器代码调用service代码的 createOrder 方法
其中通过 FeignCLient 调用 reduceStock 方法
这个请求没有走 gateway 模块(integrated-gateway.yaml 中没有定义),通过服务发现integrated-storage 服务,执行reduceStock方法。
上面的过程没有讲账户操作,过程与库存操作是一样的。也没有介绍数据库操作。数据库访问通过mybatis实现。