开头
写这个主要用来记录一下学习。
文章目录
前言
之前就跟着做过一个分布式开发的项目,所以对于一些Springcloud的组件都有所了解,所有并不会覆盖视频中所有的知识点,为了让自己一些高并发的经验,特地肝一下这个项目,希望能有所收获!
一、环境搭建篇
视频中使用的是虚拟机+centos7镜像,然后将所有要使用的中间件放到docker中进行管理,我为了方便就直接在window系统下开发了。
二、人人开源项目
1.vue项目
现在其实低代码越来越流行了,这种配套的开源项目用起来简直不要太爽。
2.和上面前端有一套配套的SpringBoot后台
那个项目名称叫renren-fast 都可以到github上找到
3.还有一套Java的代码生成器(MyBatis-plus)
三、Nacos
我之前使用的是Eureka(好像现在已经不再维护了),Nacos给我的感觉确实更好用一点,他的可视化界面做的挺好看的
这个组件即可以用来做服务中心,也可以拿来做配置中心。
配置中心
可以将传统的application.yml进行拆分,然后通过bootstrap.properties(最先加载的配置文件)加载拆分后的配置集。
操作步骤
* 1.如何使用Nacos作为配置中心统一管理配置
*
* 1)导入依赖
*
* 2)创建一个bootstrap.properties
* 配置服务名和服务地址
* 3)需要给配置中心默认添加一个 包名.properties
* 在里面配置就可以
* 4)添加@RefreshScope 动态刷新配置
* @Value 获取配置文件的值
*
*
* 2、细节
* 1)命名空间:配置隔离
* 默认:public(保留空间):新增所有都是public空间
* 1、开发、测试、生产:利用命名空间来做环境隔离
* 注意:在bootstrap.properties:配置需要使用哪个命名空间下的配置(值一定要写ID,不能写名字)
* 2、每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
* 2)配置集:所有配置的集合
* 3)配置集ID:类似文件名
*
* 4)配置分组
* 默认所有的配置集都属于:DEFAULT_GROUP
* 1111,618,1212
*
* 使用建议:每个微服务创建自己的命名空间、使用配置分组来区分环境
关于bootstrap.properties的配置
加载多配置集的方法
有了这些之后,配置开发、测试、生产服务就能分的很明确了。
需要注意的是:bootstrap是最先加载的、当你使用配置中心来配置时,需要开启刷新功能,才能够动态的修改配置,否则是不会生效的!
四、三级分类
这是商城中最常见的一个东西。
这个难点主要在怎么将他变成一种树形结构,一级分类下所属的所有二级分类,二级分类下所有所属的三级分类,以此类推。视频这里的递归写法有点惊到我了,有点难理解,简单说明吧。
首先给这个实体类加一个Child用来装他的下级分类
这里确实很难懂啊又是递归又是流式又是lambda…
public List<CategoryEntity> listWithTree() {
//查出所有分类
List<CategoryEntity> entities = baseMapper.selectList(null);
/*
1.首先通过过滤器,找到所有的一级分类
2.通过getChildren方法,找到树形的下属分类,然后赋值给一级分类
3.通过sorted方法排序,最后以list形式返回。
*/
//组装树形结构
//找到所有一级分类
List<CategoryEntity> level1Menus = entities.stream().filter((categoryEntity) -> {
return categoryEntity.getParentCid() == 0;
}).map((menu) -> {
menu.setChildren(getChildren(menu, entities));
return menu;
}).sorted((menu1, menu2) -> {
return (menu1.getSort() == null? 0 : menu1.getSort()) - (menu2.getSort() == null? 0 : menu2.getSort());
}).collect(Collectors.toList());
return level1Menus;
}
/*
注意:递归只要明确他要做什么就好了,不要纠结细节,只需要知道每一回递归要做什么,不然容易陷进去。
分析:首先这个递归方法有两个参数,一个是当前实体类,一个是整个list数组(为进行处理的所有分类数据)
同样的先过滤找到 下一级 分类的parentId等于当前root的id的分类,然后进行组装
然后同样排序,生成list。
*/
//递归查找所有菜单的子菜单
private List<CategoryEntity> getChildren(CategoryEntity root, List<CategoryEntity> all) {
List<CategoryEntity> children = all.stream().filter(categoryEntity -> {
return categoryEntity.getParentCid() == root.getCatId();
}).map(categoryEntity -> {
categoryEntity.setChildren(getChildren(categoryEntity, all));
return categoryEntity;
}).sorted((menu1, menu2) -> {
return (menu1.getSort() == null? 0 : menu1.getSort()) - (menu2.getSort() == null? 0 : menu2.getSort());
}).collect(Collectors.toList());
return children;
}
网关路由以及跨域配置
这里跨域配置自己网上找的,没有用视频上的。
需要注意的是:跨域只需要配置一次,一般都在网关上配置,如果配置多次会报错。
@Configuration
public class CorsConfig {
@Bean
public WebFilter corsFilter() {
return (ServerWebExchange ctx, WebFilterChain chain) -> {
ServerHttpRequest request = ctx.getRequest();
if (CorsUtils.isCorsRequest(request)) {
HttpHeaders requestHeaders = request.getHeaders();
ServerHttpResponse response = ctx.getResponse();
HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod();
HttpHeaders headers = response.getHeaders();
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin());
headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS,
requestHeaders.getAccessControlRequestHeaders());
if (requestMethod != null) {
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name());
}
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
if (request.getMethod() == HttpMethod.OPTIONS) {
response.setStatusCode(HttpStatus.OK);
return Mono.empty();
}
}
return chain.filter(ctx);
};
}
}
总结
Nacos的配置中心的一些设置比较巧妙,需要好好练习,以后这种架构也是用得上的,微服务其实就是单体应用的解耦,将一个服务器中的功能分离出来放置到不同的服务器中,这样的好处是开发啥的都很方便,缺点就是后期维护,所以说网关以及配置中心很重要。