商城项目-分布式高级-04-nginx

347 阅读3分钟

+商城首页-整合thymeleaf

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

image-20201119143349248

渲染一级分类

package com.like.mall.product.controller.web;
/**
 * @author like
 * @since 2020-11-19 14:49
 * web 路径跳转
 */
@Controller
public class IndexController {
    @Resource
    CategoryService categoryService;

    @GetMapping({"/", "/index.html"})
    public String indexPage(Model model) {
        // 1.查询所有的一级分类
        List<CategoryEntity> ens = categoryService.getLevelFirstCategory();
        model.addAttribute("data",ens);
        return "index";
    }
}
    <select id="getLevelFirstCategory" resultType="com.like.mall.product.entity.CategoryEntity">
        select * from `mall-product`.pms_category
        where parent_cid = 0;
    </select>

image-20201119151335185

获取所有二级分类和三级分类的json

/**
     * 获取所有二级和三级分类的json数据
     *
     * @return {@link Map<String, List<Catelog2Vo>>}
     */
@ResponseBody
@GetMapping("/index/catalog.json")
public Map<String, List<Catelog2Vo>> getCatalogJson() {
    return categoryService.getCatalogJson();
}
}



@Override
public Map<String, List<Catelog2Vo>> getCatalogJson() {
    // 1.找出所有的一级分类
    List<CategoryEntity> level1 = getLevelFirstCategory();

    // 2.封装数据
    return level1.stream()
        .collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {
            // 3.查找当前一级分类下的二级分类
            List<CategoryEntity> level2 = baseMapper.selectList(new QueryWrapper<CategoryEntity>()
                                                                .eq("parent_cid", v.getCatId()));

            // 4.封装二级分类vo
            List<Catelog2Vo> vo2s = new ArrayList<>();
            if (level2 != null) {
                vo2s = level2.stream()
                    .map(i2 -> {
                        Catelog2Vo Vo2 = new Catelog2Vo();
                        Vo2.setCatalogId(String.valueOf(v.getCatId()));
                        Vo2.setId(i2.getCatId().toString());
                        Vo2.setName(i2.getName());

                        // 5.寻找三级分类
                        List<CategoryEntity> level3 = baseMapper.selectList(new QueryWrapper<CategoryEntity>()
                                                                            .eq("parent_cid", i2.getCatId()));

                        // 6.封装三级级分类vo
                        List<Catelog2Vo.Catelog3Vo> vo3s = null;
                        if (level3 != null) {
                            vo3s = level3.stream().map(i3 -> {
                                Catelog2Vo.Catelog3Vo Vo3 = new Catelog2Vo.Catelog3Vo();
                                Vo3.setCatalog2Id(i3.getParentCid().toString());
                                Vo3.setId(i3.getCatId().toString());
                                Vo3.setName(i3.getName());
                                return Vo3;
                            }).collect(Collectors.toList());
                        }
                        Vo2.setCatalog3List(vo3s);

                        return Vo2;
                    }).collect(Collectors.toList());
            }
            return vo2s;
        }));
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Catelog2Vo {
    private String catalogId; // 一级父分类id
    private List<Catelog3Vo> catalog3List; // 三级子分类id
    private String id;
    private String name;

    /**
     * 二级分类vo
     *
     * @author like
     * @date 2020/11/22 16:47:07
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Catelog3Vo {
        private String catalog2Id;
        private String id;
        private String name;
    }
}

nginx搭建域名访问环境(反向代理)

1.在hosts中添加配置

ip(nginx所在的ip) like.mall.com

2.让nginx进行反向代理,所有请求like.mall.com->发送到商城首页

image-20201128123435539

nginx的配置文件

vim /root/app/nginx/conf/nginx.conf

# 全局块 配置影响nginx的全局指令,如:用户组,pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

# events块 配置影响nginx服务器或用户的网络连接 如:每个进程的最大连接数,选取哪种数据驱动模型处理连接请求,是否允许同时接受多个网络连接,开启多个网络连接序列化等
events {
    worker_connections  1024;
}

# http块 可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置,如文件引入,mime-type定义,日志自定义,是否使用sendifle传输文件,连接超时时间,单连接请求数等
http {
	# http全局块 如upstream,错误页面连接超时等
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    
  # server块 配置虚拟主机的相关参数,一个http中可以有多个server 
  server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    charset utf-8;
    #access_log  /var/log/nginx/host.access.log  main;
	
	# location 配置请求的路由,以及各种页面的处理情况
    location / {
        charset utf-8;
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
}

压力测试-jemter

  • 响应时间:用户从客户端发起一个请求到客户端接收从服务端返回的响应结束所耗费的时间
  • hps:每秒点击次数
  • tps:系统每秒处理数
  • qps:每秒处理查询次数

image-20201128124654161

image-20201128124940644

image-20201128131518478

nginx动静分离

1.把static中的index上传到nginx中的html中

image-20201128140222133

image-20201128140209507

2.在所有请求路径中添加/static/

3.修改配置文件

image-20201128140722659