微服务项目-购物车

本文详细介绍了如何在电商应用中实现购物车的删除和合并功能。通过调用LoginInterceptor获取用户信息,并利用Redis进行数据存储与操作。特别关注了在不同页面调用接口时可能出现的404错误及解决方案。

1 .删除购物车
删除购物车也是比较简单,直接附上接口
讲下业务逻辑:

  1. 首先调用LoginInterceptor获取用户信息
  2. 通过用户信息中的id获取redis中的具体的项目
  3. 调用redisTemplate中的delete方法删除
 public void deleteCartById(Long skuId) {
        // 获取登录用户
        UserInfo user = LoginInterceptor.getUserInfo();
        String key = KEY_PREFIX + user.getId();
        BoundHashOperations<String, Object, Object> hashOps = this.redisTemplate.boundHashOps(key);
        hashOps.delete(skuId.toString());
    }

2.*合并购物车方面

首先想到在发送一次请求,调用原来的接口
附上接口

 public void addCart(Cart cart) {
        // 获取用户信息
        UserInfo userInfo = LoginInterceptor.getUserInfo();
        // 查询购物车记录
        BoundHashOperations<String, Object, Object> hashOperations = this.redisTemplate.boundHashOps(KEY_PREFIX + userInfo.getId());
        String key = cart.getSkuId().toString();
        Integer num = cart.getNum();

        // 判断当前的商品是否在购物车中
        if (hashOperations.hasKey(key)) {
            // 在,更新数量
            String cartJson = hashOperations.get(key).toString();
            cart = JsonUtils.parse(cartJson, Cart.class);
            cart.setNum(cart.getNum() + num);


        } else {
            // 不在,新增购物车
            Sku sku = this.goodsClient.querySkuBySkuId(cart.getSkuId());
            cart.setUserId(userInfo.getId());
            cart.setTitle(sku.getTitle());
            cart.setOwnSpec(sku.getOwnSpec());
            cart.setImage(StringUtils.isBlank(sku.getImages()) ? "" : StringUtils.split(sku.getImages(), ",")[0]);
            cart.setPrice(sku.getPrice());

        }
        hashOperations.put(key, JsonUtils.serialize(cart));
    }

第一次在cart.html上写调用接口的请求,发现会出现404

const temp = ly.store.get("LY_CART");
                            if (temp !== null) {
                                temp.forEach( s => {
                                    leyou.http.post("/cart", {skuId: s.skuId, num: s.num}).then()
                                });
                                ly.store.del("LY_CART");

然后在login.html调用接口就解决问题。
原因,判断本地localstorage应该在一登录成功就开始合并工作

### 如何使用 Nacos 作为服务注册中心并结合 LoadBalancer 实现负载均衡 要在 Spring Cloud 微服务架构中使用 Nacos 作为服务注册中心,并通过 OpenFeign 完成微服务间的远程调用,以下是具体方法: #### 添加依赖 首先,在项目的 `pom.xml` 文件中引入必要的依赖项。这包括用于服务发现的 Nacos Discovery Starter 和用于声明式 REST 调用的 OpenFeign。 ```xml <dependencies> <!-- Nacos Service Discovery --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.1</version> </dependency> <!-- OpenFeign for declarative REST calls --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> ``` 此部分操作确保了项目能够集成 Nacos 的服务注册与发现能力以及 Feign 的声明式接口调用功能[^3]。 #### 配置 Nacos 注册中心 在应用的配置文件 `application.yml` 或 `application.properties` 中指定 Nacos Server 的地址和其他必要参数。例如: ```yaml server: port: 8081 spring: application: name: service-a # 当前服务名称 cloud: nacos: discovery: server-addr: localhost:8848 # Nacos Server 地址 ``` 这里定义了当前服务的名字和服务端口,同时也指定了本地运行的 Nacos Server 所使用的默认地址和端口号[^3]。 #### 启动类启用组件支持 为了使应用程序具备服务注册、发现的能力以及支持 Feign 接口调用,需在启动类上添加相应的注解: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableDiscoveryClient // 开启服务注册与发现的支持 @EnableFeignClients(basePackages = "com.example.feignclients") // 声明 Feign Clients 存放路径 public class ServiceAApplication { public static void main(String[] args) { SpringApplication.run(ServiceAApplication.class, args); } } ``` 这段代码片段展示了如何激活服务发现机制以及设置 Feign Client 的扫描包位置[^2]。 #### 创建 Feign Client 进行远程调用 创建一个接口来代表目标服务的方法签名,并标注为 @FeignClient 来指示这是对外部服务的访问入口之一: ```java package com.example.feignclients; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name="service-b", fallbackFactory=ServiceBFallbackFactory.class) public interface ServiceBClient { @GetMapping("/greeting") String getGreeting(); } ``` 在此处,“name”属性应匹配被调用方的服务名;fallbackFactory 提供了一种优雅降级处理方式当网络异常等情况发生时[^2]。 #### 设置 Ribbon 的负载均衡策略 虽然现代推荐采用更灵活的方式比如 Spring Cloud Load Balancer 替代传统 Ribbon,但如果仍希望沿用,则可以通过修改 YAML 文件调整其内部工作模式至轮询或者随机形式如下所示: ```yaml ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 使用随机规则替代默认加权响应时间规则 ``` 以上更改使得每次请求都会依据设定好的算法挑选不同的实例执行任务,达到分摊压力的目的。 ### 总结 综上所述,借助于 Nacos 强大的特性集成了完整的解决方案流程——从基础环境准备到高级特性的定制化开发均得以覆盖。最终实现了基于 Spring Cloud 架构下的高效稳定系统构建方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值