尚硅谷微服务分布式电商项目《谷粒商城》基础篇

谷粒商城是一个微服务项目,总体上分为前台购物模块和后台数据管理模块。其中后台管理系统基于SpringBoot + SpringCloud + SpringCloud Alibaba + MyBatis-Plus 实现,包括:系统管理、商品系统、优惠营销、库存系统、订单系统、用户系统、内容管理等七大模块。本文基于对《谷粒商城》基础篇(后台数据管理模块)的学习,对其中所应用到的相关技术及知识点进行总结。

1.分布式基础概念

本项目主要涉及微服务、注册中心、配置中心、远程调用、Feign、网关等相关分布式基础概念

1.1微服务

微服务是一种用于构建应用的架构方案。微服务架构有别于更为传统的单体式方案,可将应用拆分成多个核心功能。每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作(和出现故障)时不会相互影响。

微服务最大的特点就是独立、自治。在本项目中每一个不同功能的项目都创建了它自己的服务,不同功能的项目可以实现并行开发、互不影响。

1.2注册中心和配置中心

注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。

配置中心:顾名思义将配置中心化,说白了就是将配置从应用中抽取出来,统一管理,优雅的解决了配置的动态变更、权限管理、持久化、运维成本等问题。

本项目中使用Nacos作为服务的注册中心和配置中心,便于服务间的互相调用和配置的统一管理。

Nacos的使用

  1. 引入相关依赖

    <!--服务的注册/发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--配置中心来做配置管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
    
  2. 添加配置文件

    spring.application.name=gulimall-product
    spring.cloud.nacos.discovery.server-addr: 127.0.0.1:8848
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    spring.cloud.nacos.config.namespace=668f4a9f-acea-4bd9-9ee4-cba0a8d98806
    
  3. 启动类添加相关注解

    @EnableDiscoveryClient
    
1.3远程调用

远程调用:在服务开发期间存在远程调用的场景,在本项目中服务的远程调用是由Feign来实现的。而使用Feign进行远程调用的前提则是服务被注册到注册中心。

Feign的使用

  1. 引入相关依赖

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 添加相关注解

     @EnableFeignClients(basePackages="包名")
    
  3. 编写远程调用类并指定远程调用的服务名和路径

    @FeignClient("gulimall-coupon")
    public interface CouponFeignService {//找到gulimall-coupon服务,给/coupon/spubounds/save发送请求。@PostMapping("/coupon/spubounds/save")R saveSpuBounds(@RequestBody SpuBoundTo spuBoundTo);
    }
    
  4. 在需要远程调用的方法中调用该方法

    R r = couponFeignService.saveSpuBounds(spuBoundTo);
    
1.4 API 网关

API 网关是一个反向路由,屏蔽内部细节,为调用者提供统一入口,接收所有调用者请求,通过路由机制转发到服务实例。

本项目中使用Gateway作为网关,所有的请求都发送给网关,由网关代理给其他服务。我们可以在网关处做很多统一的处理,如:统一的跨域解决。

Gateway使用

  1. 创建Gateway服务

  2. 将服务注册到注册中心

    spring.application.name=gulimall-gateway
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    
  3. 配置请求转发

    spring:cloud:gateway:routes:- id: product_routeuri: lb://gulimall-productpredicates:- Path=/api/product/**filters:- RewritePath=/api/(?<segment>.*),/$\{segment}
    
  4. 其他统一处理(如:统一跨域处理)

    @Configuration
    public class GulimallCorsConfiguration {@Beanpublic CorsWebFilter corsWebFilter(){UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration = new CorsConfiguration();//1.配置跨域corsConfiguration.addAllowedHeader("*");corsConfiguration.addAllowedMethod("*");corsConfiguration.addAllowedOrigin("*");corsConfiguration.setAllowCredentials(true);source.registerCorsConfiguration("/**",corsConfiguration);return new CorsWebFilter(source);}
    }
    

2.基础开发

在对后台管理系统的开发中我们使用SpringBoot 对项目进行搭建,简单使用了SpringCloud 的Nacos、Feign 、Gateway 实现项目的注册与发现、配置管理、请求转发等。前端代码则是基于Vue组件化开发,对于图片的存储我们使用了第三方服务——阿里云对象存储。

2.1 阿里云对象存储OSS

阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。

即开即用,无需维护,按量收费。

资源术语:

存储空间(Bucket):存储空间是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。

对象(Object):对象是OSS存储数据的基本单元,也被称为OSS的文件。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成,并且由存储空间内部唯一的Key来标识。

Region(地域):Region表示OSS的数据中心所在物理位置。

Endpoint(访问域名):Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同的Region的时候,需要不同的域名。通过内网和外网访问同一个Region所需要的Endpoint也是不同的。例如杭州Region的外网Endpoint是oss-cn-hangzhou.aliyuncs.com,内网Endpoint是oss-cn-hangzhou-internal.aliyuncs.com。

AccessKey(访问密钥):AccessKey简称AK,指的是访问身份验证中用到的AccessKeyId和AccessKeySecret。OSS通过使用AccessKeyId和AccessKeySecret对称加密的方法来验证某个请求的发送者身份。AccessKeyId用于标识用户;AccessKeySecret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,必须保密。

图片上传方式:

  1. 普通上传方式

  2. 服务端签名后上传

本项目选择服务端签名后上传的方式实现图片的存储功能。即保障了安全性,又避免给服务器造成过多的压力。

具体步骤:

  1. 开启RAM访问控制,创建拥有指定权限的子账户,使用子账户进行图片上传操作。

  2. 引入依赖

    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alicloud-oss</artifactId><version>2.2.0.RELEASE</version>
    </dependency>
    
  3. 编写相关配置

    spring:cloud:alicloud:secret-key: XXXXXXXXXXXXXXXXXXaccess-key: XXXXXXXXXXXXXXXXXXoss:endpoint: oss-cn-hangzhou.aliyuncs.combucket: XXXXXXXXXXX
    
  4. 按照OSS 的java SDK 编写controller

    @RestController
    public class OssController {@AutowiredOSS ossClient;//@Value("${spring.cloud.alicloud.oss.endpoint}")private String endpoint;@Value("${spring.cloud.alicloud.oss.bucket}")private String bucket;@Value("${spring.cloud.alicloud.access-key}")private String accessId;@Value("${spring.cloud.alicloud.secret-key}")private String accessKeySecret;@RequestMapping("/oss/policy")public R policy(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint// callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。//String callbackUrl = "http://88.88.88.88:8888";String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());String dir = format+"/"; // 用户上传文件时指定的前缀。Map<String, String> respMap=null;try {long expireTime = 30;long expireEndTime = System.currentTimeMillis() + expireTime * 1000;Date expiration = new Date(expireEndTime);// PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。PolicyConditions policyConds = new PolicyConditions();policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);byte[] binaryData = postPolicy.getBytes("utf-8");String encodedPolicy = BinaryUtil.toBase64String(binaryData);String postSignature = ossClient.calculatePostSignature(postPolicy);respMap = new LinkedHashMap<String, String>();respMap.put("accessid", accessId);respMap.put("policy", encodedPolicy);respMap.put("signature", postSignature);respMap.put("dir", dir);respMap.put("host", host);respMap.put("expire", String.valueOf(expireEndTime / 1000));} catch (Exception e) {// Assert.fail(e.getMessage());System.out.println(e.getMessage());} finally {ossClient.shutdown();}return R.ok().put("data",respMap);}
    }
    
  5. vue编写代码完成图片上传

3.环境

在环境的部署上,采用了Linux+Docker的方式,使用Docker来部署MySQL,在项目开发中我们使用了逆向工程&人人开源为我们快速生成基础的CURD的Controller、Service、Dao层代码以及Vue页面层的代码,开发时专注于复杂逻辑的处理即可。

3.1 Vagrant 快速构建虚拟开发环境

Vagrant是一款用于构建及配置虚拟开发环境的软件,基于Ruby,主要以命令行的方式运行。

  1. 下载Windows 64 版本的vagrant并安装

  2. 打开window cmd窗口,运行 vagrant init centos/7 即可初始化一个centos7系统

  3. 运行 vagrant up 启动虚拟环境

  4. 运行 vagrant ssh 使用vagrant账户连接虚拟机,直接在cmd窗口编写linux命令。

  5. 运行 exit 退出与虚拟机的连接

  6. 修改Vagrantfile文件中关于网络的配置 设置虚拟机ip

    config.vm.network"private_network",ip:“192.168.56.10”

3.2 安装Docker

Docker:虚拟化容器技术。基于镜像,可以秒级启动各种容器。每一种容器都是一个完整的运行环境,容器之间相互隔离。
参考网址:https://docs.docker.com/engine/install/centos/

  1. 安装docker

    1. 卸载Docker

      sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
      
    2. 安装依赖的包

      sudo yum install -y yum-utils \device-mapper-persistent-data \lvm2
      
    3. 配置docker的地址

      sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo
      
    4. 安装docker

      sudo yum install docker-ce docker-ce-cli containerd.io
      
  2. 启动docker

    sudo systemctl start docker
    
  3. 设置docker 开机自启动

    sudo systemctl enable docker
    
  4. 配置阿里云镜像加速

    sudo mkdir -p/etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {"registry-mirrors":["https://82m9ar63.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
3.3 Docker配置MySQL
  1. 下载镜像文件
sudo docker pull mysql:5.7
  1. 创建实例并启动

    docker run -p 3306:3306 --name mysql \
    -v /mydata/mysql/log:/var/log/mysql \
    -v /mydata/mysql/data:/var/lib/mysql \
    -v /mydata/mysql/conf:/etc/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7
    

    参数说明:
    -p 3306:3306 :将容器的3306端口映射到主机的3306端口
    -v /mydata/mysql/log:/var/log/mysql :将配置文件挂载到主机
    -v /mydata/mysql/data:/var/lib/mysql :将日志文件夹挂载到主机
    -v /mydata/mysql/conf:/etc/mysql :将配置文件夹挂载到主机
    -e MYSQL_ROOT_PASSWORD=root :初始化root用户的密码为root

  2. 配置utf-8编码

    vi /mydata/conf/my.cnf
    

    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    [mysqld]
    init_connect=‘SET collation_connection = utf8_unicode_ci’
    init_connect=‘SET NAMES utf8’
    character-set-server=utf8
    collation-server=utf8_unicode_ci
    skip-character-set-client-handshake
    skip-name-resolve

  3. 重启容器

    docker restart mysql
    

4.开发规范

对于数据的新增与修改使用JSR303进行数据校验,配置全局的异常处理、统一返回和跨域处理,将项目中固定的状态使用枚举进行编写。项目中还使用了Mybatis-Plus的逻辑删除功能。

4.1 JSR303数据校验
  1. 给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示

  2. 开启校验功能@Valid
    效果:校验错误以后会有默认的响应;

        @RequestMapping("/save")@RequiresPermissions("product:brand:save")public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand){brandService.save(brand);return R.ok();}
    
  3. 给校验的bean后紧跟一个BindingResult,就可以获取到校验的结果

  4. 分组校验(多场景的复杂校验)

    1. @NotBlank(message = “品牌名必须提交”,groups = {AddGroup.class,UpdateGroup.class})
      给校验注解标注什么情况需要进行校验
    2. @Validated({AddGroup.class})
    3. 默认没有指定分组的校验注解@NotBlank,在分组校验情况@Validated({AddGroup.class})下不生效,只会在@Validated生效;
  5. 自定义校验

    1. 编写一个自定义的校验注解
    2. 编写一个自定义的校验器 ConstraintValidator
    3. 关联自定义的校验器和自定义的校验注解
    @Documented
    @Constraint(validatedBy = { ListValueConstraintValidator.class })
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
    @Retention(RUNTIME)
    public @interface ListValue {String message() default "{com.atguigu.common.valid.ListValue.message}";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };int[] vals() default { };
    }
4.2 Mybatis-Plus逻辑删除功能
  1. 配置全局的逻辑删除规则(可省略)

    mybatis-plus:global-config:db-config:id-type: autologic-delete-value: 1 # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    
  2. 给Bean加上逻辑删除注解@TableLogic

    /**配置特定的逻辑删除状态* 是否显示[0-不显示,1显示]*/
    @TableLogic(value = "1",delval = "0")private Integer showStatus;
    
4.3 统一的异常处理
  1. 编写异常处理类,使用@ControllerAdvice。
  2. 使用@ExceptionHandler标注方法可以处理的异常。
  3. 例如对数据校验做统一的异常处理:
@Slf4j
@RestControllerAdvice(basePackages = "com.jiaozi.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {@ExceptionHandler(value= MethodArgumentNotValidException.class)public R handleVaildException(MethodArgumentNotValidException e){log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass());BindingResult bindingResult = e.getBindingResult();Map<String,String> errorMap = new HashMap<>();bindingResult.getFieldErrors().forEach((fieldError)->{errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());});return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",errorMap);}}

尚硅谷微服务分布式电商项目《谷粒商城》基础篇学习总结相关推荐

  1. 尚硅谷2020微服务分布式电商项目《谷粒商城》学习笔记

    尚硅谷2020微服务分布式电商项目<谷粒商城> 项目简介 资料 百度云 链接:https://pan.baidu.com/s/1eGCTi6pLtKbDCwBs-zCOzQ 提取码:1pm ...

  2. 尚硅谷2020微服务分布式电商项目《谷粒商城》-单点登录(jwt)

    学习更多的知识,整理不易,拒绝白嫖,记得三连哦 关注公众号:java星星 获取全套课件资料 1. 用户管理提供数据接口 1.1. 数据验证功能 根据接口文档知: 请求方式:GET 请求路径:check ...

  3. 尚硅谷2020微服务分布式电商项目《谷粒商城》-商品搜索

    关注公众号:java星星 获取全套课件资料 1. 导入商品数据 1.1. 搭建搜索工程 pom.xml内容如下: <?xml version="1.0" encoding=& ...

  4. 尚硅谷2020微服务分布式电商项目《谷粒商城》-支付、秒杀

    学习更多的知识,整理不易,拒绝白嫖,记得三连哦 关注公众号:java星星 获取全套课件资料 1. 支付 订单搞定之后就是支付了,首先搭建支付工程. 1.1. 搭建环境 pom.xml <?xml ...

  5. 谷粒商城 - 微服务分布式电商项目

    谷粒商城 1.项目背景 谷粒商城项目是尚硅谷研究院最新推出的完整大型分布式架构电商平台,技术全面.业务深入,全网无出其右.技术涵盖:微服务架构 + 分布式 + 全栈 + 集群 + 部署 + 自动化运维 ...

  6. 微服务分布式电商项目《谷粒商城》学习笔记

    文章目录 一.基本架构图 二.配置 三.项目搭建 四.数据库 1.开启虚拟机,在windows下通过navicat连接上 2.人人开源:https://gitee.com/renrenio 五.微服务 ...

  7. 分布式电商项目 谷粒商城 学习笔记<2>

    文章目录 六.三级分类 1.按照父子类的结构获取所有分类 2.跨域问题的解决 1.使用nginx部署为同一域 2.让服务器告诉预检请求能跨域 3.过滤器优先级问题 4.删除 5.增加修改拖拽 七.品牌 ...

  8. JavaEE大型分布式电商项目 上海淘淘商城 29期

    上海29期_张志君老师_淘淘商城_大型分布式电商项目 JavaEE大型分布式电商项目 淘淘商城 29期 需要的加qq:350226234,备注:程序员学习视频 ==================== ...

  9. 基于微服务的电商系统架构

    分层 微服务设计 微服务微内核 基于微服务的电商系统架构 转载于:https://www.cnblogs.com/davidwang456/articles/9221369.html

  10. 分布式电商项目五:使用人人开源搭建前后分离的后台管理系统

    分布式电商项目五:使用人人开源搭建前后分离的后台管理系统 现在我们开始搭建一个后台管理系统,使用的是码云上面的开源项目:人人开源 需要使用两个开源项目:fast和fast-vue. 使用git把需要的 ...

最新文章

  1. Iaas-Paas-Saas
  2. slicer安装_3D Slicer教程【软件安装及设置】
  3. QT乱码总结7.编码测试和总结二
  4. Python之PIL库的运用、GIF处理h
  5. springboot定时任务
  6. 网站运行怎么选服务器,wordpress外贸建站服务器怎么选
  7. 远程断点调试不需要跟时间赛跑
  8. matlab中ahp方法,AHP及matlab程序.doc
  9. qsocket 指定网卡_QSocket
  10. C#网络Socket编程
  11. table添加一行且可编辑 vue_vue表格添加可编辑的一行后如何得到整个表格的数据...
  12. 万事俱备只欠东风 区块链数字资产一定是财富的未来!
  13. [浪曦原创]GXT(EXT GWT)系列 视频下载
  14. FinsTCP协议的Java Socket
  15. 【mysql】查询本月和去年同期数据SQL
  16. 86版《西游记》“红孩儿”成中科院博士!名下52家公司不愧是牛魔王的娃
  17. C技能树:运算符优先级与求值顺序
  18. OpenCV开发笔记(六十七):红胖子8分钟带你深入了解特征点暴力匹配(图文并茂+浅显易懂+程序源码)
  19. 基于Citespace软件对WOS文献数据进行可视化的操作
  20. 从零开始详解应用内支付——商品创建及测试上架

热门文章

  1. 海思Hi3519A SVP从入门到精通(一 概述)
  2. 吉比特H2-3光猫破解超级密码
  3. Python 进阶 — Flake8 静态代码检查工具
  4. GPRS RTU设备OPC Server接口C# 实现
  5. RLC电阻电容电感基础知识——电感篇
  6. NRF52840开发注意
  7. php的word插件,实现word在线预览 有php的写法 也有插件似
  8. 基于Android的Word在线预览
  9. Linux:configure: error: OpenSSL libcrypto not found
  10. 通过REST API修改JUNOS的配置