dubbo
微服务这个概念是从单体服务(单体应用)演化而来的
微服务:micro server,把单体服务拆分成多个小服务,这些小服务就是微服务,每个小服务运行在单独的运行环境,早期一般用虚拟机,现在都是容器(docker + k8s)
- 微服务落地:容器,k8s + docker
- 微服务发现对方:注册中心、服务发现,zookeeper
- 微服务之间相互调用:API
- 微服务扩容:服务治理,k8s 实现服务编排
- 微服务监控:监控微服务的 API 等
- 微服务代码升级和回滚:CI / CD jenkings + gitlab
- 微服务日志查看:ELK,统一收集和展示
服务是相互调用的,一个服务可以即是服务提供方,同时又是服务消费方
微服务框架
这个开发比较关注微服务框架,作为运维,了解即可
spring boot
spring cloud
dubbo
阿里云微服务:https://promotion.aliyun.com/ntms/act/edasdubbo.html
dubbo 官网:https://dubbo.apache.org/zh/
阿里云 dubbo 简介:https://help.aliyun.com/document_detail/99299.html
dubbo 架构
https://dubbo.apache.org/zh/docs/v2.7/user/preface/architecture/
节点角色说明:
节点 | 角色说明 |
---|---|
Provider |
暴露服务的服务提供方 |
Consumer |
调用远程服务的服务消费方 |
Registry |
服务注册与发现的注册中心 |
Monitor |
统计服务的调用次数和调用时间的监控中心 |
Container |
服务运行容器 |
调用关系说明:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。
连通性
- 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小
- 监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示
- 服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销
- 服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销
- 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
- 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
- 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
- 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者
健壮性
- 监控中心宕掉不影响使用,只是丢失部分采样数据
- 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
- 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
- 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
- 服务提供者无状态,任意一台宕掉后,不影响使用
- 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复
伸缩性
- 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心
- 服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者
升级性
当服务集群规模进一步扩大,带动 IT 治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。下图是未来可能的一种架构:
节点角色说明:
节点 | 角色说明 |
---|---|
Deployer |
自动部署服务的本地代理 |
Repository |
仓库用于存储服务应用发布包 |
Scheduler |
调度中心基于访问压力自动增减服务提供者 |
Admin |
统一管理控制台 |
Registry |
服务注册与发现的注册中心 |
Monitor |
统计服务的调用次数和调用时间的监控中心 |
示例
生产者示例
zk 配置:https://dubbo.apache.org/zh/docs/v2.7/user/references/registry/zookeeper/
注册中心除了 zookeeper,还有其他方式:Nacos、Multicast、Redis、Simple
1 | [root@provider1 src]$tar zxf dubbo-demo-provider-2.1.5-assembly.tar.gz # 开发写的包 |
消费者示例
1 | [root@consumer1 src]$tar zxf dubbo-demo-consumer-2.1.5-assembly.tar.gz # 开发写的包 |
以上示例是一个 provider,如果是多个 provider,则 consumer 会轮询读取
zookeeper 验证
dubbo admin
基于 zookeeper 发现并管理 provider 和 consumer
1 | [root@kakfa1 webapps]$systemctl stop tomcat.service # 先关闭tomcat,否则自动解压会出错 |
这个 duboadmin 版本比较老,如果需要新版的 dubboadmin,需要手动编译
微服务编译
https://dubbo.apache.org/zh/docs/v2.7/dev/build/
maven
编译 c、c++,使用 make、cmake,编译 java,使用 maven
maven 是一个项目管理工具,可以对 Java 项目进行构建、解决打包依赖等
POM:Project Object Model,项目对象模型,是 Maven 工程的基本工作单元,是一个 XML 文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等,在执行任务或目标时,Maven 会在当前目录中查找 pom 文件,通过读取 pom 文件获取所需的配置信息,然后执行目标
Pom 文件中可以指定以下配置:
1 | 项目依赖 |
部署 Maven:
1 | # 官方文档:http://maven.apache.org/install.html |
Maven 打包命令:
进入到包含有“pom.xml”的路径,执行:
1
mvn clean install package
有的时候受到测试的干扰,导致无法正在进行编译,这时候可以选择跳过测试:
1
2
3
4mvn clean install package -Dmaven.test.skip=true
-Dmaven.test.skip=true # 跳过测试,并且不编译测试下的源代码;
-DskipTests # 不执行测试,但是会进行测试代码的编译;如果需要编译的代码异常庞大,需要考虑对编译环境做一些处理,提高编译效率
1
2
3mvn -T 4 clean install package -Dmaven.test.skip=true # 启动多线程编译
mvn -T 2C clean install package -Dmaven.test.skip=true # 分配编译的CPU个数
mvn clean install package -Dmaven.test.skip=true -Dmaven.compile.fork=true # 启用多线程编译所有的 Maven 都是建立在 JVM 上的,所以进行编译的时候还需要考虑 JVM 参数优化
1
2
3# bin/mvn是shell文件,配置参数:“MAVEN_OPTS”
$ export MAVEN_OPTS="-Xmx6g -Xms6g" >> /etc/profile
$ . /etc/profile
示例
以 dubbo admin 为例:https://github.com/apache/dubbo-admin/blob/develop/README_ZH.md
下载代码:
1
$ git clone https://github.com/apache/dubbo-admin.git
指定注册中心地址
1
2
3
4
5
6
7$ vim dubbo-admin-server/src/main/resources/application.properties
...
# centers in dubbo2.7
admin.registry.address=zookeeper://10.0.1.101:2181
admin.config-center=zookeeper://10.0.1.101:2181
admin.metadata-report.address=zookeeper://10.0.1.101:2181
...构建:
1
$ mvn clean package -Dmaven.test.skip=true
启动:
1
2
3
4$ mvn --projects dubbo-admin-server spring-boot:run
# 或
$ cd dubbo-admin-distribution/target;
$ java -jar dubbo-admin-0.2.0.jar --server.port=8080 # 注意端口冲突访问:浏览器访问 http://10.0.1.101:8080