总结:学习 + 工作 (2020.03)
1、代码事务中对数据库操作的顺序
最好是查询、删除、新增操作放在代码中事务的开始,将修改放在事务将要结束的地方。
因为修改涉及到对数据的加锁(间隙锁),所以为了尽量短时间的锁住数据,修改应该放在事务即将结束的位置。
2、创建对象的相关问题
之前是看了 JVM 课程,认为创建对象可以写为 User user = null; 然后在代码逻辑里可以给 user 赋值。但是会出现一个问题,如果该 user 未赋值,而直接对该对象的字段赋值,就会报空指针异常。(实际写代码遇到,try catch 中,try 会返回一个 user 实例对象,catch 里直接捕获 service 的异常,没有 user 对象,并且 user.setName()类似操作,就会报空指针异常 )
所以以后创建对象,还是写 User user = new User(); 不写 User user = null;
重构学习知识点
3、微服务部署的
以 nacos 作为注册/配置中心,相同的实例在不同的 IP 注册到 nacos 中,就是多个实例。例如两台主机上都有同一个 User 项目注册到一个 nacos 中心上,则有两个 User 实例。ribbon 负载均衡在微服务中的应用,默认都是以轮询方式访问。
如果 nacos 注册/配置中心有多个,则形成了微服务的集群。
4、微服务的拆分
将公共功能部分拆分出来,这叫横向拆分,可以让下游其他微服务共用。
按功能的聚合度拆分,叫纵向拆分,这样从页面展示到数据库数据交互都在同一个微服务中。
微服务下的问题在单体情况下也有,但是在微服务分布式情况下就尤为突出。
接口调用就需要服务发现与注册,服务调用;
接口错误就需要降级和熔断处理;
接口性能就需要扩容;
接口调用情况就需要监控;
问题排查就需要全链路追踪。
5、微服务的组件
注册中心:
微服务的服务者提供心跳给注册中心是用 http 请求来告知注册中心。
如果有注册提供者节点新增或者删除,注册中心探知到,就要推送到服务消费者,然后刷新缓存在本地的注册列表。
测试节点环境和开发节点环境,在部署的时候可以直接动态修改指定的环境。例如代码里虽然指向 dev 环境,但是部署时可以指定 test 环境。该操作是通过 springboot 的 main 方法的 args 参数来动态改变。
注册中心一般是集群部署,那么就涉及到了一致性。所以注册中心自身还会有一致性的操作。
RPC 调用:
要考虑支持数据结构类型的丰富度、跨语言支持、性能与可读性(压缩的数据需要的带宽更小,传输速度更快)。
监控:
请求量和响应时间是反应接口健康的重要指标。
治理手段:
实现负载均衡是 ribbon 做的事,nacos 只是动态配置算法,作为动态参数传入到 ribbon 的算法设置中。
6、微服务的使用基础点
在实际的项目中,某个服务调用可能超市,则我们需要使用 重试 来保证调用的成功率。但是这里也涉及到一个 幂等性。(幂等性可以使用悲观锁、乐观锁,数据库字段唯一索引等实现)
注册中心需要考虑到的两个点:高可用(集群、多IDC部署)、一致性。