版本
SpirngBoot:2.0.0.M3
SpringCloud:Finchley.M2
Eureka Server 单机
- Eureka Server既是Server,又是Client,自己向自己注册
(1)作为Server,server.port指定运行端口,则Server Url为:http://ip:server.port/eureka/
(2)作为Client,指定Server Url
eureka.client.service-url.defaultZone
(3)Server只作为服务注册中心,自己向自己注册,没有意义
eureka.client.register-with-eureka:false - 指定服务名,否则在服务注册中心的服务注册表中,应用名显示为默认的UNKNOWN
spring.application.name - @EnableEurekaServer
Eureka Server高可用
3个Eureka Server,每个Eureka Server向其它2个进行注册,并获取服务,运行时Server之间会同步服务注册表,默认0ms;
Eureka Client启动时,会向所有Eureka Server注册
-
Eureka Server既是Server,又是Client,需要向集群中其它Eureka Server注册,并获取其它Server的服务注册表
(1)作为Server,指定运行端口
(2)作为Client,指定其他Server的url,多个以,隔开
(3)不能像单机情景一样,此时需要向其它Server注册,但eureka.client.register-with-eureka默认为true -
指定服务名
-
@EnableEurekaServer
Eureka Server高可用,其它配置
-
使用SpringBoot的Security组件,添加验证功能,没有验证的Client不能访问Eureka Server
(1)security.basic=true,开启验证
security.user.name和security.user.password指定用户名和密码
(2)微服务系统中的所有Client访问Eureka Server时,使用eureka.client.service-url.defaultZone指定Eureka Server,需要将验证的用户名和密码加上
http://userName:password@ip:port/eureka/ -
服务实例名 instanceId
默认格式: host_name:application_name:application_port
可以使用eureka.instance.instance-id进行修改 -
Eureka Client通过Eureka Server提供的REST API进行服务的注册、续约、获取和下线等工作。例如注册是1个POST请求,获取是1个GET请求,可以使用/eureka/apps获取Eureka Server上的服务注册表
-
自我保护
Eureka Client
- 向Eureka Server注册
eureka.client.service-url.defaultZone - 指定应用名,否则使用默认的UNKNOWN
spring.application.name - 指定运行端口
server.port - @EnableEurekaClient
默认配置
- 续约Renew、获取Fetch默认时间:30s
- 默认从Eureka Server获取服务注册表 eureka.client.fetch-registry
- 默认向Eureka Server注册 eureka.client.register-with-eureka
- 如果Eureka Server在指定时间内,没有收到Eureka Client的心跳,会将其从服务注册表中删除。默认90s
服务拆分模型
X 水平复制
Y 功能解耦
Z 数据分区
X 将应用程序水平复制,通过LB运行完全一样程序的多个副本,来实现应用程序的伸缩性,提供处理请求的容量
Y 针对功能来分解,将不同业务模型分成多个服务
-
单一职责,松耦合,高内聚
每个服务只负责1个业务
松耦合:服务之间耦合度低,修改1个服务,其它服务不需要跟着修改
高内聚:服务内部,相关行为都聚集在1个服务内 -
关注度分离
(1)按职责,例如订单服务,商品服务
(2)按通用性,与业务无关的公共服务,例如用户服务,消息服务
(3)按粒度,不太好把握,随业务变化而变化,例如订单服务包括订单和支付功能,在用户数量增长到比较大时,需要拆分
Z 每个服务器负责整体数据的1个子集
- 先考虑拆分业务功能,再考虑拆分数据
- 考虑数据是否有状态
如果完成1个业务需要多个服务协作,则这个业务是有状态服务,在多个服务中流转的数据时有状态的数据。在微服务中,需要将有状态的数据转化成无状态的数据
例如用户登录,单体应用使用Session存储用户信息,Session又存放在Web容器,供所有业务模块共享。在微服务架构中,根据业务拆分成一个一个部署在独立Web容器上的服务,将用户信息迁移到分布式缓存中存储,让登录服务成为分布式系统中单独的节点,供所有模块共享
问题
- Mybatis resultType和resultMap
- MyBatis 实体类implements Seria
- foreach()
allowMultiQueries=true
@Transactional
Spring支持声明式事务和编程式事务
编程式事务需要编写事务逻辑代码,不但麻烦,而且会对业务代码进行侵入
声明式事务,基于AOP,本质上是对业务方法进行拦截,在业务方法执行前,创建1个事务,在执行完业务方法后,根据它的执行情况,提交事务或回滚事务。声明式事务使用注解@Transactional,且不对业务代码进行侵入
-
自动提交
默认情况,DB自动提交,每个SQL语句是1个单独的事务,如果SQL执行成功,事务会隐式的自动提交;如果执行失败,则会隐式的回滚
但是对于事务来说,它包括1组操作,需要关闭自动提交,Spring会默认关闭自动提交 -
连接关闭,C3P0连接池会回滚未提交事务
(1)可以放在接口、接口方法、类、类方法上
(2)放在接口/接口方法上时,只有使用动态代理时才会生效
(3)放在类上,对类的所有public方法生效;但会被方法级别的注解覆盖
(4)只对public方法生效
(5)只有被外部调用时,才生效;类内部调用,不会生效
-
属性
value String 可选的限定描述符,指定使用的事务管理器
propagation enum: Propagation 可选的事务传播行为设置
isolation enum: Isolation 可选的事务隔离级别设置
readOnly boolean 读写或只读事务,默认读写
timeout int (in seconds granularity) 事务超时时间设置
rollbackFor Class对象数组,必须继承自Throwable 导致事务回滚的异常类数组
rollbackForClassName 类名数组,必须继承自Throwable 导致事务回滚的异常类名字数组
noRollbackFor Class对象数组,必须继承自Throwable 不会导致事务回滚的异常类数组
noRollbackForClassName 类名数组,必须继承自Throwable 不会导致事务回滚的异常类名字数组 -
事务隔离级别
默认,使用底层DB的事务隔离级别。即已提交读
(1)未提交读,1个事务可以读取,其它事务修改但未提交的数据。该级别不可防止脏读,不可重复读和幻读
(2)已提交读,1个事务只能读取,其它事务提交后的数据。可以防止脏读,但不可防止不可重复读和幻读。一般DB设置的事务隔离级别
(3)可重复读,1个事务可多次执行某个查询,返回的数据是一样的。可以防止脏读和不可重复读,但不可防止幻读
(4)序列化,所有事务依次执行,互相不影响。可以防止脏读、不可重复读和幻读。但是非常消耗性能 -
事务传播行为
在开始当前事务之前,一个事务已经存在,可以选择几种方式来执行它们
(1)REQUIRED,默认。如果当前存在事务,加入该事务,否则创建1个新的事务
(2)REQUIRES_NEW,如果当前存在事务,创建1个新事务,并将当前事务挂起
(3)SUPPORTS,如果当前存在事务,加入该事务,否则以非事务运行
(4)SUPPORTED,以非事务运行,如果当前存在事务,挂起当前事务
(5)NEVER,以非事务运行,如果当前存在事务,抛出异常
(6)MANATORY,如果当前存在事务,加入,否则抛出异常
(7)NESTED -
回滚
在事务上下文,抛出异常会导致事务回滚。Spring会捕捉异常,并根据规则进行回滚
默认情况下,所有RuntimeException的子类及Error都会导致回滚
网友评论