为什么要看源码: 1、提升技术功底:学习添码里的优秀设计思想,比如一些疑难问题的解决思路,还有一些优秀的设计模式,整体提升自己的技术功底 2、深度掌握技术框架:源码看多了,对于一个新技术或框架的掌握速度会有大幅提升,看下框架demo大致就能知道底层的实现,技术框 架更新再快也不怕 3、快速定位线上问题:遇到线上问题,特别是框架源码里的问题(比如bug),能够快速定位,这就是相比其他没看过源码的人的优势 4、对面试大有神益:面试一线互联网公司对于框架技术一般都会问到源码级别的实现 5、知其然知其所以然:对技术有追求的人必做之事,使用了一个好的框架,很想知道密层是如何实现的 6、拥抱开源社区:参与到开源项目的研发,结识更多大牛,积累更多优质人脉 看源码方法: 1、先使用:先看官方文档快速掌握框架的基本使用 2、抓主线:找一个demo入手,顺藤摸瓜快速静态看一追框架的主线源码,画出源码主流程图,切勿一开始就陷入源码的细枝末节,否则 会把自己烧晕,凭经验猜 3、画图做笔记:总结框架的一些核心功能点,从这些功能点入手深入到源码的细节,边看源码边画源码走向图,并对关键源码的理解做 笔记,把源码里的闪光点都记录下来,后续借鉴到工作项目中,理解能力强的可以直接看静态源码,也可以边看源码边debug源码执行过 程,观察一些关键变量的值 Nacos&Ribbon&Feign核心微服务架构图 服务注册中心 nacos order-service: localhost:9000 stock-service: Jlocalhost:9001 服务注册 localhost:9002) 服务注 服务注册 服务发现 credit-service: localhost:9003 wms-service: localhost:9004 服务注册 库存系统 服务注册 减库行 stock-service 9001 stock-service 库存累统 减车存 2006 订单系统 Feign credit-service 积分服统 order-servic] 9000 tOIR分 9003 Ribbon 仓储系统 注游装 发用* 9004 stock-service: (localhost:9001 order-service:localhost:9000 credit-service: localhost:9003 [ocalhost:9002] wms-service: localhost:9004 架构原理 1、微服务系统在启动时将自己注册到服务注册中心,同时外发布Http接口供其它系统调用(一般都是基于SpringMVC) 2、服务消费者基于Feign调用服务提供者对外发布的接口,先对溅用的本地接口加上注解@FeignClient,Feign会针对加了该注解的接口 生成动态代理,服务消费者针对Feign生成的动态代理去调用方法时,会在底层生成Http协议格式的请求,类似/stock/deduct?
productld=100 3、Feign最终会调用Ribbon从本地的Nacos注册表的缓存里根据服务名取出服务提供在机器的列表,然后进行负载均衡 并选择一台机器出来,对选出来的机器IP和端口拼接之前生成的url请求,生成调用的Http接口地址 192.168.0.60:9000/stock/deduct?productld=100,最后基于HTTPClient调用请求
Nacos架构图 服务注册中心 nacos 服务发现 定时发送心路 stock-service: (localhost:9001 order-service: localhost:9000 credit-service:localhost:9003 localhost:9002) 服务注册 wms-service: localhost:9004 服务注册 服务注册 服务健康检查任务 集许数据同步任务 服务注册 库存系统 服务注册 减库存 stock-service 9001 心院任务 心跳任务 订单系统 Ribbon 库存系统 order-service 9000 减存 stock-service 9002 洋洲表 心任务 stock-service:localhost:9001 order-service:localhost:9000 credit-senvice 积分系统 credit-service:localhost:9003 wms-service: locallhost:9004 E006 心跳任务 合储系统 wms-service 9004 心院任务 Nacos核心功能点 服务注册:NacosClient会通过发送REST请求的方式向NacosServer注册自已的服务,提供自身的元数据,比如ip地址、端口等信息.
NacosServer接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中.
服务心挑:在服务注册后,NacosClient会维护一个定时心跳来持续通知NacosServer,说明服务一直处于可用状态,防止被剔除.
默认 5s发送一次心跳.
服务健康检查:NacosServer会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心期的实例会将它的 healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送 心跳则会重新注册) 服务发现:服务消费者(NacosClient)在调用服务提供者的服务时,会发送一个REST请求给NacosServer,获取上面注删的服务清 单,井且缓存在NacosClient本地,同时会在NacosClient本地开启一个定时任务定时拉取服务碳最新的注册表信息更新到本地缓存 服务同步:NacosServer集群之间会互相同步服务实例,用来保证服务信息的一致性.
Nacos核心功能源码架构图
Nacos服务注册表结构:Map<namespace,Map Group Service Cluster(xJ) Cluster CBJ) InstanceI Instance 3 Initanca2 举例说明:
HaneSpace (Dev) 交易微服务分组(Group) Service(订单服务) Service(支付服务) BJ-cluster HJ-cluster BJ-cluster NJ-cluster Instance(order) Instance (order) 192.168.159.8 Instance (pay) Instance (pay) 192. 168. 159. 8 192. 168. 158. 8 192.168. 158.8 Instance(order) Instance (order) Instance(pay) Instance (pay) 192. 168. 159. 9 192. 168. 157. 9 192. 168. 159. 9 192. 168. 157. 9 仓储微服务分组(Group) Service(库存) Servlce(物流) BJ-cluster HJ-cluster BJ-cluster NJ-cluster Instance(库存) Instance(非存) Instance(物流) Instance(物流) 192. 168. 149.8 192. 168. 138. 8 192. 168. 159. 1 192. 168. 158. 3 Instance(库存) 192. 168. 129. 9 Instance(库存) 192. 168. 117.9 Instance(物流) 192. 168. 159. 2 Instance(物益) 192. 168. 157. 4 Nacos服务端源码单机运行 下载nacos源码 2 git clone https: //github ./alibabs/nacos-git 选择Tag 1.1.4版本 9203- 29: 25 2 12a K2134 c 2 elep.12.0'inl v12 2a 2 13.0 131 14e 源码整体结构(注意,nacos源码导入要求maven3.2.5以上版本): coring
Project nacos D:NideaProjectsspring-cloud-alibabanacos 17 github 18 idea 19 address [nacos-address] api[nacos-api] client [nacos-client] cmdb [nacos-cmdb] mon [nacos-mon] 5. config [nacos-config] 5 console [nacos-console] core [nacos-core] 29 distribution[nacos-distribution] doc example [nacos-example] istio[nacos-istio] logs naming [nacos-naming] s test [nacos-test] 36 work editorconfig gitattributes gitignore travis.yml 直接运行console模块里的.alibaba.nacos.Nacos.java 1增加启动m参数,注意nacos.hoe目录要改成你自己源码对应的distribution模块目录 1-Dnscos.standalone-true