02-架构演进和分布式系统基础知识

2022-07-18

02-架构演进和分布式系统基础知识 架构演进和分布式系统架构基础知识 一. 传统架构演进到分布式架构 1.单机应用和分布式应用架构演进基础知识 高可用: LVS+keepalive 单体应用 开发速度慢,启动时间长,依赖庞大等等 微服务 易开发,理解和维护 独立的部署和启动 不足:分布式系统->分布式事务问题(不同数据库失败时无法回滚,需要其他处理) 需要管理多个服务->服务治理 二. 微服务核心基础讲解 1. 网关: 路由转发+过滤器 路由转发:即路径的转发(RequestMapping),将不同的路径分发到不同的系统 过滤器: 即filter,可以用来权限验证等 2. 服务注册发现(调用和被调用方的信息维护) 注册中心,各个服务在注册中心'登记'开放接口信息,方便其他服务调用 而服务在注册中心申请需要调用的接口,注册中心会进行处理,将所需的ip和接口返回给服务进行调用 方便管理 3. 配置中心(管理配置,动态更新) 例如配置中心有order_config user_config product_config 订单服务启动时就会向配置中心发起....

04-服务消费者ribbon和feign实战和注册中心高可用

2022-07-18

04-服务消费者ribbon和feign实战和注册中心高可用 服务消费者ribbon和feign实战和注册中心高可用 一. 常用的服务间调用方式讲解 ###. 1. RPC 远程过程调用,像调用本地服务(方法)一样调用服务器的服务 支持同步,异步调用 客户端和服务器之间建立TCP连接,可以一次建立一个,也可以多个调用复用一次链接 RPC数据包小 protobuf 一种二进制通信应用层 协议 RPC:编解码,序列化,链接,丢包,拆包,协议等问题 2. Rest(Http) http请求,支持多种协议和功能 开发方便成本低 Http数据包大 二. ribbon实战,订单调用商品服务 创建order_service项目 org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-starter-netflix-ribbon 开发伪下单接口 使用ribbon.(类似httpClient,URLConnection....

day02

2022-07-18

day02 Spring Bean生命周期与延迟实例化 单例对象默认情况下在容器启动时立即初始化 如果这些对象内存耗用高,则启动会很慢. 对于内存占用高,使用少的对象,可以设置延迟(懒惰,按需)实例化 在bean标签上使用懒惰属性设置即可. 设置了懒惰属性为true 容器启动时候,bean不实例化 在第一次getBean时候实例化 是单例Bean对象` 多例对象没有延迟初始化

day01

2022-07-18

day01 SSM Mybatis 持久层的框架,支持普通的sql语句,存储过程(项目) 封装了底层的jdbc 提高开发效率 sql语句可以配置到xml文件中,注解 框架的使用 建表 create table t_user(id int primary key auto_increment, name varchar(50), password varchar(32), email varchar(50), phone varchar(32)); 新建工程 新建maven工程 添加web.xml 添加Tomcat运行环境(为了使用@Resourse注解) 添加依赖jar包 mybatis.jar,mysql.jar,junit.jar 创建实体类 配置mybatis框架 配置文件 映射文件 编写持久层 定义接口 定义接口的实现类 小结 持久层 定义接口 定义接口的实现类 sql语句设置到映射文件中 SqlSession提供的方法:insert update delete selectOne selectList 基于Mapper映射器的myb....

整合

2022-07-18

整合 spring 与 mybatis的整合(即利用spring来管理mybatis对象) 包含3大框架,spring,spring-mvc,mybatis,所以必须配置这三部分 配置spring-mybatis 利用监听器加载spring-mybatis.xml文件(以前是通过new ClassPathXmlApplicationContext("..xml")来加载),这个文件里面配置了数据库,mybatis和业务层的扫描 配置数据库 首先要对jdbc.properties文件进行解析,利用util:properties标签加载jdbc.properties 其次要利用spring管理对象的功能来实例化线程池的bean(org.apache.commons.dbcp.BasicDataSource),里面有6个bean注入,利用spring表达式来读取配置 配置mybatis mybatis依赖于SqlSession对象和映射文件,利用spring来管理SqlSession对象(即实例化sessionFactory) (以前在SqlConfig里面实现了数据库的注入....

day08

2022-07-18

day08 #[回顾]# 1.mybatis:持久层;封装了jdbc底层的api;映射文件(核心)编写sql语句. 2.mapper节点中,namespace="接口的名称"; 3.<insert><update><delete><select> 4.以上4个节点中,id属性值="方法的名称" 5.都可以有parameterType属性:如果属性是基本数据类型或者String类型,可省略;如果是实体类类型必须写上 6.<insert><update><delete>没有resultType,只有有resultType;如果查询的方法返回类型为实体类类型或者List<实体类类型>类型,resultType的值表示记录封装的实体类类型 7.在查询时候,如果字段名和属性名不相同,有两种解决方案: 1.给字段起别名:别名必须和属性名相同 2.字段和属性之间做个映射 #ssm整合:部门管理# ##新建工程 1.新建maven工程 2.添加web.xml 3.添加tomcat运行环境 4.添加依赖ja....

dat07

2022-07-18

dat07 王影 wangying@tedu.cn #ssm# ##Mybatis 1.持久层的框架,支持普通的sql语句,存储过程(项目) 2.封装了底层的jdbc 3.提高开发效率 4.sql语句可以配置到xml文件中,注解 框架的使用 建库 create database mydb; 1.建表 create table t_user( id int auto_increment primary key, name varchar(50), pwd varchar(32), email varchar(50), phone varchar(32) ) 2.新建工程 1)新建maven工程 2)添加web.xml 3)添加tomcat运行环境 4)添加依赖jar包 mybatis.jar,mysql.jar,junit.jar 3.编写实体类User public class User { private Integer id; private String name; private String pwd; private String email; private Strin....

05-validation参数校验

2022-07-18

05-validation参数校验 validation参数校验 一. 基本使用 1. 集成springmvc 加入maven依赖 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.Final</version> </dependency> Spring-mvc配置文件 <!-- 指定自己定义的validator --> <mvc:annotation-driven validator="validator"/> <!-- 以下 validator ConversionService 在使用 mvc:annotation-driven 会 自动注册--> <bean id="validator" class="org.springframework.validation.beanv....

01-注解@InitBinder

2022-07-18

01-注解@InitBinder @InitBinder 1. 用@InitBinder自定义数据绑定 ​ 将前台传过来的数据自定义成另外一种格式进行绑定 在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换,而SpringMVC默认不支持这个格式的转换,所以需要手动配置,自定义数据的绑定才能解决这个问题。 在需要日期转换的Controller中使用SpringMVC的注解@initbinder和Spring自带的WebDateBinder类来操作。 WebDataBinder是用来绑定请求参数到指定的属性编辑器.由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再SET进去。 2. WebDataBinder ​ WebDataBinder把字符串形式的参数转换成服务端真正需要的类型的转换工具 ​ 也就是说将前台传过来的字符串参数进行转义,转换成我们需要的指定对象属性的格式。 举例如下 @Ini....

04-mybatis逆向工程及应用

2022-07-18

04-mybatis逆向工程及应用 mybatis逆向工程及应用 使用插件可以方便的根据数据库自动生成`单表java bean和xml文件 详情可见https://blog.csdn.net/qq_39056805/article/details/80585941 一. 配置文件 1. generator.xml 自动生成的配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > <generatorConfiguration> <properties resource="mybatis/generatorConfig.properties"/> <context id=....

02-HandlerMethod分析

2022-07-18

02-HandlerMethod分析 HandlerMethod分析 一. 术语解释 1.1 Handler ​ 绑定了注解@RequestMapping和@Controller的类 1.2 HandlerMethod ​ 就是Handler下某个绑定@RequestMapping注解的方法(GetMapping、PostMapping...等都绑定的有注解@RequestMapping,spring mvc在做注解解析处理生成代理对象等的时候,会做值的合并等处理,所以最终都是用RequestMapping的注解来计算,所以@Controller和@RestController的处理等同) 二.

03-自定义注解+拦截器

2022-07-18

03-自定义注解+拦截器 自定义注解+拦截器 一. 实例代码 总的功能就是,对加了注解@NeedUserLogin的方法,进行登录拦截,如果未登录,则重定向到登录界面,如果登录,则进行业务逻辑的处理。 1. AnnotationInterceptor抽象类 import org.apache.commons.lang.StringUtils; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.annotation.Annotation; public abst....

06-EnvironmentAware接口的作用

2022-07-18

06-EnvironmentAware接口的作用 EnvironmentAware接口的作用 一. springboot中的使用 凡注册到Spring容器内的bean,实现了EnvironmentAware接口重写setEnvironment方法后,在工程启动时可以获得application.properties的配置文件配置的属性值。 @Configuration public class MyProjectc implements EnvironmentAware { @Override public void setEnvironment(Environment environment) { String projectName = environment.getProperty("project.name"); System.out.println(projectName); } } 二. 整合mybatis 1. application.properties文件配置 datasource.driverClassName=com.mysql.jdbc.Driver da....

jpa1

2022-07-18

jpa1 什么是JPA JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 基于注解的使用 注解 解释 @Entity 声明类为实体或表。 @Table 声明表名。 @Basic 指定非约束明确的各个字段。 @Embedded 指定类或它的值是一个可嵌入的类的实例的实体的属性。 @Id 指定的类的属性,用于识别(一个表中的主键)。 @GeneratedValue 指定如何标识属性可以被初始化,例如自动、手动、或从序列表中获得的值。 @Transient 指定的属性,它是不持久的,即:该值永远不会存储在数据库中。 @Column 指定持久属性栏属性。 @SequenceGenerator 指定在@GeneratedValue注解中指定的属性的值。它创建了一个序列。 @TableGenerator 指定在@GeneratedValue批注指定属性的值发生器。它创造了的值生成的表。 @AccessType 这种类型的注释用于设置访问类型。如果设置@AccessType(FIEL....

01-ReversedLinkedList

2022-07-18

01-ReversedLinkedList 一. 题目描述 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL 二. 解决方案(java版) 1. 迭代 package array_linked; class ListNode { int val; ListNode next = null; ListNode(int x) { val = x; } @Override public String toString() { return val + ""; } } public class ReverseLinkedList { public static ListNode reverseList(ListNode head) { ListNode curr = head; ListNode prev = null; while (curr != null) { ListNode temp =....

06-ImplementStackUsingQueue

2022-07-18

06-ImplementStackUsingQueue 一. 问题描述 使用普通队列实现栈的数据结构 二. 解决方案(java版) 2.1 使用一个queue(原始版) class MyStack<E>{ private Queue<E> queue; private boolean isZero = true; public MyStack(){ this.queue = new LinkedList<>(); } public void push(E x) { if (isZero){ queue.offer(x); }else { E e = queue.poll(); queue.offer(e); queue.offer(x); isZero = true; } } public E pop() { if (isZero){ for (int i = 0; i < queue.size() - 1; i++) { E e = queue.poll(); queue.offer(e); } return queue.poll(); }....

16-GenerateParentheses

2022-07-18

16-GenerateParentheses 一. 题目描述 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: [ "((()))", "(()())", "(())()", "()(())", "()()()" ] 生成合法括号 二. 解决方案(java版) 2.1 递归 public List<String> generateParenthesis(int n) { List<String> list = new ArrayList<>(); generate("", list, n, 0, 0); return list; } /** * 递归生成序列 * @param str * @param list * @param n * @param left * @param right */ pr....

09-ValidAnagram

2022-07-18

09-ValidAnagram 一. 问题描述 Given two strings s and t , write a function to determine if t is an anagram of s. Example 1: Input: s = "anagram", t = "nagaram" Output: true Example 2: Input: s = "rat", t = "car" Output: false You may assume the string contains only lowercase alphabets. 判断两个字符串是否为相同字母异序词 二. 解决方案(java版) 2.1 排序的方式 public boolean isAnagram2(String s, String t) { if (s.length() != t.length()){ return false; } char [] str1 = s.toCharArray(); char [] str2 = t.toCharArray(); Arrays.sort(st....

20-ImplementTrie

2022-07-18

20-ImplementTrie 一. 问题描述 implement a trie with insert, search, and startsWith methods. * 实现一个字典树 leetcode 208 二. 解决方案(java) package tree_graph; /** * @Author: M˚Haonan * @Date: 2019-05-06 17:02 * @Description: implement a trie with insert, search, and startsWith methods. * 实现一个字典树 * leetcode 208 */ class TrieNode{ char val; boolean isWord = false; TrieNode[] children = new TrieNode[26]; public TrieNode(){ } public TrieNode(char c){ this.val = c; } } class Trie { //根节点 private TrieNode root; /**....

11-LowestCommonAncestorOfBinaryTree

2022-07-18

11-LowestCommonAncestorOfBinaryTree 一. 题目描述 Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. leetcode 236 寻找一个二叉树中两个节点的最近公共祖先 二. 解决方案(java版) 2.1 递归 /* * 利用递归实现 * @param root * @param p * @param q * @return */ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { //如果root为null,直接return null if (root == null) return null; //如果root为p或者root为q,那么root即为所求 //这里也可以寻找到p,q元素 if (root == p || root == q) return root; //分别递归求左子树节点和右子树节点的....