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 服务运行容器

调用关系说明:

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@provider1 src]$tar zxf dubbo-demo-provider-2.1.5-assembly.tar.gz	# 开发写的包
[root@provider1 src]$cd dubbo-demo-provider-2.1.5/
[root@provider1 dubbo-demo-provider-2.1.5]$ls
bin conf lib

[root@provider1 dubbo-demo-provider-2.1.5]$vim conf/dubbo.properties
dubbo.container=log4j,spring
dubbo.application.name=demo-provider
dubbo.application.owner=
# dubbo.registry.address=zookeeper://10.0.1.101:2181 | zookeeper://10.0.1.102:2181 | zookeeper://10.0.1.103:2181 # 注册中心:zookeeper,z集群k
dubbo.registry.address=zookeeper://10.0.1.101:2181 # 注册中心:zookeeper,单zk
dubbo.monitor.protocol=registry
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.log4j.file=logs/dubbo-demo-provider.log
dubbo.log4j.level=WARN

[root@provider1 dubbo-demo-provider-2.1.5]$./bin/start.sh # 启动provider,可能需要几分钟
Starting the demo-provider ........OK!
PID: 2813
STDOUT: logs/stdout.log

[root@provider1 dubbo-demo-provider-2.1.5]$tail -f logs/stdout.log # 查看日志
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
log4j:WARN No appenders could be found for logger (com.alibaba.dubbo.common.logger.LoggerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[2021-02-23 13:25:48] Dubbo service server started! # 启动成功

消费者示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@consumer1 src]$tar zxf dubbo-demo-consumer-2.1.5-assembly.tar.gz	# 开发写的包
[root@consumer1 src]$cd dubbo-demo-consumer-2.1.5/
[root@consumer1 dubbo-demo-consumer-2.1.5]$vim conf/dubbo.properties
dubbo.container=log4j,spring
dubbo.application.name=demo-consumer
dubbo.application.owner=
dubbo.registry.address=zookeeper://10.0.1.101:2181
dubbo.monitor.protocol=registry
dubbo.log4j.file=logs/dubbo-demo-consumer.log
dubbo.log4j.level=WARN
[root@kafka3 dubbo-demo-consumer-2.1.5]$./bin/start.sh # 启动consumer
Starting the demo-consumer ....OK!
PID: 2498
STDOUT: logs/stdout.log

[root@consumer1 dubbo-demo-consumer-2.1.5]$tail -f logs/stdout.log # 查看日志
[13:33:22] Hello world23, response form provider: 10.0.1.101:20880
[13:33:24] Hello world24, response form provider: 10.0.1.101:20880
[13:33:26] Hello world25, response form provider: 10.0.1.101:20880
[13:33:28] Hello world26, response form provider: 10.0.1.101:20880


[root@provider1 dubbo-demo-provider-2.1.5]$tail -f logs/stdout.log
[13:34:18] Hello world51, request from consumer: /10.0.1.103:13243
[13:34:20] Hello world52, request from consumer: /10.0.1.103:13243
[13:34:22] Hello world53, request from consumer: /10.0.1.103:13243
[13:34:24] Hello world54, request from consumer: /10.0.1.103:13243
[13:34:26] Hello world55, request from consumer: /10.0.1.103:13243
[13:34:28] Hello world56, request from consumer: /10.0.1.103:13243

以上示例是一个provider,如果是多个provider,则consumer会轮询读取

zookeeper 验证

dubbo admin

基于 zookeeper 发现并管理 provider 和 consumer

1
2
3
4
5
6
[root@kakfa1 webapps]$systemctl stop tomcat.service  # 先关闭tomcat,否则自动解压会出错
[root@kakfa1 webapps]$unzip dubboadmin.war -d dubboadmin # 别人编译好的包,手动解压
[root@kakfa1 webapps]$vim dubboadmin/WEB-INF/dubbo.properties # 配置文件
dubbo.registry.address=zookeeper://10.0.1.101:2181 # zookeeper地址
dubbo.admin.root.password=root # root用户,账号密码都是root
dubbo.admin.guest.password=guest # 访客

这个 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
2
3
4
5
6
7
项目依赖
插件
执行目标
项目构建 profile
项目版本
项目开发者列表
相关邮件列表信息

部署Maven:

1
2
3
4
5
6
7
8
# 官方文档:http://maven.apache.org/install.html
# 官方源:https://archive.apache.org/dist/maven/maven-3/
# 清华源:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/

[root@kakfa1 src]$wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
[root@kakfa1 src]$tar zxf apache-maven-3.6.3-bin.tar.gz
[root@kakfa1 src]$cd apache-maven-3.6.3/
[root@kakfa1 apache-maven-3.6.3]$export PATH=`pwd`/bin:$PATH

Maven打包命令:

  1. 进入到包含有“pom.xml”的路径,执行:

    1
    mvn clean install package
  2. 有的时候受到测试的干扰,导致无法正在进行编译,这时候可以选择跳过测试:

    1
    2
    3
    4
    mvn clean install package -Dmaven.test.skip=true

    -Dmaven.test.skip=true # 跳过测试,并且不编译测试下的源代码;
    -DskipTests # 不执行测试,但是会进行测试代码的编译;
  3. 如果需要编译的代码异常庞大,需要考虑对编译环境做一些处理,提高编译效率

    1
    2
    3
    mvn -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 # 启用多线程编译
  4. 所有的 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. 下载代码:

    1
    $ git clone https://github.com/apache/dubbo-admin.git
  2. 指定注册中心地址

    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
    ...
  3. 构建:

    1
    $ mvn clean package -Dmaven.test.skip=true
  4. 启动:

    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 # 注意端口冲突
  5. 访问:浏览器访问 http://10.0.1.101:8080