# mall **Repository Path**: T-Akie/mall ## Basic Information - **Project Name**: mall - **Description**: Java项目《谷粒商城》谷粒商城是一个B2C模式的电商平台,分布式高可用架构实战 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-10-13 - **Last Updated**: 2023-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 前言:学习进度持续更新中..... 2021-11-30 ``` 视频P2 安装线上服务器Docker环境,了解项目介绍 ``` 2021-12-01 ``` 视频P3-P20 搭建mall-common、mall-coupon、mall-member、mall-order、mall-product、mall-ware服务、MySQL、Redis、Nacos ``` 2021-12-02 ``` 视频P21-P47 搭建mall-gateway、renren-fast ``` 2021-12-03 ``` 视频P48-54 商品服务:后台管理分类开发 ``` 2021-12-04 ``` 视频P54-64 商品服务:商品分类管理、mall-tripartite(集成七牛云云存储) 配置中心管理OSS密钥、商品品牌管理(未完成) ``` 2021-12-05 ``` 视频P64-75 添加JSR303参数校验、全局异常处理、分页集成 商品服务:商品品牌管理(完成)、平台属性(未完成)、属性分组(未完成) ``` 2021-12-06 ``` 视频P75-77 商品服务:规格参数(【修改】待完成) ``` 2021-12-07 ``` 视频P78-83 商品服务:属性分组、规格参数、销售属性开发完成 ``` 2021-12-08 ``` 视频P84-88 商品服务:发布商品(前端) ``` 2021-12-09 ``` 视频P88-93 商品服务:发布商品 sku spu 列表展示 ``` 2021-12-10 ``` 视频P94-100(98,99 TODO) 库存服务开发 ``` 2021-12-11 ``` 视频P101-123 elk安装 ``` 2021-12-12 ``` 加班。。。 ``` 2021-12-13 ``` 视频P124-130 集成elasticsearch mall-search服务 ``` 2021-12-14 ``` 视频P131-133 商品上架 发送数据到elasticsearch 用于前台检索 修改数据库对应商品状态 ``` 2021-12-15 ``` 视频P133-146 商品上架编写完成 Nginx Gateway反向代理 负载均衡 Jmeter性能测试与jvisualvm性能监控 JVM性能调优 ``` 2021-12-16-2021-12-22 ```txt 视频P146-170 Redisson 分布式锁 ``` 2021-12-23 ``` 视频P170-P178 商品检索服务页面搭建-ES_DSL语句编写 ``` 2021-12-29 ``` 视频P178-P181 商品全文检索 dsl语句编写测试 ``` ## 一、环境搭建 ### 1.Docker-compose安装 ```shell curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose # 常用命令 docker-compose -f docker-compose.yml up -d ``` ### 2.Mysql安装 ```yaml version: '3' services: mysql: image: mysql:5.7.25 restart: always ports: - 3306:3306 container_name: mysql-master environment: MYSQL_ROOT_PASSWORD: Lj980624 TZ: Asia/Shanghai volumes: - /docker/data/mysql/conf:/etc/mysql - /docker/data/mysql/log:/var/log/mysql - /docker/data/mysql/data:/var/lib/mysql/ ``` ### 3.Redis安装 ```yaml version: '3' services: redis: image: redis container_name: redis restart: always ports: - 6379:6379 volumes: - /docker/docker-compose/redis/redis.conf:/etc/redis/redis.conf - /docker/docker-compose/redis/data:/data command: /bin/bash -c "redis-server /etc/redis/redis.conf " ``` ### 3.Nacos安装 Alibaba文档: https://github.com/alibaba/spring-cloud-alibaba #### 1.docker-compose ```yaml version: '3.7' services: nacos: image: nacos/nacos-server container_name: nacos restart: always environment: # PREFER_HOST_MODE: hostname #如果支持主机名可以使用hostname,否则使用ip,默认也是ip SPRING_DATASOURCE_PLATFORM: mysql #数据源平台 仅支持mysql或不保存empty MODE: standalone JVM_XMS: 512m JVM_MMS: 320m volumes: - /docker/data/nacos/logs/:/home/nacos/logs - /docker/data/nacos/plugins/:/home/nacos/plugins - /docker/data/nacos/conf/application.properties:/home/nacos/conf/application.properties ports: - 8848:8848 ``` #### 2.Naocs初始化sql ```sql /* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info */ /******************************************/ CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(255) DEFAULT NULL, `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `c_desc` varchar(256) DEFAULT NULL, `c_use` varchar(64) DEFAULT NULL, `effect` varchar(64) DEFAULT NULL, `type` varchar(64) DEFAULT NULL, `c_schema` text, PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_aggr */ /******************************************/ CREATE TABLE `config_info_aggr` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(255) NOT NULL COMMENT 'group_id', `datum_id` varchar(255) NOT NULL COMMENT 'datum_id', `content` longtext NOT NULL COMMENT '内容', `gmt_modified` datetime NOT NULL COMMENT '修改时间', `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_beta */ /******************************************/ CREATE TABLE `config_info_beta` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_tag */ /******************************************/ CREATE TABLE `config_info_tag` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `tag_id` varchar(128) NOT NULL COMMENT 'tag_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_tags_relation */ /******************************************/ CREATE TABLE `config_tags_relation` ( `id` bigint(20) NOT NULL COMMENT 'id', `tag_name` varchar(128) NOT NULL COMMENT 'tag_name', `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `nid` bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`nid`), UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = group_capacity */ /******************************************/ CREATE TABLE `group_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_group_id` (`group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = his_config_info */ /******************************************/ CREATE TABLE `his_config_info` ( `id` bigint(64) unsigned NOT NULL, `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `data_id` varchar(255) NOT NULL, `group_id` varchar(128) NOT NULL, `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL, `md5` varchar(32) DEFAULT NULL, `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `src_user` text, `src_ip` varchar(50) DEFAULT NULL, `op_type` char(10) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`nid`), KEY `idx_gmt_create` (`gmt_create`), KEY `idx_gmt_modified` (`gmt_modified`), KEY `idx_did` (`data_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = tenant_capacity */ /******************************************/ CREATE TABLE `tenant_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; CREATE TABLE `tenant_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `kp` varchar(128) NOT NULL COMMENT 'kp', `tenant_id` varchar(128) default '' COMMENT 'tenant_id', `tenant_name` varchar(128) default '' COMMENT 'tenant_name', `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc', `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source', `gmt_create` bigint(20) NOT NULL COMMENT '创建时间', `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; CREATE TABLE `users` ( `username` varchar(50) NOT NULL PRIMARY KEY, `password` varchar(500) NOT NULL, `enabled` boolean NOT NULL ); CREATE TABLE `roles` ( `username` varchar(50) NOT NULL, `role` varchar(50) NOT NULL, UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE ); CREATE TABLE `permissions` ( `role` varchar(50) NOT NULL, `resource` varchar(255) NOT NULL, `action` varchar(8) NOT NULL, UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE ); INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN'); ``` #### 3.application.proerties ```properties # # Copyright 1999-2018 Alibaba Group Holding Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # #*************** Spring Boot Related Configurations ***************# ### Default web context path: # 访问路径 server.servlet.contextPath=/nacos ### Default web server port: # 服务端口 server.port=8848 #*************** Network Related Configurations ***************# ### If prefer hostname over ip for Nacos server addresses in cluster.conf: # 从cluster.conf配置文件中获取IP(集群模式) # nacos.inetutils.prefer-hostname-over-ip=false ### Specify local server's IP: # 设置nacos的ip # nacos.inetutils.ip-address= #*************** Config Module Related Configurations ***************# ### If user MySQL as datasource: # 数据库类型 spring.datasource.platform=mysql ### Count of DB: # 数据库数量 db.num=1 ### Connect URL of DB: # 数据库连接URL db.url.0=jdbc:mysql://xx:3306/mall_nacos?characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC # 数据库用户 db.user=root # 数据库密码 db.password=xx #*************** Naming Module Related Configurations ***************# ### Data dispatch task execution period in milliseconds: # 同步任务生成的周期,单位为毫秒 # nacos.naming.distro.taskDispatchPeriod=200 ### Data count of batch sync task: # 同步任务每批的key的数目 # nacos.naming.distro.batchSyncKeyCount=1000 ### Retry delay in milliseconds if sync task failed: # 同步任务失败的重试间隔,单位为毫秒 # nacos.naming.distro.syncRetryDelay=5000 ### If enable data warmup. If set to false, the server would accept request without local data preparation: # 是否在Server启动时进行数据预热 # nacos.naming.data.warmup=true ### If enable the instance auto expiration, kind like of health check of instance: # 是否自动摘除临时实例 # nacos.naming.expireInstance=true #是否自动清理不在线服务 nacos.naming.empty-service.auto-clean=true # 清理延迟时间 nacos.naming.empty-service.clean.initial-delay-ms=50000 # 清理间隔时间 nacos.naming.empty-service.clean.period-time-ms=30000 #*************** CMDB Module Related Configurations ***************# ### The interval to dump external CMDB in seconds: # 全量dump的间隔,单位为秒 # nacos.cmdb.dumpTaskInterval=3600 ### The interval of polling data change event in seconds: # 变更事件的拉取间隔,单位为秒 # nacos.cmdb.eventTaskInterval=10 ### The interval of loading labels in seconds: # 标签集合的拉取间隔,单位为秒 # nacos.cmdb.labelTaskInterval=300 ### If turn on data loading task: # 是否打开CMDB # nacos.cmdb.loadDataAtStart=false #*************** Metrics Related Configurations ***************# ### Metrics for prometheus # 监控端点 #management.endpoints.web.exposure.include=* ### Metrics for elastic search # 是否导出监控数据到ES management.metrics.export.elastic.enabled=false # ES地址 #management.metrics.export.elastic.host=http://localhost:9200 ### Metrics for influx # 是否导出监控数据到influxdb(一款时序数据库) management.metrics.export.influx.enabled=false # 数据库名 #management.metrics.export.influx.db=springboot # 数据库地址 #management.metrics.export.influx.uri=http://localhost:8086 # 是否自动创建数据库 #management.metrics.export.influx.auto-create-db=true # 为每个点编写一致性 #management.metrics.export.influx.consistency=one # 是否启用发布到Influx的指标批次的GZIP压缩 #management.metrics.export.influx.compressed=true #*************** Access Log Related Configurations ***************# ### If turn on the access log: # 是否打印access日志 server.tomcat.accesslog.enabled=true ### The access log pattern: # 日志打印格式 server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i ### The directory of access log: # 日志存储目录 server.tomcat.basedir= #*************** Access Control Related Configurations ***************# ### If enable spring security, this option is deprecated in 1.2.0: # 开启security框架访问控制 #spring.security.enabled=false ### The ignore urls of auth, is deprecated in 1.2.0: # 配置security放行路径 nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/** ### The auth system to use, currently only 'nacos' is supported: # 系统授权认证类型 nacos.core.auth.system.type=nacos ### If turn on auth system: # 是否开启授权 nacos.core.auth.enabled=false ### The token expiration in seconds: # 令牌失效时间 nacos.core.auth.default.token.expire.seconds=18000 ### The default token: # 默认访问密钥 nacos.core.auth.default.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789 ### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay. # 更新授权信息后的延迟时间 nacos.core.auth.caching.enabled=true #*************** Istio Related Configurations ***************# ### If turn on the MCP server: # 是否开启MCP nacos.istio.mcp.server.enabled=false ###*************** Add from 1.3.0 ***************### #*************** Core Related Configurations ***************# ### set the WorkerID manually # 数据的主键雪花ID # nacos.core.snowflake.worker-id= ### Member-MetaData # nacos.core.member.meta.site= # nacos.core.member.meta.adweight= # nacos.core.member.meta.weight= ### MemberLookup ### Addressing pattern category, If set, the priority is highest # 寻址模式类型 # nacos.core.member.lookup.type=[file,address-server,discovery] ## Set the cluster list with a configuration file or command-line argument # 使用配置文件或命令行参数设置群集列表 # nacos.member.list=192.168.16.101:8847?raft_port=8807,192.168.16.101?raft_port=8808,192.168.16.101:8849?raft_port=8809 ## for DiscoveryMemberLookup # If you want to use cluster node self-discovery, turn this parameter on # 自动寻址 # nacos.member.discovery=false ## for AddressServerMemberLookup # Maximum number of retries to query the address server upon initialization # 初始化时查询地址服务器的最大重试次数 # nacos.core.address-server.retry=5 #*************** JRaft Related Configurations ***************# ### Sets the Raft cluster election timeout, default value is 5 second # 选举超时时间 # nacos.core.protocol.raft.data.election_timeout_ms=5000 ### Sets the amount of time the Raft snapshot will execute periodically, default is 30 minute # 集群以中性数据快照间隔时间 # nacos.core.protocol.raft.data.snapshot_interval_secs=30 ### Requested retries, default value is 1 # 请求失败尝试次数 # nacos.core.protocol.raft.data.request_failoverRetries=1 ### raft internal worker threads # 线程个数 # nacos.core.protocol.raft.data.core_thread_num=8 ### Number of threads required for raft business request processing # 客户端线程请求数 # nacos.core.protocol.raft.data.cli_service_thread_num=4 ### raft linear read strategy, defaults to index # 一致性线性读策略 # nacos.core.protocol.raft.data.read_index_type=ReadOnlySafe ### rpc request timeout, default 5 seconds # RPC 请求超时时间 # nacos.core.protocol.raft.data.rpc_request_timeout_ms=5000 ``` #### 4.Es+Kibana+logstash ```yml version: '3' services: elasticsearch: image: elasticsearch:7.9.2 restart: always networks: - net-es container_name: elasticsearch volumes: - /docker/data/elk/es/data:/usr/share/elasticsearch/data - /docker/data/elk/es/plugins:/usr/share/elasticsearch/plugins - /docker/data/elk/es/config:/usr/share/elasticsearch/config - /docker/data/elk/es/logs:/usr/share/elasticsearch/logs environment: - cluster.name=elasticsearch - ES_JAVA_OPTS=-Xms512m -Xmx1024m - discovery.type=single-node ports: - 9200:9200 #java、集群通信端口 - 9300:9300 #http通信端口 privileged: true kibana: image: kibana:7.9.2 container_name: kibana restart: always networks: - net-es depends_on: - elasticsearch volumes: - /docker/data/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml environment: - ELASTICSEARCH_URL=http://elasticsearch:9200 #设置访问elasticsearch的地址 ports: - 5601:5601 networks: - net-es logstash: image: logstash:7.9.2 container_name: logstash command: logstash environment: - elasticsearch.hosts=http://elasticsearch:9200 # 解决logstash监控连接报错 - xpack.monitoring.elasticsearch.hosts=http://elasticsearch:9200 volumes: ###将本机目录/opt/elk/logstach/pipeline下的文件映射到docker容器里面 - /docker/data/elk/logstash/config:/usr/share/logstash/config - /docker/data/elk/logstash/data:/usr/share/logstash/data - /docker/data/elk/logstash/pipelines:/usr/share/logstash/pipelines - /docker/data/elk/logstash/lastid:/usr/share/logstash/lastid - /docker/data/elk/logstash/esmapping:/usr/share/logstash/esmapping - /docker/data/elk/logstash/driver:/usr/share/logstash/driver depends_on: - elasticsearch networks: - net-es networks: net-es: ``` #### 5.毕业版本依赖关系(推荐使用) | Spring Cloud Version | Spring Cloud Alibaba Version | Spring Boot Version | | --------------------------- | ---------------------------- | ------------------- | | Spring Cloud 2020.0.1 | 2021.1 | 2.4.2 | | Spring Cloud Hoxton.SR9 | 2.2.6.RELEASE | 2.3.2.RELEASE | | Spring Cloud Greenwich.SR6 | 2.1.4.RELEASE | 2.1.13.RELEASE | | Spring Cloud Hoxton.SR3 | 2.2.1.RELEASE | 2.2.5.RELEASE | | Spring Cloud Hoxton.RELEASE | 2.2.0.RELEASE | 2.2.X.RELEASE | | Spring Cloud Greenwich | 2.1.2.RELEASE | 2.1.X.RELEASE | | Spring Cloud Finchley | 2.0.4.RELEASE(停止维护,建议升级) | 2.0.X.RELEASE | | Spring Cloud Edgware | 1.5.1.RELEASE(停止维护,建议升级) | 1.5.X.RELEASE | ## 二、SpringCloud集成 ### 1.Nacos注册中心 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-discovery.adoc ### 2.Nacos配置中心 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc ### 3.Gateway网关 https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.3.RELEASE/single/spring-cloud-gateway.html#gateway-starter ## 三、问题记录 ### 1.Gateway跨域 添加在Gateway工程内添加跨域配置类 在代理微服务删除掉跨域配置类:因为在网关跨域过滤器阶段会对请求头添加允许跨域值,代理服务再次添加跨域请求头,导致一个Key对应多个值,导致跨域报错 ```java package com.atguigu.mall.gateway.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import java.util.Collections; @Configuration public class CorsConfig { @Bean public CorsWebFilter corsWebFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); // 允许发送 Cookie config.addAllowedMethod("*"); config.setAllowedHeaders(Collections.singletonList("*")); // 允许所有请求 Header config.setAllowedOrigins(Collections.singletonList("*")); // 允许所有请求来源 // config.setMaxAge(1800L); // 有效期 1800 秒 source.registerCorsConfiguration("/**", config); return new CorsWebFilter(source); // 创建 CorsFilter 过滤器 } } ``` ### 2.ID_WORKER 生成主键太长导致 js 精度丢失 ```java package com.atguigu.mall.product.config; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class HttpMessageConverterConfig{ @Bean public ObjectMapper objectMapper() { final ObjectMapper objectMapper = new ObjectMapper(); // 添加此配置,解决返回的json字符串中的某个键值对无法在实体类中找到对应属性的问题 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); return objectMapper; } } ``` ### 3.Elasticsearch Nested类型 ```json 嵌套对象数组必须设置Nested 类型 否则 es 将会对默认类型进行扁平化处理, 导致检索结果异常 { "title": [ invest, money ], "body": [ as, investing, money, please, soon, start ], "tags": [ invest, money ], "published_on": [ 18 Oct 2017 ] "comments.name": [ smith, john, william ], "comments.comment": [ after, article, good, i, investing, nice, post, reading, started, this, very ], "comments.age": [ 33, 34, 38 ], "comments.rating": [ 7, 8, 9 ], "comments.commented_on": [ 20 Nov 2017, 25 Nov 2017, 30 Nov 2comments.name和comments.age之间的关系已丢失。comments.name和comments.age之间的关系已丢失。comments.name和comments.age之间的关系已丢失。017 ] } ``` ## 四、笔记 ### 1.数据库设计 #### 1.1商品管理 ![image-20211205185632862](https://gitee.com/LJKPI_admin/images-storage/raw/master/img/image-20211205185632862.png) ### 2.Object划分规范 #### 1.PO(persistantobject)持久对象 ``` PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。 ``` #### 2.DO(DomainObject)领域对象 ``` 就是从现实世界中抽象出来的有形或无形的业务实体。 ``` #### 3.TO(TransferObject),数据传输对象 ``` 微服务调用 不同的应用程序之间传输的对象 ``` #### 4.DTO(DataTransferObject)数据传输对象 ``` 这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,泛指用于展示层与服务层之间的数据传输对象。 ``` #### 5.VO(valueobject)值对象 ``` 接受页面 传输于页面 通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要。用new关键字创建,由GC回收的。 ``` #### 6.BO(businessobject)业务对象 ``` 从业务模型的角度看,见UML元件领域模型中的领域对象。封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作。businessobject:业务对象主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。比如一个简历,有教育经历、工作经历、社会关系等等。我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。建立一个对应简历的BO对象处理简历,每个BO包含这些PO。这样处理业务逻辑时,我们就可以针对BO去处理。 ``` #### 7.POJO是DO/DTO/BO/VO的统称。 ``` POJO是DO/DTO/BO/VO的统称。 ``` ### 3.发布商品流程 ``` 涉及本地事务: 分布式事务 1.保存spu 基本信息 pms_sku_info 2.保存spu图片 描述 pms_spu_info_desc 3.保存spu 图片集 pms_spu_images 4.保存spu 规格参数 pms_product_attr_value 5.保存 spu 积分信息 mall_sms sms_spu_bounds 6.保存 spu 对应的 sku 信息 6.1 sku 基本信息 pms_sku_info 6.2 sku 基本信息 pms_sku_images 6.3 sku 销售属性 pms_sku_sale_attr_value 7.sku 优惠信息 mall_sms 7.1 sms_sku_ladder sku 打折表 7.2 sms_sku_full_reduction 满减表 7.3 sms_member_price 会员价格表 7.4 sms_spu_bounds 积分表 ``` ### 4.Nginx负载均衡网关代理 ```apacheconf #nginx 对应多个网关实现负载均衡 #各个应用服务通过网关调用 注册中心实现负载均衡 #网关代理 细粒度代理配置[从细到粗]以免被粗粒度过滤器转发掉 upstream gateway { server 127.0.0.1:8080; server 127.0.0.1:8081; } server { listen 80; server_name mall.txzt.com; location / { proxy_pass http://gateway; index index.html index.htm index.jsp; } } ``` ### 5.吞吐量指标统计情况 | 压测内容 | 压测线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 | | ------------- | ---------- | -------- | ----------- | ----------- | | Nginx | 50 | 4508 | 11 | 12 | | Gateway | 50 | 13,085 | 5 | 10 | | 简单服务 | 50 | 25449 | 3 | 7 | | 简单服务+网关 | 50 | 5912 | 16 | 23 | | ng+gateway+sv | 50 | 2,291 | 27 | 37 | | 三级分类获取 | 50 | 2 | .. | .. | 结论: 1. 中间件越多,性能损失越大,大多损失网络交互,db 优化、 ### 6.缓存 ``` 1.读模式 缓存穿透:一直查询一个null数据 导致一直查询DB 解决方案:缓存null值 cache-null-values: true 缓存击穿:大量并发进来同时查询一个正好过期的数据,一直放给DB 解决方案:加分布式锁 缓存雪崩:大量缓存同时过期,然后大量请求一起查询这些缓存,导致DB压力过大 解决方案:加随机时间,或 加上过期时间 2.写模式(缓存与数据库一致性问题) 1.读写加锁(读多写少) 2.引入Canal,让canal模拟从库感知Mysql数据的更新。从而同步到Redis(写多) 3.读多写多 没必要加缓存,反而弄巧成拙 ``` ### 7.ES数据迁移 ``` POST _reindex { "source": { "index": "old_index" }, "dest": { "index": "new_index" } } ``` ## 五、线上服务部署情况 | 主机名称 | 服务名称 | 节点数量 | | --------------- | ----- | ---- | | 刘-116.62.242.98 | Nacos | 1 | | A-112.124 | Mysql | 1 | | A-112.124 | Redis | 1 | | T-42.192 | ELK | 1 | | | | |