目前 Java 中有两套成熟的微服务框架:
- Spring Cloud 整合的微服务工具集
- Spring Cloud Alibaba 微服务一站式解决方案
- 当然也可以自行选择最适合业务需要的工具,因为上面的工具集也是使用单一的工具整合起来使用的。
- 阿里系的微服务工具介绍和使用可以查看 spring-cloud-alibaba 的 github 文章,你也可以去 官方中文网
- 使用 Spring Cloud Alibaba 时,可以参考 官方版本选择说明。
- 为什么上面只写了使用 ali 系工具注意的点,因为普通程序员都有大厂崇拜心里
(包括我)。随着经验的增加,逐渐认识到这是不可取的,要有自己的思考。
Java 微服务组件
得益于 Javaer 非常多,所以大佬们出品的微服务的组件也是多种多样,这就是 Java 生态带来的自信!可以选择的东西很多,啊?什么?你说你是选择困难症!
那你听我细细到来:单单服务间的远程调用就有很多解决方案,比如 RMI(Sun/Oracle)、Thrift(Facebook)、Dubbo(阿里巴巴)、gRPC(Google)、otan2(新浪)、Finagle(Twitter)、brpc(百度)、Arvo(Hadoop)、JSON-RPC、REST 等。你想选择哪种呢?
一般而言,微服务组件按照功能大致分为以下几种,这些工具各司其职,在项目中完成自己的职责共同造就项目的无敌状态!!!
1. 服务注册与发现中心组件(管理微服务的健康值状态)
- Eureka(Netflix)
- Consul(HashiCorp,GO语言编写),启动后可以访问 ip:8500 进入管理页面
- Nacos(Alibaba开源),启动后可以使用 ip:8848 进入管理页面
- Zookeeper(Apache,Java 语言编写)
2. 服务间通信组件(远程调用)
- RestTemplate + Ribbon(NetFlix) 实现负载均衡
- OpenFeign(包含 Ribbon) 伪 http 客户端,支持 Spring 注解
- Dubbo(阿里开源)
RestTemplate 与 Openfegin 对比:
- RestTemplate 将路径写死在代码中,不利于维护。
- Openfegin组件(内部集成了 Ribbon):解决了 RestTemplate 实现服务间通信的所有问题,并且使用简单,支持注解。
使用 OpenFeign 组件进行客户端的服务通信时,映射地址(@RequestMapping)和被调用的 FeignClient 的对应的方法映射地址必须相同;方法名称可以不同,但为确保一致性,推荐使用相同的方法名和相同的映射地址。
3. 服务熔断器组件(解决服务雪崩问题)
- Hystrix(进入了维护模式)以及对应的可视化展示工具 Hystrix DashBoard
- Sentinel(阿里开源)
Hystrix 断路器打开条件:
- 当满足一定的阈值,默认 10 秒内超过 20 个请求
- 当失败率达到一定的时候,默认 10 秒内超过 50% 的请求失败
4. 服务网关中心组件(提供请求统一入口,路由转发,过滤)
- Gateway (转发、负载均衡、断言、过滤)
- zuul1.x zuul2.x
- Nacos(阿里开源)
5. 服务统一配置中心组件
- config 组件:
ConfigServer 获取远程仓库的地址存入本地仓库
ConfigClient 根据 ConfigServer 读取自身配置 - bus 组件:消息总线:将微服务所有节点链接到一起,通过总线实现自动配置刷新
- Nacos(阿里开源)
6. 事务组件
- Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。