Docker从零开始
基本概括容器背景程序运行的基础环境我们的程序首先在开发环境开发,然后需要部署到测试环境交给测试人员测试,最后需要由运维人员部署到生产环境正式运行,在这个过程中任何一个环境如果和其他环境不一致,则会出现开发阶段能运行的程序在测试阶段或生产阶段不能够正常运行,这就是“软件跨环境迁移”问题。
JavaEE程序依赖的基础环境:JDK、tomcat、数据库、中间件、操作系统、配置文件(代码配置、JDK配置、tomcat配置、操作系统配置)等等
因此面临的问题
复杂的系统运维
开发环境、测试环境和生产环境的很难保持高度一致,由环境不一致而导致的软件故障,很难解决
软件交付和部署流程繁琐
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行
服务器扩缩容流程繁琐、成本巨大
例如:微博业务面临的问题:https://myslide.cn/slides/331
解决方案:容器化于是它出现了,Docker可以让开发者构建应用程序时,将应用程序与其所依赖的环境一起打包到一个容器中,然后一一交付整个环境而不仅仅是代码。
这样一个带环境的 ...
解决项目中数据不一致问题
解决项目中数据不一致问题
主要记录一下项目中出现的一个数据不一致的问题,不是所谓的数据库数据不一致哈,不是技术文章,单纯记录自己的一种解决办法的思路。
项目背景我们的PIS项目(乘客信息显示系统)主要是跟设备硬件关联比较大,我主要是负责给设备发送ATS(列车自动监控系统)消息将我们的设备需要显示的与列车的信息进行关联,这其中数据转发经过好几个系统,最后才到我们PIS这里,由于上一层数据是通过组播发送给我们的,我们每个设备中的程序都会去接收组播,但由于网络和组播的不稳定性,经常会出现丢包的问题,导致经常会出现几个设备数据显示不一致的问题。
排查与发现首先这个项目一开始不是我接手的(前一个同事离职后将项目转到我手里的),我不清楚详细的问题,所以就给接收数据的地方增加了些日志给交付的同事去严重,将详细的报文打印出来,发现有些设备能接收到数据有的设备接收不到数据。
解决办法方案1. 重新签订协议当时已经确认了就是有些设备会出现接收不到,我们就跟我们的上游厂家去一起讨论这个问题,说可以修改协议,将数据通过modbus协议发送给我们(为什么要采用这个协议呢?因为我们跟他们系统之间还有其 ...
MySql短记
索引介绍覆盖索引1定义:就是说当业务的需求是直接可以根据索引就能查询出所需要的数据的时候,不需要查表数据的。覆盖索引不需要考虑最左匹配原则的,因为他压根不查表数据。对于覆盖索引,因为索引中包含了查询所需的全部字段,所以不需要回表查询实际的数据行。这意味着覆盖索引可以直接满足查询的需求,不受最左匹配原则的限制。
举例说明:
12345678910111213--- 创建表CREATE TABLE `user` ( `user_id` int NOT NULL, `username` varchar(50) DEFAULT NULL, `password` varchar(50) DEFAULT NULL, `email` varchar(100) DEFAULT NULL, `phone_number` varchar(20) DEFAULT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET= ...
解决项目前端页面响应问题
解决项目前端页面响应问题
本篇文章记录的是前端页面数据需要动态更新数据,解决页面状态和实际设备状态不一致的问题,引进了新的一个协议—Websocket(websocket是html5提供的一种浏览器与服务器进行全面双工通讯的网络技术,是基于TCP传输的应用层协议)协议。
项目背景我们的web页面要去展示我们设备的在线离线状态、客流量载运情况、和第三方厂家设备的连接状态等等,这些数据都需要实时的去更新,保证能在第一时间获取到最新的数据信息。为了满足这个需求,于是就增加了websocket协议。
技术实现封装消息首先第一步就要去封装好消息格式,根据上述背景可以得知,并不是这个协议只用于某一个消息的,所以要将消息体之类的设计好。
123456789101112131415161718192021package com.yuyi.pis.common.websocket;import lombok.Data;/** * @description: 对发送websocket消息体进行封装 * @author: wzl * @date: 2022/11/05 */@Datapublic clas ...
Netty快速入门
关于工作上使用Netty的介绍学习Netty之前你一定要掌握的知识点Reactor的线程模型介绍 Reactor线程模型是在传统的I/O线程模型上进行的一种优化,可以分为三种线程模型。传统的I/O线程模型有以下两个缺点:
每个连接都需要创建一个对应线程,线程大量创建占用大量的服务器资源
线程没有数据可读情况下的阻塞会对性能造成很大的影响Reactor线程模型为了解决这两个问题,提供了以下解决方案:
基于I/O多路复用:多个客户端连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,通过事件驱动通知应用程序,线程从阻塞状态返回,开始进行业务处理
基于线程池技术减少线程创建:基于线程池,不必再为每一个连接创建线程,将连接完成后的业务处理分配给线程池进行调度
Reactor线程模型图:
Reactor在一个单独的线程中进行,负责监听和分发事件。Reactor的两个核心组件:EventDispatch(在netty中相当于就是EventLoopGroup):监听和分发事件,分发给适当的处理程序来对IO ...
Mybatis-Plus之注解介绍
11、 Mybatis-Plus之注解介绍1、@TableName
经过以上的测试,在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在 Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表
由此得出结论,MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决 定,且默认操作的表名和实体类型的类名一致
1、问题若实体类类型的类名和要操作的表的表名不一致,会出现什么问题?
我们将表user更名为t_user,测试查询功能 程序抛出异常,Table ‘mybatis_plus.user’ doesn’t exist,因为现在的表名为t_user,而默认操作的表名和实体类型的类名一致,即user表
2、通过@TableName解决问题在实体类类型上添加@TableName(“t_user”),这样就能唯一指定
3、通过全局配置解决问题
在开发的过程中,我们经常遇到以上的问题,即实体类所对应的表都有固定的前缀,例如t_或tbl_
此时,可以使用MyBatis-Plus提供的全局配置,为实体类所 ...
Mybatis-Plus之条件构造器和常用接口
12、Mybatis-Plus之条件构造器和常用接口1、wapper介绍
Wrapper : 条件构造抽象类,最顶端父类
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
QueryWrapper : 查询条件封装
UpdateWrapper : Update 条件封装
AbstractLambdaWrapper : 使用Lambda 语法
LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
2、QueryWrapper1、例1:组装查询条件1234567891011@Testpublic void test01(){ //查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息//SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (username LIKE ? AND a ...
Mybatis-Plus之API的CURD
16、Mybatis-Plus之API的CURD1、BaseMapperMyBatis-Plus中的基本CRUD在内置的BaseMapper中都已得到了实现,我们可以直接使用,接口如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162package com.baomidou.mybatis ...
Mybatis-Plus之简介
08、 Mybatis-Plus之简介1、官网详细介绍点击这里。
2、支持数据库
任何能使用MyBatis进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下
MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss , ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb
达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据 库,瀚高数据库
3、个人应用感受12我是工作之后才开始接触到这个框架的,之前用的都是Mybatis和Jpa。感觉最大的区别就是这框架既满足了Jpa的一些简单sql不用写的特又支持让我们自己在xml里面写复杂的sql。
Mybatis-Plus之插件介绍
13、Mybatis-Plus之插件介绍1、分页插件
MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能,优先推荐1
1、添加配置类1234567891011@Configuration@MapperScan("com.test.mybatisplus.mapper") //可以将主类中的注解移到此处 public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
2、测试1234567891011121314@Te ...