Spring Cloud 家族使用及思考,Services, load balance + Eureka + API Gateway + Zipkin等

前言

一直在前端耕耘,发现目前Pure FE实现的microservices总有各种不妥,于是乎尝试接触回一开始的Java系

阅读之前可以看看这篇文章了解Spring Cloud :中小型互联网公司对于Spring Cloud的选择与思考

纯吐槽,可以无视这段文字。这里很想解释为什么这里要说“接触回Java”,当年其实也是Java出身,但是各种痛苦啊,下个jdk配置环境变量,好不容易好了下个eclipse,结果官网下载还要翻墙,当年渣渣不懂搭梯子啊,真的是泪崩,好不容易搞好eclipse了,结果Eclipse里面Build Path不对又是一通乱搞,好不容易都妥当了,jdbc连个数据库又是各种安装,我想要个SQL数据库而已,不懂装,结果装了占用贼大的空间,当年那个电脑真的是“纯办公”电脑,经不起这些折腾,终于完整做完那个学期的期末项目后....

回到正题,接触microservices其实当初有两个选择:

  • Dubbo
  • Spring Cloud

都用过才知道优劣,于是两个都让它成功跑起来了

其实首先了解到的是Dubbo,毕竟挂了“阿里”的名号

但是发现Dubbo admin的UI像是上个世纪的产物,然后integrate了zookeeper后就另玩玩Spring Cloud

Dubbo UI 了解一下

Dubbo UI

后来继续了解microservices,结果发现还有个庞然大物叫Spring Cloud,于是抱着了解的态度搜索了一些资料。

SpringCloud Skills

结果发现需要了解的东西异常多,有点像要玩React的时候,发现要玩的还有Webpack,Redux, Router v4,Saga...等等N系列的包一样的感觉

也好在有这种经历,看到这么多sets倒也不会太胆怯,于是乎各种尝试跑了跑,结果有惊喜。

以往玩的时候没有maven,用得是eclipse,现在玩,基于spring boot, 用IDEA,结果真的是一路畅通(哈哈会不会也有当初搞环境的功劳)

于是搭起来了一份包含了:

对于Spring Cloud:

  • Eureka 注册中心
  • Ribbon实现REST Load balance
  • REST热部署
  • Fegion声明式调用
  • Hystrix服务熔断降级方式
  • Zuul实现微服务网关
  • Config Server实现分布式统一配置
  • Bus + Sleuth实现service链路追踪

对Spring boot service:

  • Swagger UI做API Doc,这个贼赞
  • Actuator进行单个服务的具体信息查找,如性能什么的,具体还得有项目玩才知道

hm应该没其他了,有再接触接触

其实就单个service来说也有相当多的东西可以写,比如swagger UI, Actuator等

但是这次让我贼感兴趣的是"Full Picture",在网上找了个教程学习搭建下

整个Spring Cloud家族,成功搭建起来,发现确实,后端的世界比我之前接触的先进很多很多了

Demo全图

  1. 基于Docker + mongoDB (不好意思,对这个数据库比较熟,而且做demo可以很快)在本地起个Portable的数据库
  2. 创建Spring config server, 实现服务创建的配置集中化
  3. 基于Spring boot + mongoDB实现 CURD,以 Customer为例子,算是初步了解spring boot的service搭建吧
  4. 基于Spring boot + mongoDB,创建一个提供Rate的服务,读取MongoDB里面的数据
  5. 基于Spring boot,创建一个Rate转换服务,实现服务调用者的调用逻辑
  6. 用Zuul创建API Gateway,让所有服务通过API Gateway调用
  7. 用Eureka创建一个注册中心,让所有的服务集中管理,查看已启动的所有服务
  8. 通过Zipkin, Sleuth实现服务调用的链路追踪
Spring Cloud Demo Structure

Phase 1 创建配置中心 + 创建Customer CURD

  • MongoDB


    MongoDB - Customer
  • Spring Config server + Customer Service


    Spring Config server + Customer Service

本来这些配置在项目之下,现在提权到config server所对应的配置中心处,并且可以设定是Dev还是UAT环境使用相应的配置


配置中心

Browser config server checking

其实这一步挺麻烦,不过搞清楚如何在Docker下使用mongoDB和设置相对应DB里Document的权限配置就可以了

效果:


GET

POST

GET AGAIN

剩下的都不放图了,差不多的

Phase 2 创建exchange-rate-provide-service,读取MongoDB数据

  • MongoDB


    Dum了Rate data
  • exchange-rate-provide-service

这里得强调下,在8000端口启动这个服务

USD to CNY

Phase 3 创建rate-convert-service, 调用exchange-rate-provide-service

就是汇率转换的服务,调用调取数据库的汇率服务


汇率转换服务

进到程序启动的log里面查看:


provide service

exchange service

同时有log刷新,成功调用,这里的port是指调取数据库汇率服务的服务提供接口,在这里输出8000以此为Load Balance,负载均衡做鉴别

Phase 3 创建Zuul API Gateway做服务接入口

8765端口创建及启动Zuul API Gateway,

API Gateway

然后在Service端设置相对应的Proxy即可
Service client

这时候通过API Gateway call之前创建的这两个服务
API Gateway call的规则是:
http:://

ex.
http://localhost:8765/exchange-rate-provide-service/exchange/from/USD/to/CNY

不过这里直接Call调用Rate的convert service吧,更直观


Call Convert service

然后看看API Gateway + convert + rate 三个APP的log

API Gateway:可以看到


API Gateway log

一个Triggle,起了两个Request,即其实服务流向是:
API Gateway => Convert Service => API Gateway => Rate Service


Rate Service

Convert Service

这里还用到了Sleuth做某个API call的链路追溯,黄色hightlight处第一个参数,就是Sleuth自动gen的,给这一个API call的id: 6c0e74a63dd6c9b4

Phase 4 创建Eureka server,注册所有service

目前看到的所有都不是UI层面的,开启的服务有多少,并不能清楚(一两个可以,多起来上百个的话,记不清的),所以必须有个服务注册中心,Eureka就充当这个角色

Eureka

简单创建,启动在端口8761,再根据文档注册所有service,包括API Gateway
Eureka UI

可以看到已经起来的API service instance
当然会显示一些常用的Info
More Details

Phase 5 Load Balance,负载均衡检测

接下来检测下load balance的功能是否还在
8001端口启动rate service,这里假设的是读取数据库/调用rate需要更大的消耗,需要更多service来提供服务,在另一个端口启动可以模拟在另一个服务器起这个instance

8001 rate service

成功启动后,刷新Eureka UI,你会发现:
find 8001

Eureka自动发现相关的service并注册进去,其实API Gateway也是,只能从log查看
API Gateway log

全程不需要重启任何服务,现在重新Call convert service
API Gateway - 8001, 8000 load balance.gif

实际这里这个Port作为一个鉴别作用,如果不输出,Consumer是完全不知道区别的

Phase 6 Zipkin 信息链路追踪

根据官方文档,安装Erlang, Rabbit MQ启动Zipkin,配置已有服务,启动Zipkin:


Zipkin

ZipkinUI

然后选择服务名查看即可:


Zipkin Tracing

可以查看整个Call的链路,以及耗时,对我这个乡里人来说,感觉还是很惊艳的

后话

至此,整个Demo基本就结束了。
还有很多功能,比如HATEOAS,Hystrix服务熔断,SwaggerUI,Actuator,JSON to SOAP自动转换,多语言,版本迭代等实现是实现了,但比较细,点比较多,而且应该属于Spring boot service单个使用比较合适,抽空整理再另外写个Demo,再写写

Keep Moving
搞点这些,前后端的seed有了,可以写个小demo项目玩玩

附:
前端Seeds: AoneFlow代码管理实践 + React + Redux + StyledComp + Intl 实现应用多语言多样式开发
后端Seeds: Spring boot service全家桶实现(未发布)

你可能感兴趣的:(Spring Cloud 家族使用及思考,Services, load balance + Eureka + API Gateway + Zipkin等)