开头

写这个主要用来记录一下学习。



文章目录

  • 开头
  • 前言
  • 一、环境搭建篇
  • 二、人人开源项目
  • 1.vue项目
  • 2.和上面前端有一套配套的SpringBoot后台
  • 3.还有一套Java的代码生成器(MyBatis-plus)
  • 三、Nacos
  • 配置中心
  • 操作步骤
  • 四、三级分类
  • 网关路由以及跨域配置
  • 总结



前言

之前就跟着做过一个分布式开发的项目,所以对于一些Springcloud的组件都有所了解,所有并不会覆盖视频中所有的知识点,为了让自己一些高并发的经验,特地肝一下这个项目,希望能有所收获!


一、环境搭建篇

视频中使用的是虚拟机+centos7镜像,然后将所有要使用的中间件放到docker中进行管理,我为了方便就直接在window系统下开发了。

二、人人开源项目

1.vue项目

现在其实低代码越来越流行了,这种配套的开源项目用起来简直不要太爽。

微服务开发实例模式 微服务开发经验_List

2.和上面前端有一套配套的SpringBoot后台

那个项目名称叫renren-fast 都可以到github上找到

3.还有一套Java的代码生成器(MyBatis-plus)


三、Nacos

我之前使用的是Eureka(好像现在已经不再维护了),Nacos给我的感觉确实更好用一点,他的可视化界面做的挺好看的

微服务开发实例模式 微服务开发经验_加载_02


这个组件即可以用来做服务中心,也可以拿来做配置中心。

配置中心

可以将传统的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的配置

加载多配置集的方法

微服务开发实例模式 微服务开发经验_加载_03


有了这些之后,配置开发、测试、生产服务就能分的很明确了。

需要注意的是:bootstrap是最先加载的、当你使用配置中心来配置时,需要开启刷新功能,才能够动态的修改配置,否则是不会生效的!

四、三级分类

这是商城中最常见的一个东西。

微服务开发实例模式 微服务开发经验_加载_04


这个难点主要在怎么将他变成一种树形结构,一级分类下所属的所有二级分类,二级分类下所有所属的三级分类,以此类推。视频这里的递归写法有点惊到我了,有点难理解,简单说明吧。首先给这个实体类加一个Child用来装他的下级分类

微服务开发实例模式 微服务开发经验_命名空间_05

这里确实很难懂啊又是递归又是流式又是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;
    }

网关路由以及跨域配置

微服务开发实例模式 微服务开发经验_加载_06

这里跨域配置自己网上找的,没有用视频上的。
需要注意的是:跨域只需要配置一次,一般都在网关上配置,如果配置多次会报错。

@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的配置中心的一些设置比较巧妙,需要好好练习,以后这种架构也是用得上的,微服务其实就是单体应用的解耦,将一个服务器中的功能分离出来放置到不同的服务器中,这样的好处是开发啥的都很方便,缺点就是后期维护,所以说网关以及配置中心很重要。