分布式和微服务的区别
分布式的意思是多个模块共同完成一件事情(也可以是一个模块分多个部署),每个节点可以单独完成任务;(分开不同机器部署)
微服务的意思也是多个模块共同完成一件事情,(不管应用部署在哪里)
总结:
微服务和分布式都是拆分单体应用的产物,可以理解为,微服务只是对服务拆分的形容词,分布式是对服务部署方面的考量,微服务是可以包含分布式的,但是分布式不一定是微服务;
线程池与多线程的区别:
线程池:是在程序运行开始,创建好的n个线程,并且这n个线程挂起等待任务的到来。
多线程:是在任务到来得时候进行创建,然后执行任务。
线程池:其中的线程执行完之后不会回收线程,会继续将线程放在等待队列中;
多线程:程序在每次任务完成之后会回收该线程。
由于线程池中线程是创建好的,所以在效率上相对于多线程会高很多。
线程池也在高并发的情况下有着较好的性能;不容易挂掉。多线程在创建线程数较多的情况下,很容易挂掉。
在mybatis中#和 $ 的主要区别是:
#传入的参数在SQL中显示为字符串,#方式能够很大程度防止sql注入, $ 传入的参数在SqL中直接显示为传入的值,$方式无法防止Sql注入。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${};两者都是动态的向sql语句中传入需要的参数。
mybatis中#和$的区别是什么
1、传入的参数在SQL中显示不同
#传入的参数在SQL中显示为字符串(当成一个字符串),会对自动传入的数据加一个双引号。
例:使用以下SQL
select id,name,age from student where id =#{id}
当我们传递的参数id为 “1” 时,上述 sql 的解析为:
select id,name,age from student where id ="1"
$传入的参数在SqL中直接显示为传入的值
例:使用以下SQL
select id,name,age from student where id =${id}
当我们传递的参数id为 “1” 时,上述 sql 的解析为:
select id,name,age from student where id =1
2、#可以防止SQL注入的风险(语句的拼接);但$无法防止Sql注入。
3、$方式一般用于传入数据库对象,例如传入表名。
4、大多数情况下还是经常使用#,一般能用#的就别用 $ ;但有些情况下必须使用 $ ,例:MyBatis排序时使用order by 动态参数时需要注意,用 $ 而不是#。
mysql、nosql
1、为什么有Nosql?
增加字段需要-->无格式
高并发需要-->转向内存
横向拓展需要-->以前是分库分表
关键:传统数据库需要“关系”,所有表存在同一台服务器中,是一个单机系统。
而Nosql不使用关系,每条数据独立存储
Nosql不需要:数据库一致性要求、读写的实时性、复杂sql查询
NoSQL 数据库的类型:
- 面向文档
- 键值
- 图表
- 列导向
2、什么是NoSQL数据库?在哪些情况下使用和不使用NoSQL数据库?
NoSQL是非关系型数据库,NoSQL = Not Only SQL。
关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。两者是不同的数据存储结构。
在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。
在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。
3、非关系型数据库有哪些?MySQL和MongoDB之间最基本的区别是什么?
非关系型数据库有:MongoDB(用得较多)、Membase、Hypertable
关系型数据库与非关系型数据库的区别:数据存储结构的不同。
4、redis与mongodb
完全不同的东西。
mongodb:最像关系型数据库的nosql。相比redis,只是缓存了热点数据在内存
redis:in-memory;丰富的数据结构;一般作为缓存,提高了并发性;
5、Nosql的shard(一致性哈希)
复制,横向拓展,只支持更多的读请求;
分片,支持更多的读、写请求;
如果把日期设为分片,则不能享受并发性的写请求;
MongoDB和Redis的区别
MongoDB 更类似 MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据,但是不支持事务。
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,支持多种类型的数据结构,可用作数据库,高速缓存和消息队列代理。
MongoDB和Redis的区别是什么:
1、内存管理机制
Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。
MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。
2、支持的数据结构
Redis 支持的数据结构丰富,包括hash、set、list等。
MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
3、数据量和性能:
当物理内存够用的时候,redis>mongodb>mysql
当物理内存不够用的时候,redis和mongodb都会使用虚拟内存。
实际上如果redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。
但是,mongodb不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。
mongodb还是能够保证性能。
4、性能
mongodb依赖内存,TPS较高;Redis依赖内存,TPS非常高。性能上Redis优于MongoDB。
5、可靠性
mongodb从1.8版本后,采用binlog方式(MySQL同样采用该方式)支持持久化,增加可靠性;
Redis依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能。
可靠性上MongoDB优于Redis。
6、数据分析
mongodb内置数据分析功能(mapreduce);而Redis不支持。
7、事务支持情况
Redis 事务支持比较弱,只能保证事务中的每个操作连续执行;mongodb不支持事务。
8、集群
MongoDB 集群技术比较成熟,Redis从3.0开始支持集群。
Nginx 与网关之间存在那些区别
首先会发现网关和 nginx 是非常相似的,微服务网关能够做的事情,nginx 也可以实现,但两者之间仍然存在一些区别。
相同点:都是可以实现 API 的拦截,也可以实现负载均衡,反向代理,请求过滤,可以完全和网关实现一样的效果,这是显而易见的。
早期工作中没有用网关进行处理,因为当时没有网关,当时是基于项目名称转到真正的地址,但是后来发现这样做的唯物性很差,因为有时需要通过做一些复杂的工作, Nginx 就要结合复杂的语言。
所以他们之间的不同点有:
Nginx 采用 c 语言编写,作为 Java 程序员很少有人能懂得 C 语言的编写,因为他们的入门语言就是 Java 语言。
在微服务领域中,都是自己语言编写的,微服务领域是一种架构思想,任何语言都有微服务领域,在微服务领域中在每个编程语言中都存在,比如使用 Java 构建微服务项目,既然使用Java来构建微服务项目,那么能够知道的是 Gateway 也就是 Java 语言编写的。
毕竟 gateway 是用 Java 语言写的,所以在想做扩展功能时,就能够自己上手,困难性不高,如果用 Nginx 来做的话就需要结合语言来进行扩展,这样的话就需要学习 C 语言和 lua 语言,困难性更高。所以专业的人要去做专业的事情。
Nginx 也能做服务类的项目,比如服务熔断,还可以做黑名单白名单项目,有些公司中 nginx 可以解决黑名单和白名单。毕竟 gateway 属于 Java 语言编写的,能够更好的对微服务实现扩展功能,大公司里面会有对入门语言有要求,Java 就不是很专业。相比 nginx 如何实现扩展功能的话,必须要学习 lua 或者 c 语言,那么整个学习成本会非常高。
Nginx与网关的区别【第二种回答】
网关服务的端口号默认是80或者443.
相同点:都是可以实现对api接口的拦截,负载均衡、反向代理、请求过滤等,可以实现和网关一样的效果。
不同点:
a、底层实现
Nginx采用C语言编写的
微服务都是自己语言编写的 比如Gateway就是java写的。
毕竟Gateway属于Java语言编写的, 能够更好对微服务实现扩展功能,相比Nginx如果想实现扩展功能需要结合Nginx+Lua语言等。
b、负载均衡
Nginx实现负载均衡的原理属于服务器端负载均衡器。
Gateway实现负载均衡原理采用本地负载均衡器的形式。
过滤器与拦截器区别
实际开发中,拦截器的应用场景会比过滤器要更多,下面是拦截器和过滤器的主要应用场景
拦截器的应用场景【拦截器是SpringMVC的技术】:权限控制,日志打印,参数校验
过滤器的应用场景【过滤器的Servlet的技术】:跨域问题解决,编码转换
1、过滤器是基于函数回调的,而拦截器是基于java反射的
2、过滤器依赖于servlet容器,而拦截器不依赖与Servlet容器,拦截器依赖SpringMVC
3、过滤器几乎对所有的请求都可以起作用,而拦截器只能对SpringMVC请求起作用
4、拦截器可以访问处理方法的上下文,而过滤器不可以
5、触发时机不同,过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。
拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。
6、控制执行顺序不同
实际开发过程中,会出现多个过滤器或拦截器同时存在的情况,不过,有时我们希望某个过滤器或拦截器能优先执行,就涉及到它们的执行顺序。
过滤器用@Order注解控制执行顺序,通过@Order控制过滤器的级别,值越小级别越高越先执行。
@Order(Ordered.HIGHEST_PRECEDENCE)
@Component
public class MyFilter2 implements Filter {
拦截器默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行。
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**").order(2);
registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**").order(1);
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").order(3);
}
拦截器应用场景
拦截器本质上是面向切面编程(AOP),符合横切关注点的功能都可以放在拦截器中来实现,主要的应用场景包括:
- 登录验证,判断用户是否登录。
- 权限验证,判断用户是否有权限访问资源,如校验token
- 日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
- 处理cookie、本地化、国际化、主题等。
- 性能监控,监控请求处理时长等。
- 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)
过滤器应用场景
1)过滤敏感词汇(防止sql注入)
2)设置字符编码
3)URL级别的权限访问控制
4)压缩响应信息
过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射
拦截器在用户权限校验场景下使用会比较多,由于一般是前后端分离项目,过滤器的使用场景就会少很多。
过滤器就是筛选出你要的东西,比如requeset中你要的那部分
拦截器在做安全方面用的比较多,比如终止一些流程
过滤器(Filter) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。
拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。
切片(Aspect): 可以拿到方法的参数,但是却拿不到http请求和响应的对象
过滤器
过滤器(Filter)是处于客户端与服务器目标资源之间的⼀道过滤技术。
● 生活中的过滤器:净⽔器,空气净化器
● web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成⼀些特殊的功能。
过滤器作用
● 执行是在Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时, 会根据执行流程再次反向执行Filter
● ⼀般用于完成通用的操作。如:登录验证、统⼀编码处理、敏感字符过滤
常见的过滤器用途主要包括:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件等**。
拦截器
拦截器作用
拦截器采用AOP的设计思想, 它跟过滤器类似, 用来拦截处理方法在之前和之后执行一些 跟主业务没有关系的一些公共功能:
比如:可以实现:权限控制、日志、异常记录、记录方法执行时间.....
总结
过滤器就是筛选出你要的东西,比如requeset中你要的那部分 拦截器在做安全方面用的比较多,比如终止一些流程
当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。
过滤器(Filter) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。
拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。
在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。
切片(Aspect): 可以拿到方法的参数,但是却拿不到http请求和响应的对象
监听器(Listener):当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到监听器。