微服务全套
微服务导学服务拆分如何把单一的大项目如何拆分成一个个小项目远程调用每个小的单体项目在物理上是隔绝开的使用的是不同的Tomcat有独立的运维和部署互相之间如何调用就涉及到了远程调用的知识学习微服务的最好方法是尝试着把一个大项目分成一个个小问题然后解决这个过程中出现的问题MybatisPlus介绍快速入门对于单表查询很好用常用注解MyBatisPlus用过扫描Mapper继承的实体类基于反射获取实体类的信息作为数据库信息也就是对应数据库的字段名从而编写单表查询语句实体类的字段名转数据库的字段名有约定如下这就要求我们在编写实体类以及数据库的时候要规范一定要注意的是一定要有主键有成员变量为id的或者用TableId这个注解把主键是什么标出来TableId有两个属性value是给这个成员变量起别名并设置为主键type是给这个成员变量设置如下属性常用配置默认id的type属性为雪花算法生成但是优先级不如注解的高mybatis-plus: mapper-locations: [classpath*:/mapper/**/*.xml] type-aliases-package: com.itheima.map.domain.po global-config: db-config: id-type: assign-id update-strategy: not-null configuration: map-underscore-to-camel-case: true cache-enabled: false这些配置几乎都是默认的不用自己配置需要的时候看文档就行条件构造器在给出复杂的where条件的时候可以使用条件构造器构造出来的一个类传入参数Test void testQuerywrapper() { //在查询中 Wrapper用来填充复杂的条件语句同时可以对查询结果做筛选 QueryWrapperUser queryWrapper new QueryWrapperUser() .select(id,username,phone,balance) .like(username,o) .ge(balance,1000); ListUser users userMapper.selectList(queryWrapper); users.forEach(System.out::println); //在更新中 Wrapper设置条件语句,还需要一个实体类来传递参数 User user new User(); user.setBalance(10000); QueryWrapperUser queryWrapper1 new QueryWrapperUser() .eq(username,Lucy); userMapper.update(user,queryWrapper1); //在执行比较特殊的update语句的时候可以手写sql语句 User user1 new User(); user1.setUsername(zhangsan); UpdateWrapperUser updateWrapper new UpdateWrapperUser() .setSql(balancebalance-1000) .eq(username,mary); userMapper.update(user,updateWrapper); }在构建wrapper的时候直接传入字段名是属于硬编码要尽量避免可以通过如下方法传入函数的get方法来避免自定义sqlIService接口基本用法自定义接口继承IService接口自定义实现类继承IService的实现类要传递baseMapper给ServiceImplIService的实现类是因为调用Mapper方法时要知道要调用哪一个类的Mapper开发基础业务接口RestController RequestMapping(/users) Api(tags用户管理相关接口) public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService userService; } PostMapping ApiOperation(新增用户) public void saveUser(RequestBody UserFormDTO userFormDTO) { //把DTO拷贝到pojo User user BeanUtil.copyProperties(userFormDTO,User.class); userService.save(user); } DeleteMapping(/{id}) ApiOperation(删除员工) public void deleteUser(PathVariable String id) { //删除用remove userService.removeById(id); } GetMapping(/{id}) ApiOperation(根据id查询用户) public UserVO getUserById(PathVariable String id) { User user userService.getById(id); return BeanUtil.copyProperties(user,UserVO.class); } GetMapping ApiOperation(根据id批量删除) public ListUserVO getUserByIds(RequestParam ListLong ids) { //批量查询用list ListUser userList userService.listByIds(ids); //因为返回类型是固定的所以类的复制转换会很常用 return BeanUtil.copyToList(userList,UserVO.class); }开发复杂业务接口baseMapper是编译时多态userMapper是运行时多态通过泛型绑定实现了自定义实现类继承mp提供的serviceImplUserMapper,User的时候通过泛型绑定了所以这里的BaseMapper实际上运行时使用的是userMapper对象尽管deductMoneyById是不在BaseMapper中自定义的方法。Lambda方法在查询参数比较多的时候不建议用requestParam一个一个查询太过于麻烦可以定义一个对象来接收ISerice的批量新增每一次循环只插入一条数据一共要插入十万条数据就进入十万次数据库每一次进入数据库就是一次网络请求网络请求比较耗时间所以效率比较低每一次循环插入一千条数据要插入十万条数据就要进入一百次数据库执行网络请求的次数变少了效率提升了,但是由于还是一条sql执行一次新增用户效率还没有达到最好一次性插入十万条数据只进入一次数据库且一条sql执行批量新增用户一条sql可以添加多个用户效率最高spring: datasource: url: jdbc:mysql://127.0.0.1:3306/mp?useUnicodetruecharacterEncodingUTF-8autoReconnecttrueserverTimezoneAsia/ShanghairewriteBatchedStatementstrue driver-class-name: com.mysql.cj.jdbc.Driver username: root password: 1234SpringBootTest class MpDemoApplicationTests { Autowired private UserService userService; private User buildUser(int i) { User user new User(); user.setUsername(user_ i); user.setPassword(123); user.setPhone( (18688190000L i)); user.setBalance(2000); user.setInfo({\age\: 24, \intro\: \英文老师\, \gender\: \female\}); user.setCreateTime(LocalDateTime.now()); user.setUpdateTime(user.getCreateTime()); return user; } Test void testSaveBatch() { // 准备10万条数据 ListUser list new ArrayList(1000); long b System.currentTimeMillis(); for (int i 1; i 100000; i) { list.add(buildUser(i)); // 每1000条批量插入一次 if (i % 1000 0) { userService.saveBatch(list); list.clear(); } } long e System.currentTimeMillis(); System.out.println(耗时 (e - b)); }代码生成器插件功能Docker快速入门-部署MySQL应用的运行对环境和操作系统有强要求windows64位的qq换到windows32位上面就不能运行命令解读docker run是创建并运行一个容器但可能会中途停止-d是让容器一直运行--name是给容器指定一个名字以后去操作容器的时候就是根据名字来的这个名字是这里我们自己起的名字-p 3306:3306前一个端口号是虚拟机自己的端口号后面那个端口号是虚拟机内部给mysql容器分配的端口号不同的容器前面的3306虚拟机端口号是不变的后面的端口号会不同因为虚拟机内部是隔离的外部不能直接访问到内部的容器只能通过虚拟机提供的端口号来访问虚拟机然后再访问容器-e 是设置环境变量TZAsia/Shanghai设置容器时区为上海避免 MySQL 时间与宿主机不一致。MYSQL_ROOT_PASSWORD123强制必填用于初始化 MySQL 的 root 用户密码是 MySQL 镜像的核心启动参数无此参数容器会启动失败。最后的mysql指定运行的镜像名称docker daemon基于该镜像创建容器实例本地无镜像时自动从镜像仓库拉取以后操作容器时--name指定要操作的容器docker daemon找到对应容器之后会自己起个名字自己用常见命令docker pull去镜像仓库里面拉取镜像要用pull可能会有必须输入的内容这部分可以去docker hub网站上面去搜索要拉取的镜像名称来确认docker image镜像的英文翻译是image要查看镜像使用这个命令就行docker save -o nginx.tar nginx:latest将镜像下载到本地镜像列表要用save命令具体内容如下docker save -o nginx.tar nginx:latest意思是将nginx镜像的最新版本下载到本地的文件nginx.tar里面docker load -i nginx去本地镜像列表里可以下载镜像用load命令忘了都可以用--help查看容器操作命令作用示例 (Nginx)docker run -d --name nginx -p 8081:80 nginx启动并运行 Nginx 容器推荐docker run -d --name nginx -p 8081:80 nginxdocker ps查看正在运行的容器docker psdocker ps --all查看所有容器包括停止的docker ps -adocker start nginx启动已存在的 Nginx 容器docker start nginxdocker stop nginx安全停止 Nginx 容器docker stop nginxdocker restart nginx重启 Nginx 容器docker restart nginxdocker rm -f nginx强制删除Nginx 容器解决端口冲突用docker rm -f nginx软件端口启动命令Nginx80818081:80phpMyAdmin80808080:80MySQL33063306:3036命令作用示例 (Nginx)docker exec -it nginx /bin/bash进入 Nginx 容器终端docker exec -it nginx bashexit退出容器回到宿主机exit命令作用示例 (Nginx)docker logs nginx查看 Nginx 日志docker logs nginxdocker logs -f nginx实时跟踪Nginx 日志docker logs -f nginx数据卷镜像就是最小化的系统只给你准备必要的最少的运行所必需的所以在容器内修改容器是非常困难的在创建数据卷的时候每创建一个数据卷就会对应宿主机文件系统里的一个文件每一个数据卷里的都和宿主机里的文件有对应关系在修改宿主机文件系统里面的文件时容器内的文件也会改变Docker 挂载数据卷时把宿主机的某个目录直接映射进容器的文件系统树。宿主机写 → 直接写硬盘容器读 → 直接读硬盘两边看到的是同一块物理存储空间没有同步、没有传输、没有复制。改一个 改另一个。为什么会这样因为容器本质不是虚拟机容器是共享宿主机内核的进程。它没有自己独立的硬盘只能通过挂载方式使用宿主机的真实文件。最终一句话总结宿主机和容器修改的是硬盘上同一份真实文件所以一边改另一边立刻变。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2518405.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!