目录

⼀、锋迷商城在互联⽹环境下存在的问题

1.1 ⾼并发带来的服务器访问压⼒问题

1.2 ⾼并发带来的业务处理问题

1.3 系统迭代带来的架构问题

1.4 业务实现问题

1.5 如何解决以上问题?

⼆、使⽤redis缓存商品详情

2.1 在service⼦⼯程添加Spring data redis依赖

2.2 在application.yml配置redis数据源

2.3 在ProductServiceImpl中修改业务代码

三、使⽤redis缓存平台⾸⻚数据

3.1 什么样的数据适合⽤缓存?

3.2 缓存⾸⻚轮播图信息

3.2 缓存⾸⻚分类列表信息

四、使⽤redis实现分布式会话

五、使⽤ES实现商品检索

5.1 在锋迷商城项⽬导⼊ES

5.2 将商品信息导⼊到ES

5.2.1 查询所有商品信息

5.2.2 定义ES存储数据的对象结构

5.2.3 代码实现

5.3 从ES中进⾏商品的检索

5.3.1 接⼝实现

5.3.2 前端实现

六、《锋迷商城》微服务拆分

6.1 微服务拆分架构

6.2 搭建服务注册与发现中⼼

6.2.1 创建SpringBoot应⽤,添加如下依赖

6.2.2 配置application.yml

6.2.3 在启动类添加注解

6.2.4 配置SpringSecurity

七、⽤户登录业务-微服务拆分

7.1创建⽤户登录接⼝服务

7.1.1 创建api-user-login服务

7.1.2 配置application.yml

7.1.3 在启动类添加注解

7.2 创建⽤户信息查询服务

7.2.1 创建 user-check 服务

7.2.2 配置application.yml

7.2.3 在启动类添加注解

7.3 完成⽤户查询服务的开发

⼋、⽤户注册业务-微服务拆分

8.1 创建⽤户注册接⼝服务

8.1.1 创建api-user-regist服务

8.1.2 配置application.yml

8.1.3 启动添加注解

8.2 创建保存⽤户信息服务

8.2.1 创建user-save服务

8.2.2 配置application.yml

8.2.3 在启动类添加注解


⼀、锋迷商城在互联⽹环境下存在的问题

⼀个成功的互联⽹项⽬,平台⽤户会不断的积累和提升,当⽤户量不断增多的过程中,
同时使⽤平台系统的⽤户 也会增多 —— 并发访问

1.1 ⾼并发带来的服务器访问压⼒问题

⼀个电商平台在互联⽹环境下⾸先要应对的是⾼并发访问的问题,⾼并发访问会为我们的系
统带来哪些压⼒呢?
  • 前端服务器并发访问压⼒
  • 应⽤服务器并发访问压⼒
  • 数据库服务器并发访问压⼒

1.2 ⾼并发带来的业务处理问题

  • ⾸⻚-数据加载效率 (redis缓存)
  • 商品搜索功能—模糊查询—查询效率低问题
  • 订单查询—订单的数据量会随着⽤户的增多⼤量增加—查询效率低问题
  • 商品购买—分布并发访问—产品超卖问题 (redis分布式锁)

1.3 系统迭代带来的架构问题

⼀个成功的应⽤ — 系统功能不断的增加 — 单点故障问题

1.4 业务实现问题

  • 登录功能—缓存⽤户信息、⽤户登录失效(redis 分布式会话—共享session)
  • 订单超时取消—使⽤quartz定时任务进⾏轮询—性能

1.5 如何解决以上问题?

  • Nginx集群\Tomcat集群 (✔)
  • Redis缓存数据库(✔)
  • ElasticSearch搜索引擎(✔)
  • 分布式系统⽤户登录问题(✔)
  • 分布式锁(✔)
  • MyCat分布式数据库
  • 微服务架构
  • 分布式事务
  • 消息队列(延时任务、服务通信)
  • 容器化技术docker
  • 优化(MySQ\Tomcat)

⼆、使⽤redis缓存商品详情

2.1 service⼦⼯程添加Spring data redis依赖

<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-starter-data-redis </artifactId>
</dependency>

2.2 application.yml配置redis数据源

spring :
datasource :
druid :
driver-class-name : com.mysql.jdbc.Driver
## 如果后端项⽬服务器和数据库服务器不在同⼀台主机,则需要修改 localhost 为数
据库服务器 ip 地址
url : jdbc : mysql : //localhost : 3306/fmmall2?characterEncoding=utf-8
username : root
password : admin123
redis :
port : 6379
host : 47.96.11.185
database : 0
password : 123456

2.3 ProductServiceImpl中修改业务代码

说明:
在电商系统中,为了提⾼商品详情的查询速度、减少对数据库的并发访问压⼒,我们可以使
⽤ redis 来缓存商品详情,除此以外我们还可以⽤ ⻚⾯静态化 技术来达到此⽬的。
රᙙ᲋܉ Java රᎸᴺ ىဳلռݩ̓ Java ຝ຅຾̈́ӥ᫹ಅํ᧞ᑕդᎱ᧞կ݊ૡٍ ᦏದ๞ࢧ୭๜ᧆํጱᕍᶉѺ ⻚⾯静态化:将数据库中每条数据结合模版⽣成单独的 HTML ⽂件进⾏存储(⼀条数据对应⼀
个独⽴的 HTML ⽂件),当⽤户访问数据时,直接访问不同的静态 HTML ⽂件即可。

三、使⽤redis缓存平台⾸⻚数据

3.1 什么样的数据适合⽤缓存?

因为缓存中的数据需要进⾏数据⼀致性的维护 — 即:当数据库数据发⽣变化,要同步更
新缓存中的数据
因此
对于数据的写操作较少、但是会频繁的查询的数据适合使⽤缓存
对于可能会发⽣修改,但是对数据⼀致性要求不⾼的数据也适合使⽤缓存

3.2 缓存⾸⻚轮播图信息

3.2 缓存⾸⻚分类列表信息

四、使⽤redis实现分布式会话

五、使⽤ES实现商品检索

5.1 在锋迷商城项⽬导⼊ES

  • 在service⼦⼯程添加依赖
<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-starter-data-elasticsearch </artifactId>
</dependency>
  • 在api⼦⼯程的application.yml配置ES服务器地址
spring :
elasticsearch :
rest :
uris : http : //47.96.11.185 : 9200

5.2 将商品信息导⼊到ES

  • 如果商品表中没有数据,则在平台管理系统中的商品添加功能中,当商家向商品表 添加并上架⼀个商品时同步向ES添加⼀个商品;商家下架⼀个商品就从ES中删除⼀个商品。
  • 系统运⾏前期数据量⼩没有使⽤ES,当数据量增⻓之后使⽤ES时,需要将数据库现有的数据导⼊到ES(导⼊⼯作需要在项⽬部署到⽣产环境之前来完成)

5.2.1 查询所有商品信息

5.2.2 定义ES存储数据的对象结构

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product4ES {private String productId;private String productName;private String productImg;private int soldNum;private String productSkuName;private double productSkuPrice; }

5.2.3 代码实现

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApiApplication.class)
public class ImportProductInfoIntoES {@Autowiredprivate RestHighLevelClient restHighLevelClient;@Autowiredprivate ProductMapper productMapper;@Autowiredprivate ObjectMapper objectMapper;@Testpublic void testCreateIndex() throws IOException {//创建索引CreateIndexRequest createIndexRequest = new
CreateIndexRequest("fmmallproductsindex");CreateIndexResponse createIndexResponse =
restHighLevelClient.indices().create(createIndexRequest,
RequestOptions.DEFAULT);System.out.println(createIndexResponse.isAcknowledged());}@Testpublic void testImportData() throws IOException {//1.从数据库查询数据List<ProductVO> productVOS = productMapper.selectProducts();System.out.println(productVOS.size());//2.将查询到数据写⼊到ESfor (int i = 0; i <productVOS.size() ; i++) {ProductVO productVO = productVOS.get(i);String productId = productVO.getProductId();String productName = productVO.getProductName();Integer soldNum = productVO.getSoldNum();List<ProductSku> skus = productVO.getSkus();String skuName = skus.size()==0?"":
skus.get(0).getSkuName();String skuImg = skus.size()==0?"":skus.get(0).getSkuImg();Integer sellPrice = skus.size()==0? 0:skus.get(0).getSellPrice();Product4ES product = new
Product4ES(productId,productName,skuImg,soldNum,skuName,sellPrice);IndexRequest request = new
IndexRequest("fmmallproductsindex");request.id(productId);request.source(objectMapper.writeValueAsString(product),
XContentType.JSON);IndexResponse indexResponse =
restHighLevelClient.index(request, RequestOptions.DEFAULT);System.out.println((i+1)+"---"+indexResponse);}}
}

5.3 ES中进⾏商品的检索

5.3.1 接⼝实现

ProductServiceImpl
@Override
public ResultVO searchProduct(String kw, int pageNum, int limit) {ResultVO resultVO = null;try {//1.查询搜索结果int start = (pageNum-1)*limit;//从ES查询数据SearchRequest searchRequest = new
SearchRequest("fmmallproductsindex");SearchSourceBuilder searchSourceBuilder = new
SearchSourceBuilder();//查询条件searchSourceBuilder.query(QueryBuilders.multiMatchQuery(kw,"productNam
e","productSkuName"));//分⻚条件searchSourceBuilder.from(start);searchSourceBuilder.size(limit);//⾼亮显示HighlightBuilder highlightBuilder = new HighlightBuilder();HighlightBuilder.Field field1 = new
HighlightBuilder.Field("productName");HighlightBuilder.Field field2 = new
HighlightBuilder.Field("productSkuName");highlightBuilder.field(field1);highlightBuilder.field(field2);highlightBuilder.preTags("<label style='color:red'>");highlightBuilder.postTags("</label>");searchSourceBuilder.highlighter(highlightBuilder);searchRequest.source(searchSourceBuilder);//执⾏检索SearchResponse searchResponse =
restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);//封裝查詢結果SearchHits hits = searchResponse.getHits();//获取总记录数int count = (int)(hits.getTotalHits().value);//计算总⻚数int pageCount = count%limit==0? count/limit:count/limit+1;Iterator<SearchHit> iterator = hits.iterator();List<Product4ES> products = new ArrayList<>();while(iterator.hasNext()){SearchHit searchHit = iterator.next();Product4ES product4ES =
objectMapper.readValue(searchHit.getSourceAsString(),
Product4ES.class);//获取⾼亮字段Map<String, HighlightField> highlightFields =
searchHit.getHighlightFields();//productNameHighlightField highlightField1 =
highlightFields.get("productName");if(highlightField1!=null){String highLightProductName =
Arrays.toString(highlightField1.fragments());product4ES.setProductName(highLightProductName);}products.add(product4ES);}//4.封装,返回数据PageHelper<Product4ES> pageHelper = new PageHelper<>(count,
pageCount, products);resultVO = new ResultVO(ResStatus.OK, "SUCCESS", pageHelper);} catch (IOException e) {e.printStackTrace();}return resultVO; }

5.3.2 前端实现

<template v-for="p in products"><!--p 表示的是⼀个 Product4ES对象--><li><div class="i-pic limit" @click="toIntroduction(p.productId)"
:data-id="p.productId"><img :src="'static/pimgs/'+p.productImg" /> <p class="title fl">【<span v-html="p.productName">
</span>】{{p.productSkuName}}</p><p class="price fl"><b>¥</b><strong>{{p.productSkuPrice}}</strong></p><p class="number fl">销量<span>{{p.soldNum}}</span></p></div></li>
</template>

六、《锋迷商城》微服务拆分

随着⼀个项⽬功能的增加,结构会变得越来越复杂,我们就⾯临 单体地狱
为了提升单体项⽬的可⽤性、可扩展性、可维护性需要对项⽬进⾏微服务拆分

6.1 微服务拆分架构

6.2 搭建服务注册与发现中⼼

6.2.1 创建SpringBoot应⽤,添加如下依赖

SpringBoot 版本统⼀选择 2.3.11

6.2.2 配置application.yml

server :
port : 8761
spring :
application :
name : eureka-server
security :
user :
name : zhangsan
password : 123456
eureka :
client :
register-with-eureka : false
fetch-registry : false
service-url :
defaultZone : http : //localhost : 8761/eureka

6.2.3 在启动类添加注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

6.2.4 配置SpringSecurity

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable();//设置当前服务器的所有请求都要使⽤spring security的认证http.authorizeRequests().anyRequest().authenticated().and().httpBasic(
);}
}

七、⽤户登录业务-微服务拆分

7.1创建⽤户登录接⼝服务

7.1.1 创建api-user-login服务

如果同时使⽤熔断器,则可以同时添加 hystrix 依赖
<dependency>
<groupId> org.springframework.cloud </groupId>
<artifactId> spring-cloud-starter-netflix-hystrix </artifactId>
</dependency>

7.1.2 配置application.yml

server :
port : 8001
spring :
application :
name : api-user-login
eureka :
client :
service-url :
defaultZone : http : //zhangsan : 123456@localhost : 8761/eureka
## 开启熔断器
feign :
hystrix :
enabled : true

7.1.3 在启动类添加注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrix
public class ApiUserLoginApplication {public static void main(String[] args) {SpringApplication.run(ApiUserLoginApplication.class, args);}
}

7.2 创建⽤户信息查询服务

7.2.1 创建 user-check 服务

eureka server
mybatis mysql tkmapper
spring web
  • 如果需要使⽤tkMapper完成数据库操作,则同时添加依赖:
<dependency>
<groupId> tk.mybatis </groupId>
<artifactId> mapper-spring-boot-starter </artifactId>
<version> 2.1.5 </version>
</dependency>

7.2.2 配置application.yml

server :
port : 9001
spring :
application :
name : user-check
datasource :
driver-class-name : com.mysql.jdbc.Driver
username : root
password : admin123
url : jdbc : mysql : //localhost : 3306/fmmall2?characterEncoding=utf-8
eureka :
client :
service-url :
defaultZone : http : //zhangsan : 123456@localhost : 8761/eureka
mybatis :
mapper-locations : classpath : mappers/*Mapper.xml
type-aliases-package : com.qfedu.fmmall.entity

7.2.3 在启动类添加注解

@SpringBootApplication
@EnableEurekaClient
@MapperScan("com.qfedu.user.dao")
public class UserCheckApplication {public static void main(String[] args) {SpringApplication.run(UserCheckApplication.class, args);}
}

7.3 完成⽤户查询服务的开发

⼋、⽤户注册业务-微服务拆分

8.1 创建⽤户注册接⼝服务

8.1.1 创建api-user-regist服务

服务调⽤者

8.1.2 配置application.yml

8.1.3 启动添加注解

8.2 创建保存⽤户信息服务

8.2.1 创建user-save服务

服务提供者
進⾏數據庫操作,添加 tkmapper 及 beans 依赖
<dependency>
<groupId> com.qfedu </groupId>
<artifactId> beans </artifactId>
<version> 2.0.1 </version>
</dependency>
<!-- tkmapper -->
<dependency>
<groupId> tk.mybatis </groupId>
<artifactId> mapper-spring-boot-starter </artifactId>
<version> 2.1.5 </version>
</dependency>

8.2.2 配置application.yml

8.2.3 在启动类添加注解

  • @EnableEurekaClinet
  • @MapperScan

Java电商 《锋迷商城》分布式笔记相关推荐

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

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

  2. JAVA电商 B2B2C商城系统 多用户商城系统 直播带货 新零售商城 o2o商城 电子商务 拼团商城 分销商城

    JAVA电商 B2B2C商城系统 多用户商城系统 直播带货 新零售商城 o2o商城 电子商务 拼团商城 分销商城 1. 鸿鹄Cloud架构清单 2. Commonservice(通用服务) 通用服务: ...

  3. 毕业设计学习锋迷商城的的笔记(自己设计并手写后台商品管理,分类管理,用户,地址管理系统,订单管理,微信支付(内网穿透))

    文章目录 自己添加的后端管理页面 视频演示效果 论文地址 后台代码视频实现讲解思路 1. 商品管理 2.商品分类管理 3.商品地址管理 4.权限管理系统 权限管理系统文章地址 5.订单管理 5.1 6 ...

  4. 毕业设计学习锋迷商城笔记

    文章目录 自己添加的后端管理页面 视频演示效果 1. 商品管理 2.商品分类管理 3.商品地址管理 4.用户中心管理 4. 用户权限管理 5.订单管理 6.商品品牌管理 锋迷商城项目 1.通过Mave ...

  5. 锋迷商城项目介绍(一)

    锋迷商城项目介绍 项目模块 一.用户管理 二.首页功能实现 三.商品详情 四.购物车 五.收货地址管理 六.提交订单 七.用户中心 八.订单管理 九.评价管理 十.中心首页数据显示 项目介绍 一.项目 ...

  6. 电商项目实战之分布式事务解决方案

    电商项目实战之分布式事务解决方案 本地事务 事务隔离级别 事务传播机制 分布式事务 CAP理论 选举与同步理论 BASE理论 解决方案 2PC模式(XA事务) 柔性事务-TCC事务补偿型方案 柔性事务 ...

  7. 【session】Java电商平台开发技能图谱,探秘双十一百万PV

    您将学习 Java电商平台开发技能图谱,探秘双十一百万PV 分享内容 企业级Java开发技能图谱 从宏观到微观,Java到底怎么学 为了支撑双十一,我们对Java程序做了什么 你将认识 热爱分享的常乐 ...

  8. 如何建立个人电商网站/个人商城的支付接口

    q**q ①⑨⑨7〇7④⑥如何建立个人电商网站/个人商城的支付接口 移动支付 支付寶移動支付是指用戶可以通過移動終端對所消費的商品或服務進行賬務支付的壹種服務方式,涵蓋便民服務.金融服務.商旅出行.休 ...

  9. 五款开发Java电商系统的工具

    Java电商系统由于其稳定性和后台处理数据效率高的优势而备受运营者欢迎,Java电商系统还因为库的丰富性以及开发的便利性收受到开发者的青睐,今天这里介绍5款java网店系统的开发工具. 1.即开即用的 ...

最新文章

  1. Ansible 入门指南 - ansible-playbook 命令
  2. HTML语言的含义,HTML是什么意思
  3. linux脚本判断流程控制,linux shell awk 流程控制语句(if,for,while,do)详细介绍
  4. 新CIO:Mark Schwartz认为的领先IT
  5. Internet路由结构学习心得二:通告汇聚和具体路由影响AS入流量
  6. python机器学习库sklearn——线性回归
  7. Mac电脑下配置maven环境变量
  8. 外测要做好测试记录,并照相保留证据
  9. 2022最新短视频去水印解析API接口支持各大小程序平台分享
  10. Tensorflow-wavenet生成模拟声音
  11. 常见动词的过去式和过去分词
  12. 计算机自杀式软件--USBKill
  13. 基于python SMTP实现自动发送邮件教程解析
  14. 使用vmdk文件创建虚拟机
  15. Type mismatch Can‘t assign java.math.BigDecimal to java.lang.Double
  16. Java学习第一天:jkd安装、环境变量配置和第一个程序
  17. Android 输入法挤压屏幕解决方案
  18. PTA寒假基础题训练(含解题思路)(下)
  19. 想要年薪百万,阿里Sentinel支持RESTful接口都搞不定?
  20. Matlab使用符号对象求二元函数积分并做图

热门文章

  1. 如何入门拓扑优化研究(转自知乎 周平章博士的文章 很有启发)
  2. 弘辽科技:淘宝店铺怎么补流量单?淘宝如何快速获取流量?
  3. NXPowerLite Desktop 9(文件压缩软件)官方中文版V9.0.3 | 极品文件压缩器
  4. 小红书负面笔记下沉怎么做?小红书笔记屏蔽怎么做?
  5. 常用的NodeJS模块
  6. vue-cli 使用ueditor集成 秀米富文本
  7. synthetic Java合成类型
  8. mysql的mvvm_MVC、MVP、MVVM模式的概念与区别
  9. cmake错误集锦:add_subdirectory()
  10. 原神壁纸大全|那些你所需要的原神壁纸!