微服务
最大的特点就是独立,自治。
单体应用的优点在于:单一架构模式在项目初期很小的时候开发方便,测试方便,部署方便,运行良好。
他的缺点也很明显:
应用随着时间的推进,加入的功能越来越多,最终会变得巨大,一个项目中很有可能数百万行的代码,互相之间繁琐的jar包。
久而久之,开发效率低,代码维护困难。
微服务: 微服务是一种架构,这种架构是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通
常实现一组独立的特性或功能,包含自己的业务逻辑和适配器。各个微服务之间的关联通过暴露api来实现。这些
独立的微服务不需要部署在同一个虚拟机,同一个系统和同一个应用服务器中。
服务治理就是进行服务的自动化管理,其核心是服务的注册与发现。
注册中心
项目将每一个微服务注册到注册中心,注册中心感知每一个微服务,方便微服务之间进行相互调用。
注册中心:将每一个服务注册到注册中心,其他服务可以通过注册中心发现其他服务,从而进行远程调用功能。
提供者将自己提供服务的名称及自己主机详情(IP、端口等)写入到另一台主机中的一个列表中,这个 列表称为服务注册表;所有消费者需要调用微服务时,首先从这台主机中将服务注册表下载到本地,然 后根据消费者本地设置好的负载均衡策略选择一个服务提供者进行调用。那么,这台主机就称为微服务 注册中心。
微服务注册中心的主要功能主要有以下几点:
实现provider与consumer间的解耦合。提供者对于消费者来说是透明的,不固定的
使消费者调用提供者实现负载均衡成为可能
通过微服务注册中心的Dashboard监控微服务的运行状态
配置中心
在nacos中,我们需要对每一个微服务进行配置,在项目实际开发中,我们可以直接在配置中心中进行修改配置,不需要修改源码。
远程调用
使用feign 进行给对方服务进行发送请求。
我们通过feign 来进行远程调用,使用注解@EnableFeignClients 在服务者开启feign功能
使用注解@FeignClient("gulimall-coupon") 在消费者开启接受请求
前提是feign请求由网关进行统一转发
feign
springcloud 使用feign进行发送请求。
网关
将所有请求发给网关,由网关统一转发给相关服务。我们可以在网关处配置统一跨域处理。
Spring
IOC
将创建管理对象的工作交给容器来做。在容器初始化(或在某个时间节点)通过反射机制创建好对象,在使用时直接从容器中获取。
控制反转:将对象的控制权反过来交给容器管理。
依赖注入指对象被动地接收依赖类而不用自己主动去找,对象不是从容器中查找它依赖的类,而是在容器实例化对象时主动将它依赖的类注入给它。假设一个Car类需要一个Engine的对象,那么一般需要手动new 一个Engine,利用Ioc就只需要定义一个私有的Engine类型的成员变量,容器会在运行时自动创建一个Engine的实例对象并将引入自动注入给成员变量。只需要一个注解即可
常用的依赖注入注解:
@Autowired :自动按类型注入,如果有多个匹配则按照指定的Bean的id查找,查找不到会报错。
@Qualifier :在自动按照类型注入的基础上再按照Bean的id注入,给变量注入时必须搭配@Autowired,给方法注入时可单独使用。
@Resource:直接按照Bean的id注入,只能注入Bean类型。
@Value:用于注入基本数据类型和String类型
AOP
AOP即面向切面编程,通过预编译和运行期动态代理实现程序功能的统一维护。常用场景:权限认证、自动缓存、
错误处理、日志、调试和事务等
AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用。AOP代理包含了目标对象的全部方法,但AOP代理中的方法与目标对象的方法存在差异:AOP方法在特定切入点添加了增强处理,并回调了目标对象的方法。Spring的AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IoC容器负责管理,
全局异常处理就是一个AOP实现,降低了模块之间的耦合度。
AOP 相关注解
@Aspect:声明被注解的类是一个切面的Bean; 可以打印service层日志
@Before:前置通知,指在某个连接点之前执行的通知;
@After:后置通知,指某个连接点退出时执行的通知(不论程序是正常返回还是异常退出)
@AfterReturning:返回后通知,指某连接点正常完成之后执行的通知,返回值使用returning属性接收。
@AfterThrowing:异常通知,指方法抛出异常导致退出时执行的通知,和@AfterReturning只会有一个执行,异常使用throwing属性接收。
SpringMVC
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,
Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便
组内开发人员之间的配合
SpringMVC 的执行流程
1. 客户端(浏览器)发送请求,直接请求到 DispatcherServlet 。
2. DispatcherServlet 根据请求信息调⽤ HandlerMapping ,解析请求对应的 Handler 。
3. 解析到对应的 Handler (也就是我们平常说的 Controller 控制器)后,开始由
HandlerAdapter 适配器处理。
4. HandlerAdapter 会根据 Handler 来调⽤真正的处理器开处理请求,并处理相应的业务逻
辑。
5. 处理器处理完业务后,会返回⼀个 ModelAndView 对象, Model 是返回的数据对
象, View 是个逻辑上的 View 。
6. ViewResolver 会根据逻辑 View 查找实际的 View 。
7. DispaterServlet 把返回的 Model 传给 View (视图渲染)。
8. 把 View 返回给请求者(浏览器)
SpringBoot 2.0
springboot 四大核心:
自动配置、起步依赖、Actuator、命令行界面
自动配置:使用 @SpringBootApplication 标注的是项目的主配置类,表示项目的启动。
@SpringBootApplication下还有三个注解:
1. @ComponentScan 表示扫描组件,启用注解配置,它会自动扫描启动类所在包以及其子包下所有通过注
解配置的bean,然后将其纳入到IOC容器中。
2. SpringBootConfiguration 标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记
的方法的实例纳入到spring容器中,并且实例名就是方法名
3. EnableAuConfiguration 开启自动配置 它下面还有两个重要的注解
@AutoConfigurationPackage 实现了自动将包放入到扫描器中
@Import注解 自动导入第三方依赖
——————————————————————————————————————————————————————————————————————————————
@SpringBootApplication 完成的三件事情
1、标识当前类为主配置类。
2、自动扫描当前主配置类所在的包及其子包下的所有类。并添加一些类配置类纳入Spring容器中。
3、会自动将SpringBoot项目所需要的第三方依赖进行下载。
1. 在spring 框架中我们需要在pom 文件中导入多个依赖,而在 springboot框架中我们导入一个依赖即可。
springboot帮助我们快速开发一个web容器,使用一个依赖即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. 简化配置,使用注解即可
部署配置方面,原来 Spring 有多个 xml 和 properties配置,在 Spring Boot 中只需要个
application.yml即可。
3. 支持各种REST API 的实现方式
_______________________________________________________________________________
REST:REST其实是一种组织Web服务的架构
URL中只使用名词来定位资源,用HTTP协议里的动词(GET、POST、PUT、DELETE)来实现资源的增删改查操作。
比如,我们有一个friends接口,对于“朋友”我们有增删改查四种操作,怎么定义REST接口?
增加一个朋友,uri: generalcode.cn/v1/friends 接口类型:POST
删除一个朋友,uri: generalcode.cn/va/friends 接口类型:DELETE(在http的parameter指定好友id)
修改一个朋友,uri: generalcode.cn/va/friends 接口类型:PUT(在http的parameter指定好友id)
查找一个朋友,uri: generalcode.cn/va/friends 接口类型:GET
上面我们定义的四个接口就是符合REST协议的,请注意,这几个接口都没有动词,只有名词friends,都是通过Http请求的接口类型来判断是什么业务操作。
RESTful:用URL定位资源、用HTTP动词(GET、POST、PUT、DELETE)描述操作
SpringCloud
springboot是对spring的进一步封装,简化了应用开发和配置。但其开发的应用程序还是一个单体的应用。能够快速高效的开发一个一个的微服务
springcloud就是将这些springboot应用集合起来,组成一个大型应用的方案。并且给微服务之间提供了通讯、路由、熔断等方案。让微服务之间可以自由的通讯协同。
springboot是单独的微服务,springcloud是基于springboot实现的分布式架构治理解决方案。
Distributed/versioned configuration(分布式/版本控制配置)
Service registration and discovery(服务注册与发现)
Routing(路由)
Service-to-service calls(服务于服务间的调用通讯)
Load balancing(负载均衡)
Circuit Breakers(断路器)
Global locks(全局锁)
Leadership election and cluster state(集群)
Distributed messaging(分布式消息)