从永远到永远-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

智能推荐

配置sqlnet.ora 参数,实现客户端IP限制_修改sqlnet.ora-程序员宅基地

文章浏览阅读555次。修改sqlnet.ora,实现客户端IP限制 如果要在网络上做一些IP地址的限制,一般情况下我们首先想到的是用网络层的防火墙软件。要找网管来设置。 但是如果网管不在,或者仅仅想在数据库层来实现IP地址的限制,DBA们只要修改Server端的一个网络配置文件sqlnet.ora文件就可以了。 Oracle9i以上版本,在目录$ORACLE_HOME/network/admin 下增加..._修改sqlnet.ora

Activiti工作流引擎整合系列【收藏可做笔记系列】,前端技术图谱-程序员宅基地

文章浏览阅读645次,点赞25次,收藏19次。对于框架原理只能说个大概,真的深入某一部分具体的代码和实现方式就只能写出一个框架,许多细节注意不到。开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】算法方面还是很薄弱,好在面试官都很和蔼可亲,擅长发现人的美哈哈哈…(最好多刷一刷,不然影响你的工资和成功率???在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。

solr6.6教程-从mysql数据库中导入数据(三)_solr6建core 及数据库导入-程序员宅基地

文章浏览阅读184次。整理多半天的solr6.6,终于算是把solr6.6中配置数据库弄出来了,网上的文章千篇一律,各说个的,没有一篇统一覆盖solr6.6版本配置的 帖子,本章节我会把配置的一些注意事项一一列举,由于时间原因,本片只介绍如何一次性导入数据,不附带增量导入,想看增量的同学可以在后面的文章中。1,配置准备本文的前提是你已经配置好了solr,并新创建了一个core,我们下面都会按照前一篇文章中的co..._solr6建core 及数据库导入

面试题总结5_csdn 面试-程序员宅基地

文章浏览阅读202次。幻读是指在同一个事务中,前后两次查询相同的范围时,得到的结果不一致(我们来看 这个图)第一个事务里面我们执行了一个范围查询,这个时候满足条件的数据只有一条第二个事务里面,它插入了一行数据,并且提交了接着第一个事务再去查询的时候,得到的结果比第一查询的结果多出来了一条数 据。所以,幻读会带来数据一致性问题。_csdn 面试

PTA L1-04 找字符串中的最大字符和最大字符第一次出现的位置 (10 分)_输入一个数字字符串,输出数字字符中最大的数字字符。-程序员宅基地

文章浏览阅读3.5k次,点赞3次,收藏2次。刷题又开始啦_输入一个数字字符串,输出数字字符中最大的数字字符。

jenkins 搭建git自动部署多台服务器_jenkins自动部署多台服务器-程序员宅基地

文章浏览阅读1.4k次。1.0 基础设置1.1 安装插件Publish Over SSHSend build artifacts over SSH1.2 进入系统管理1.3 选择插件管理1.4 查找Publish Over SSH1.5 安装完成1.6 此时再进入系统设置1.7 找到Publish over SSH点击新增,增加服务器地址点击高级,填写远程服务器的密码以下代表连接不上,请检查服务器账号密码..._jenkins自动部署多台服务器

随便推点

VMware workstation 安装失败,提示“无法删除VMware workstation 的较早版本,请与技术支持小组联系”_vmware安装出现无法删除vmware旧版本,请与技术小组联系-程序员宅基地

文章浏览阅读5.1k次,点赞2次,收藏18次。卸载VMWARE WORKSTATION后,由于没有卸载干净,再重新安装虚拟机,结果安装进程出现错误,提示“无法删除VMware workstation 的较早版本,请与技术支持小组联系”在网上查看了一下,大概有2种解决方法:方法1:新建一个bat文件,拷贝下面的代码到bat文件中,以管理员的方式运行,就可以了。【试了问题还是没法解决!!!】cls @echo off CLS color 0a echo 取消DLL文件的注册... regsvr32 /u /s "%cd%/vma_vmware安装出现无法删除vmware旧版本,请与技术小组联系

Spring Data JPA 无法自动创建数据库表(踩坑已解决)_跟据url调用jpa接口的时候主键不自动生成-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏5次。1、检查配套注解是否添加@Entity //数据库字段与实体属性对应的能力@Table(name = "t_blog") //生成t_blog数据表@Id //代表主键@GeneratedValue(strategy = GenerationType.IDENTITY) //生成策略,自动递增2、检查pom.xml依赖是否添加完全 <!--导入spring data jpa--> <dependency> <groupId>org.s_跟据url调用jpa接口的时候主键不自动生成

python爬虫知识:正则表达式_爬虫正则表达式实验原理-程序员宅基地

文章浏览阅读1.1w次,点赞13次,收藏92次。概念正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式的原理:给定一个正则表达式和另一个字符串,我们可以达到如下的目的:给定的字符串是否符合正则表达式的过滤逻辑(“匹配”);通过..._爬虫正则表达式实验原理

python自动化(三)web自动化:1.pytest框架讲解+集成allure_python setup method和parametrize-程序员宅基地

文章浏览阅读1.8k次,点赞7次,收藏26次。一.什么是pytest我们在编写自动化脚本时,需要一套框架来管理我们的测试用例。这样我们的用例才会更加灵活,pytest就是这么一个框架。pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:简单灵活,容易上手,文档丰富;支持参数化,可以细粒度地控制要测试的测试用例;能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);pytest具有很多第三方插件,并且可以自定义扩展,比较好_python setup method和parametrize

Unity 射线、直线检测碰撞_unity检测直线经过的点-程序员宅基地

文章浏览阅读295次。1、射线检测Vector3 pos = Vector3.one;//点Vector3 dir = Vector3.zero;//方向RaycastHit[] rhs = Physics.RaycastAll(pos, dir);if (rhs.Length > 0){ Debug.Log("碰撞点:" + rhs[0].point);}2、直线检测1Vector3 pos = Vector3.one;//点Vector3 dir = Vector3.zero;//方向_unity检测直线经过的点

LabVIEW大型项目开发提高质量的工具_ni labelview-程序员宅基地

文章浏览阅读1k次。LabVIEW大型项目开发提高质量的工具在LabVIEW有关的大型项目中,可以配合LabVIEW一些工具包,NI公司以及第三方的一些软件来提高项目质量,减少风险,节省时间。这里进行一个概括性的介绍。软件工程有许多不同的表现形式和结构,比如瀑布模型,螺旋模型,极限编程(XP)和敏捷流程(AgileProcesses)。图1中的V模型可能是最常见,最容易理解的了。从图中可以看到软件工程中开发和验证的过程关系紧密,这是由于软件工程的开发过程是由这些有组织的开发步骤组成的。其中每一步都需要有严格的方法和规范,进入下_ni labelview

推荐文章

热门文章

相关标签