141.SpringBoot几个常用的注解
- @RestController和@Controller指定一个类,作为控制器的注解
- @RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉
- @EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器
- @Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类,完成元数据bean的初始化。
- @ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上
- @ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。
- @Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean
- @Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。
142.Springboot解决那些问题
- 编码更简单
- Spring框架由于超重量级的 XML,annotation配置,使得系统变得很笨重,难以维护
- Springboot采用约点大于配置的方法,直接引入依赖,即可实现代码的开发
- 配置更简单
- Xml文件使用 javaConfig代替,XML中 bean的创建,使用@bean代替后可以直接注入。
- 配置文件变少很多,就是 application.yml
- 部署更简单
- 一键启动,一键解压; ②不需要应用服务器:Tomcat(X)weblogic(x);
- 降低对运行环境基本要求:部署环境只需要有JDK即可,默认内置tomcat服务器
- 监控更简单
- Spring-boot-start-actuator: 可以查看属性配置;线程工作状态;环境变量;
- JVM性能监控
143.什么是SpringCloud
Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的。
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署
144.SpringCloud组成
- 服务发现——Netflix Eureka
- 客服端负载均衡——Netflix Ribbon/Feign
- 服务网关——Netflix Zuul
- 断路器——Netflix Hystrix
- 分布式配置——Spring Cloud Config
145.SpringCloud特性
- 分布式/版本化配置。
- 服务注册和发现。
- 路由。
- 服务和服务之间的调用。
- 负载均衡。
- 断路器。
- 分布式消息传递。
146.SpringCloud优缺点
- Spring Cloud 来源于 Spring,质量、稳定性、持续性都可以得到保证。
- Spirng Cloud 天然支持 Spring Boot,更加便于业务落地。
- Spring Cloud 发展非常的快,从 2016 年开始接触的时候相关组件版本为 1.x,到现在将要发布 2.x 系列。
- Spring Cloud 是 Java 领域最适合做微服务的框架。
- 相比于其它框架,Spring Cloud 对微服务周边环境的支持力度最大。
- 对于中小企业来讲,使用门槛较低。
- Spring Cloud 是微服务架构的最佳落地方案。
147.SpringCloud常用注解
- @Mapper: 注解写在你的Mapper映射接口上面
- @SpringBootApplication: 写在主程序上面
- @Configuration: 写在配置类上面
- @Bean: 写在配置类中的返回新的对象的方法上面
- @EnableEurekaServer: 把当前微服务标记为Eureka注册中心 接收其他微服务的注册
- @EnableEurekaClient: 注册该微服务到Eureka中
- @LoadBalanced: 该注解写在配置RestTemplate的配置类方法上来启动ribbon负载均衡
- @EnableFeignClients: 写在主程序上来支持feign
- @HystrixCommand(fallbackMethod=“你的方法”)
- @EnableCircuitBreaker : 启用对Hystrix熔断机制的支持
- @FeignClient(value=“服务名”,fallbackFactory=实现FallbackFactory的类.class): 实现服务降级
- @EnableHystrixDashboard: 加在主程序上启动服务监控
- @FeignClient(value=“服务名”): 写在接口上 来调用远程服务
- @EnableZuulProxy: 写在主程序上启动zuul路由访问功能
148.线程和进程的区别:
- 进程是一个 “执行中的程序”,是系统进行资源分配和调度的一个独立单位;
- 线程是进程的一个实体,一个进程中拥有多个线程,线程之间共享地址空间和其它资源(所以通信和同步等操作线程比进程更加容易);
- 线程上下文的切换比进程上下文切换要快很多。
- 进程切换时,涉及到当前进程的 CPU 环境的保存和新被调度运行进程的 CPU 环境的设置。
- 线程切换仅需要保存和设置少量的寄存器内容,不涉及存储管理方面的操作。
149.什么是阻塞(Blocking)和非阻塞(Non-Blocking)?
阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其他所有需要这个而资源的线程就必须在这个临界区中进行等待。等待会导致线程挂起,这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其他所有阻塞在这个临界区上的线程都不能工作。
非阻塞的意思与之相反,它强调没有一个线程可以妨碍其他线程执行。所有的线程都会尝试不断前向执行。
150.Java 中线程有几种状态?
六种(查看 Java 源码也可以看到是 6 种),并且某个时刻 Java 线程只能处于其中的一个状态。
- 新建(NEW)状态:表示新创建了一个线程对象,而此时线程并没有开始执行。
- 可运行(RUNNABLE)状态:线程对象创建后,其它线程(比如 main 线程)调用了该对象的 start() 方法,才表示线程开始执行。当线程执行时,处于 RUNNBALE 状态,表示线程所需的一切资源都已经准备好了。该状态的线程位于可运行线程池中,等待被线程调度选中,获取 cpu 的使用权。
- 阻塞(BLOCKED)状态:如果线程在执行过程终于到了 synchronized 同步块,就会进入 BLOCKED 阻塞状态,这时线程就会暂停执行,直到获得请求的锁。
- 等待(WAITING)状态:当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。在调用Object.wait方法或Thread.join方法,或者是等待java.util.concurrent库中的Lock或Condition时,就会出现这种情况;
- 计时等待(TIMED_WAITING)状态:Object.wait、Thread.join、Lock.tryLock和Condition.await 等方法有超时参数,还有 Thread.sleep 方法、LockSupport.parkNanos 方法和 LockSupport.parkUntil 方法,这些方法会导致线程进入计时等待状态,如果超时或者出现通知,都会切换会可运行状态;
- 终止(TERMINATED)状态:当线程执行完毕,则进入该状态,表示结束。
注意:从 NEW 状态出发后,线程不能再回到 NEW 状态,同理,处于 TERMINATED 状态的线程也不能再回到RUNNABLE 状态