从永远到永远-SpringCloud实战-TenSquare_tensquare_52-程序员宅基地

技术标签: 挖坑小能手正在待命-微服务学习  微服务  

Spring Cloud教程看了千千万了,回头想想还是什么也不会。实践是检验真理的唯一标准,写个项目吧。

1.mysql作为一个微服务,制作mysql容器。需要的虚拟机镜像已经提供,链接地址:

解压后双击如下
在这里插入图片描述
我内存只有8G,只能修改内存给到4G了。
用户名账户开机,xshell连接方便操作,docker没启动,启动。
mysql镜像已经给下载了,直接制作容器:

在这里插入图片描述
在这里插入图片描述
以守护进程方式开启容器,命名为tensquare_mysql,指定端口,指定密码,指定镜像名称。之后查看容器,发现成功。

mysql客户端测试连接成功:
在这里插入图片描述
至此,mysql微服务搭建成功,此服务作为开发数据库。

2.数据库建表,已经有sql脚本,直接执行。
在这里插入图片描述
3.配置一下idea
在这里插入图片描述
jdk:换成自己的jdk用的1.8

maven:
在这里插入图片描述
在这里插入图片描述
4.创建父工程
主要把pom文件贴上:已经提供。
5.创建common模块
前端需要的返回值封装,创建三个类,注意泛型的使用
分布式id,twitter的雪花算法

6.base模块
引入需要的依赖
配置文件增加配置

创建启动类,需要用到common中的雪花算法,将工具类单独注册。(为什么单端是因为有的模块不需要,没必要将其整个注入spring,谁需要谁在启动类中单独加进去即可)
controller方法暂时没有处理失败的情况!!!
单元测试和postman测试浪费时间,省略了。

异常处理,讲道理没看明白,需要再看看!!!

package com.scbg.base.controller;

import entity.Result;
import entity.StatusCode;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @program: tensquare_parent52
 * @description: 异常处理类
 * @author: 三层饼干儿
 * @create: 2019-09-09 19:28
 **/
@RestControllerAdvice
public class BaseExceptionHandler {
	@ExceptionHandler(value = Exception.class)
	public Result exception(Exception e){
		e.printStackTrace();
		return new Result(false, StatusCode.ERROR,e.getMessage(),null);
	}
}

7.条件查询,spring-data-jpa的使用注意与以前命名规则限定查询条件的区别(springboot项目中之恶在dao中使用命名封装了查询条件,与此处效果其实一样的)

public List<Label> findSearch(Label label) {
		//多条件查询
		return labelDao.findAll(new Specification<Label>() {
			/**
			 *
			 * @param root 跟对象,封装条件的对象。例如:where 类名=label.getID
			 * @param query	封装的查询关键字,一般用不着,还不如直接写sql里边呢
			 * @param cb	封装条件查询对象的,不太好解使,结合代码看
			 * @return
			 */
			@Override
			public Predicate toPredicate(Root<Label> root, CriteriaQuery<?>query, CriteriaBuilder cb) {
				//一个list,存放所有条件
				List<Predicate>list= new ArrayList<>();
				if(label.getLabelname()!=null&&!"".equals(label.getLabelname())){
					Predicate predicate = cb.like(root.get("labelname").as(String.class), "%" + label.getLabelname() + "%");//相当于where labelname like "%labename实际值%"
					list.add(predicate);//将这个查询条件放入集合
				}
				if(label.getState()!=null&&!"".equals(label.getState())){
					Predicate predicate = cb.equal(root.get("state").as(String.class), label.getState());
					list.add(predicate);
				}
				//new 一个数组作为最终返回条件,这里为什么需要先有个集合,再转化成数组,是因为cb.and()需要的是可变参。但是new Predicate[]需要指定参数
				Predicate[] parr= new Predicate[list.size()];
				//将list数据转入parr数组中
				list.toArray(parr);
				return cb.and(parr);//
			}
		});
	}

8.分页查询

/**
	 * 分页查询
	 * @param label
	 * @param page
	 * @param size
	 * @return
	 */
	@RequestMapping(value="/search/{page}/{size}",method = RequestMethod.POST)
	public Result pageQuery(@RequestBody Label label,@PathVariable int page,@PathVariable int size){
		Page<Label> pageData =labelService.pageQuery(label,page,size);
		//没有考虑失败的情况
		return new Result(true, StatusCode.OK,"查询成功",new PageResult<Label>(pageData.getTotalElements(),pageData.getContent()));
	}
/**
	 * 分页条件查询
	 * @param label
	 * @param page
	 * @param size
	 * @return
	 */
	public Page<Label> pageQuery(Label label, int page, int size) {
		Pageable pageable= PageRequest.of(page-1,size);
		return labelDao.findAll(new Specification<Label>() {
			/**
			 *
			 * @param root 跟对象,封装条件的对象。例如:where 类名=label.getID
			 * @param query	封装的查询关键字,一般用不着,还不如直接写sql里边呢
			 * @param cb	封装条件查询对象的,不太好解使,结合代码看
			 * @return
			 */
			@Override
			public Predicate toPredicate(Root<Label> root, CriteriaQuery<?>query, CriteriaBuilder cb) {
				//一个list,存放所有条件
				List<Predicate>list= new ArrayList<>();
				if(label.getLabelname()!=null&&!"".equals(label.getLabelname())){
					Predicate predicate = cb.like(root.get("labelname").as(String.class), "%" + label.getLabelname() + "%");//相当于where labelname like "%labename实际值%"
					list.add(predicate);//将这个查询条件放入集合
				}
				if(label.getState()!=null&&!"".equals(label.getState())){
					Predicate predicate = cb.equal(root.get("state").as(String.class), label.getState());
					list.add(predicate);
				}
				//new 一个数组作为最终返回条件,这里为什么需要先有个集合,再转化成数组,是因为cb.and()需要的是可变参。但是new Predicate[]需要指定参数
				Predicate[] parr= new Predicate[list.size()];
				//将list数据转入parr数组中
				list.toArray(parr);
				return cb.and(parr);//
			}
		}, pageable);
	}

9.招聘模块微服务开发,直接使用代码生成器生成,注意修改个别细节
在这里插入图片描述
在这里插入图片描述
复制到父工程下
在这里插入图片描述
颜色不对,再父工程增加module
在这里插入图片描述
修改recruit模块中国父工程名字
在这里插入图片描述
修改端口及url:
在这里插入图片描述
修改启动类名字,要不生成的都是Application,不好辨认。
10.springdatajpa条件查询的热门企业,注意与7中的对比。
在这里插入图片描述
11.查询招聘的热门推荐和最新推荐,没别的看看方法名就好
在这里插入图片描述
12.问答模块,代码生成器生
分析业务
涉及多表查询,无法使用上边的查询方式,手写sql(尽量不用Hsql和sqsql)。注意开启!
在这里插入图片描述
13.代码生成器生成文章模块
在这里插入图片描述
springdatajpa与mybatis最大区别 在于mybatis在夺标联查上有优势,但是springdatajpa用着更方便
注意默认null值的处理。
14.涉及缓存redis
创建redis容器
在这里插入图片描述
加依赖
配置redis
在这里插入图片描述
redisTemplate存入获得,没啥好说的
15.代码生成gaothering模块学习一下spring boot 的缓存,三个注解
启动类开启
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

**

MogonDB

**
严格为非关系型数据库,非严格,介于关系和非关系之间的数据库。跨平台的面向文档,Bson结构(Json的扩展)。
如何让区分是否为关系型数据库:表之间有关系(一对一一对多靠外键,多对多靠中间表)
1.选择条件
1)数据量大
2)价值低
2.结构
在这里插入图片描述
3.windows安装mogonDB,其客户端和server议题的,windows安装主要是将其作为一个客户端使用。
1)安装

2)环境
3)测试启动,选一个文件夹存数据,启动服务端并指明存放数据位置,启动客户端(默认连接本机的)
在这里插入图片描述
在这里插入图片描述
另起一个窗口,启动客户端连接,成功。
在这里插入图片描述
4.docker启动mongoDB容器。
在这里插入图片描述
本机测试连接
在这里插入图片描述
5.各种命令,基本不会用,大多情况下用代码操作此数据库
6.原始Java代码操作数据库
在这里插入图片描述
复杂一点的查询
在这里插入图片描述
7.使用SpringDataMongoDB操作MongoDB数据库
创建数据库,创建集合(类似于关系型数据库的表)
在这里插入图片描述
创建吐槽微服务模块,不适用代码生成器,因为生成器生成的模块使用的是SpringDataJPA
加入依赖

 <dependencies>
        <dependency>
            <groupId>com.scbg</groupId>
            <artifactId>tensquare_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    </dependencies>

配置文件:
在这里插入图片描述
创建启动类,mongodb存数据不设置主键,其会帮我们默认生成,不便于查询。所以启动类加入id生成器
看到53了!!!

elasticsearch

补充elastic search 理论及使用postman调用restAPI原始操作内容,断了一次网丢掉了。

2.head插件操作
1)安装head插件,直接解压用就可以。
2)安装nodejs,head插件底层使用nodejs开发,需要安装nodejs
直接下一步下一步。
3)安装cnpm,相当于国内镜像

npm install -g cnpm --registry=https://registry.npm.taobao.org

4)安装grunt,做成全局。
npm install -g grunt-cli
5)安装依赖,是给head插件安装依赖,要进入他的目录下!
在这里插入图片描述
6)进入head目录启动
在这里插入图片描述
7)浏览器打开
在这里插入图片描述
8)修改elasticsearch,使其能够被跨域访问,否则上边那个玩意访问不了。
在配置文件增加如下:
在这里插入图片描述

http.cors.enabled: true
http.cors.allow-origin: "*"

重启,并且保证elastic search在启动状态!
在这里插入图片描述
9)利用其增删改查,low到爆,自己爱玩就玩玩没啥用。
查询:
在这里插入图片描述

3.装ik分词器,解压扔到elastic search的plugins文件夹,重启即可。
向词库添加分词
在这里插入图片描述
4.搜索微服务开发
创建模块
依赖

 <dependencies>
        <dependency>
            <groupId>com.scbg</groupId>
            <artifactId>tensquare_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.0.6.RELEASE</version>
        </dependency>
    </dependencies>

配置文件:暂时配置Windows的,linux比较复杂,Windows跑通再处理linux。

server:
  port: 9007
spring:
  application:
    name: tensquare-search
  data:
    elasticsearch:
      cluster-nodes: 127.0.0.1:9300

文章搜索类:注意三个是否
在这里插入图片描述
补全dao层,service和controller
5.搜索,基本上搜索模块主要就是该方法,以上的save就是写一下而已,毕竟数据基本是数据库同步到搜索库
dao:搜索给的参数可能只有一个,但是他应该在我们的n个字段中去匹配。(标题可以匹配,简介也可以匹配)
在这里插入图片描述
补全其他
在这里插入图片描述
6.安装同步数据库软件logstash
1)直接解压可用
2)测试,输入命令,成功后输入内容,直接在下边显示出来。-e表示后边直接跟命令,一般开发都是跟-f 命令一般比较长,放在文件中。在这里插入图片描述代表键盘输入,窗口直接输出。
在这里插入图片描述
3)mysql同步文件配置
在这里插入图片描述
启动logstash同步,并指明命令目录。
在这里插入图片描述
差不多一分钟时间(跟配置文件设置有关),查看elasticsearch,发现数据已经同步。
在这里插入图片描述
与数据库数据一致
在这里插入图片描述

7.elasticsearch在本地Windows下的测试基本都完成了,下边往linux上部署服务。
1)创建elastic search容器
在这里插入图片描述
在这里插入图片描述
9200端口已经可以访问,但是9300不行徐奥修改配置。
在这里插入图片描述
3)
1》
在这里插入图片描述
为了解决这个问题,需要将容器文件复制到宿主机,并让容器文件挂载到宿主机。以后修改宿主机上的文件久相当于修改容器内的文件。
2》复制文件至宿主机:
在这里插入图片描述
注意复制docker容器命令要加上容器名称前缀。
3》原来的容器没有设置文件挂载,我们无法使用,停掉并删除。
在这里插入图片描述
4》创建一个带有文件挂载的新容器
在这里插入图片描述
5》修改宿主机的文件
在这里插入图片描述
跨域稍等再处理
5》重启容器是配置生效
在这里插入图片描述
重启成功发现其并无此容器,是因为宿主机默认放开了ip后,宿主机要求我们必须给容器更多的内存和硬件。所以报错了。。。
6》在这里插入图片描述
在这里插入图片描述
重启容器(教程是这么说,但是我测试过需要重启docker,实在不行重启虚拟机)
4)修改下application.yml用Java代码测试一下(必须用代码,因为测的9300端口)
在这里插入图片描述
成了!!!
5)安装分词器IK
ik上传到虚拟机
复制到容器plugins文件夹下(与Windows一样的道理)
在这里插入图片描述
可以测试一下,太麻烦,我没测。。。
在这里插入图片描述
6)安装head插件
保证跨域请求(跟Windows一个道理),改配置:
在这里插入图片描述
创建head容器
在这里插入图片描述
6)浏览器测试一下通过容器中的head连接容器中的elasticsearch
在这里插入图片描述
09-12
在这里插入图片描述

RabbitMQ

在这里插入图片描述
在这里插入图片描述
rabbitMQ的安装和使用
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/MACHENIC/article/details/100658305

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法