技术标签: 挖坑小能手正在待命-微服务学习 微服务
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 的缓存,三个注解
启动类开启
**
**
严格为非关系型数据库,非严格,介于关系和非关系之间的数据库。跨平台的面向文档,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了!!!
补充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的安装和使用
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读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
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读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技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法