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

智能推荐

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

分布式系统_分布式系统运维工具-程序员宅基地

文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具

用Exce分析l数据极简入门_exce l趋势分析数据量-程序员宅基地

文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线

推荐文章

热门文章

相关标签