相关文章
目录
(1).关于saf
(2).saf-dubbo与demo的简单解析
1.saf-dubbo特性
1.1本地0配置特性
1.2.度量特性
2.saf-dubbo-demo简述
(3).本地体验saf-dubbo
1.本地环境准备
1.1.docker-compose启动apollo
1.2.docker-compose启动zookeeper
1.3.打通本地宿主机与docker服务的网络
2.本地体验saf- Dubbo
(4).容器化部署环境准备
1.硬件要求
2.K8S单节点集群搭建
3.容器化相关基础组件
3.1.基础 中间件 容器化准备
3.2.zookeeper容器化部署
3.3.apollo容器化部署
3.4.ingress容器化
3.5.配置相关的ingress代理
(5).编译saf与saf-sample-dubbo-apollo
1.工程下载与编译顺序
2.编译saf
3.编译saf-sample-dubbo-apollo
(6).进行apollo配置
(6).容器化部署saf-sample-dubbo-apollo-service
1.制作saf-sample-dubbo-apollo-service镜像
2.容器化saf-sample-dubbo-apollo-service
(7).容器化部署saf-sample-dubbo-apollo-web
1.制作saf-sample-dubbo-apollo-web镜像
2.容器化saf-sample-dubbo-apollo-web
(8).验证服务
1.验证 spring boot actuator组件
2.验证业务接口( dubbo RPC)
3.zookeeper验证
4.度量验证
(1).关于saf
项目地址:
1.一个 微服务 框架,完全基于注解的方式开发。
2.适用于云原生(K8S)下的微服务体系搭建,为技术中台提供底层支撑。
3.解放业务,使业务方专注于业务逻辑本身:通过注解以搭积木方式引入各式资源,每个资源都是一行注解,极大提升业务方产出效率。

(2).saf-dubbo与demo的简单解析
1.saf-dubbo特性
1.1本地0配置特性
saf框架的一个最大特点是是本地0配置,所有配置都在分布式配置中心。
我们希望的是在远端分布式配置中心配置好,dubbo服务在启动时将远端配置拉下来注入对应的bean,完全做到本地0配置,将配置与代码完全隔离,有利于后期的各种热更新,为容器化/serverless做好基础准备。
saf-rpc-dubbo完成的就是这样一件事,工程地址:
利用springboot中的 bean PostProcessor完成这个特性支持,首先我们先回顾一下spring中 Bean 的实例化过程:
===Spring IOC容器实例化Bean===
===调用BeanPostProcessor的postProcessBeforeInitialization方法===
===调用bean实例的初始化方法===
===调用BeanPostProcessor的postProcessAfterInitialization方法===

也就是说我们只需要重写 BeanPostProcessor,在其中完成从配置中心的加载即可。
具体代码位于:
这里边也有不少坑,且有部分妥协(不重要/不实用部分),后边有时间专门开一篇。
1.2.度量特性
目前支持APM,QPS,Lantency。
APM度量使用spring-boot-starter-actuator。
QPS与Lantency使用DubboFilter和prometheus,代码位于:
通过dubbo.properties文件将Filter导入:
后续会引入DubboMetrics。
这里边也有坑,且有部分妥协(不重要/不实用部分),后边有时间专门开一篇。
2.saf-dubbo-demo简述
saf-dubbo-demo-service,@EnableSafDubbo主要是定义DubboService的apollo配置的前缀部分,达到注入。@EnableDubbo是Dubbo 注解,引入扫描包,如果只有DubboReference没有DubboService,可以省略此注解。

(3).本地体验saf-dubbo
1.本地环境准备
为了方便,笔者在本地mac上也装了 docker ,通过docker后台运行相关的apollo配置中心和 zookeeper 。
1.1.docker-compose启动apollo
git clone
cd apollo/scripts/docker-quick-start
执行命令:docker-compose up -d
注意第一次启动由于要下载相关镜像会很慢。-d表示谁后台运行。
docker exec -it apollo-quick-start /bin/bash
访问url并输入用户名密码:apollo/admin

验证config,访问url:

1.2.docker-compose启动zookeeper
下载镜像:docker pull zookeeper
启动镜像:docker run –name my_zookeeper -p 2181:2181 -d zookeeper:latest
这个命令会在后台运行一个 zookeeper 容器, 名字是 my_zookeeper, 并且它默认会导出 2181 端口.
接着我们使用:docker logs -f my_zookeeper
看到如下日志,说明启动成功:
2020-01-29 09:13:27,046 [myid:1] – INFO [main:ContextHandler@855] – Started o.e.j.s.ServletContextHandler@5649fd9b{/,null,AVAILABLE}
2020-01-29 09:13:27,063 [myid:1] – INFO [main:AbstractConnector@292] – Started ServerConnector@4520ebad{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2020-01-29 09:13:27,064 [myid:1] – INFO [main:Server@410] – Started @796ms
2020-01-29 09:13:27,064 [myid:1] – INFO [main:JettyAdm inServer@112] – Started AdminServer on address 0.0.0.0, port 8080 and command URL /commands
2020-01-29 09:13:27,069 [myid:1] – INFO [main:ServerCnxnFactory@135] – Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
因为刚才我们启动的那个 ZK 容器并没有绑定宿主机的端口, 因此我们不能直接访问它. 但是我们可以通过 Docker 的 link 机制来对这个 ZK 容器进行访问. 执行如下命令:
docker run -it — rm –link my_zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper
上述命令含义是:
启动一个 zookeeper 镜像, 并运行这个镜像内的 zkCli.sh 命令, 命令参数是 “-server zookeeper”
将我们先前启动的名为 my_zookeeper 的容器连接(link) 到我们新建的这个容器上, 并将其主机名命名为 zookeeper
当我们执行了这个命令后, 就可以像正常使用 ZK 命令行客户端一样操作 ZK 服务了.
这样方便我们查看zookeepr来换证saf-dubbo的注册情况。
1.3.打通本地宿主机与docker服务的网络
默认情况下,docker服务与本地宿主机不在一个网段,直接使用是有问题的,需要将两者网络打通,笔者使用的是vpn的方式,具体步骤参加文章:
docker-1:本地开发打通宿主机与docker服务网络
2.本地体验saf-dubbo
笔者提供了一个简单demo:saf-sample-dubbo-apollo。
首先我们要编译saf框架代码:
git clone
cd saf
mvn clean package install -Dmaven.test.skip=true
下载saf-dubb-demo:
git clone
cd saf-sample/saf-sample-dubbo/saf-sample-dubbo-apollo
saf-sample-dubbo-apollo是一个简单的dubbo与apollo集成的demo,方便我们观察本地0配置的特性。
修改saf-sample-dubbo-apollo-service,saf-sample-dubbo-apollo-web下的apollo-env.properties文件,将 dev .meta的值改为 。
在本地apollo完成配置,配置内容位于 github :

将工程saf-sample-dubbo-apollo导入eclipse,service和web各自增加启动参数后启动:
-Denv=dev -Dapp.id=demo-dubbo-apollo-service
-Denv=dev -Dapp.id=demo-dubbo-apollo-web
浏览器访问与验证:

(4).容器化部署环境准备
1.硬件要求
理想配置是8core,32GB。
2.K8S单节点集群搭建
3.容器化相关基础组件
3.1.基础中间件容器化准备
由于 PV 适用的是local PV,所以先初始化本地pv目录,执行local pv目录初始化脚本:
3.2.zookeeper容器化部署
3.3.apollo容器化部署
注意:使用容器化方式部署基础组件主要是为了快速构建allinone-demo的运行环境,实际生产中是需要权衡的,比如mysql不要放K8S里,而且上述基础组件的容器化都是最小资源防止超过硬件容量,比如rocketmq只有一组master/slave。
3.4.ingress容器化
3.5.配置相关的ingress代理
kubectl apply -f分别执行:
ingress-nginx-apollo-config.yaml
ingress-nginx-apollo-portal.yaml
(5).编译saf与saf-sample-dubbo-apollo
1.工程下载与编译顺序
git clone
git clone
他们的依赖关系是:
saf-sample依赖saf。
所以编译顺序是:saf -> saf-sample。
2.编译saf
本例使用的是master:
mvn clean package install -Dmaven.test.skip=true
- 编译saf-sample-dubbo-apollo
cd saf-sample
mvn clean package install -Dmaven.test.skip=true
(6).进行apollo配置
进入目录:
saf-sample/saf-sample-dubbo/saf-sample-dubbo-apollo/apollo-config
将apollo-config目录中的apollo-config.k8s.txt
配置文件配置到apollo配置中心:
1.项目:saf.base
命名空间:saf.base.registry
dubbo.registry.address = zookeeper://zk-hs.zookeeper-min:2181
命名空间:saf.log.level
app.logging.level.performance = info
app.logging.level.com.future = info
app.logging.level.access = info
app.logging.level.com.future.saf = info
app.logging.level.root = info
2.项目:demo-dubbo-apollo-service
命名空间:application
dubbo.saf-sample-dubbo-apollo-service.application.name = saf-sample-dubbo-apollo-service
dubbo.saf-sample-dubbo-apollo-service.module.name = dubbo-sample
dubbo.shoprpc.protocol.name = dubbo
dubbo.shoprpc.protocol.port = 20880
monitor.prometheus.port = 9145
monitor.log.delay = 10
monitor.log.period = 10
server.port = 8080
#logging.path = /data/logs/demo-dubbo-apollo-service
3.项目:demo-dubbo-apollo-web
命名空间:application
dubbo.saf-sample-dubbo-apollo-web.application.name = saf-sample-dubbo-apollo-web
dubbo.saf-sample-dubbo-apollo-web.module.name = dubbo-sample
monitor.prometheus.port = 9145
monitor.log.delay = 10
monitor.log.period = 10
server.port = 8080
#logging.path = /data/logs/demo-dubbo-apollo-web
从上表可以看到,我们是对apollo配置中心的使用制定了自定义规约的,本文重点不在这里,暂时不对此自定义规约进行详细描述,后续会做详细描述。
关于这部分,可以先参照文章:
里边有一张图描述了自定义规约。
(6).容器化部署saf-sample-dubbo-apollo-service
1.制作saf-sample-dubbo-apollo-service镜像
在目录saf-sample/saf-sample-dubbo/saf-sample-dubbo-apollo/saf-sample-dubbo-apollo-service下执行脚本docker.build.sh 制作docker镜像:
sh docker.build.sh
如果失败检查下docker.build.sh和Dockerfile中的demo版本。
2.容器化saf-sample-dubbo-apollo-service
进入目录saf-sample/saf-sample-dubbo/saf-sample-dubbo-apollo/saf-sample-dubbo-apollo-service / kubernetes:
直接执行脚本deploy.sh,会顺次执行上述 yaml 文件,执行kubectl get pod -n inc查看Pod,
(7).容器化部署saf-sample-dubbo-apollo-web
过程类似,这里简单描述。
进入目录:
saf-sample/saf-sample-dubbo/saf-sample-dubbo-apollo/saf-sample-dubbo-apollo-web
1.制作saf-sample-dubbo-apollo-web镜像
在目录saf-sample/saf-sample-dubbo/saf-sample-dubbo-apollo/saf-sample-dubbo-apollo-web下执行脚本docker.build.sh 制作docker镜像:
sh docker.build.sh
2.容器化saf-sample-dubbo-apollo-web
进入目录saf-sample/saf-sample-dubbo/saf-sample-dubbo-apollo/saf-sample-dubbo-apollo-web/kubernetes直接执行脚本deploy.sh。
这里有一个文件会把这个web服务挂到ingress上,从而将服务暴露到容器外部,供公网访问:
saf-sample-dubbo-apollo-web-prod-ingress.yaml
(8).验证服务
我们先查看saf-sample-dubbo-apollo-web的ingress域名:
[root@future kubernetes]# kubectl get ingress -n inc
[root@future kubernetes]# kubectl get ingress -n inc | grep -i dubbo
saf-sample-dubbo-apollo-web-prod saf-sample-dubbo-apollo-web.future.com ip1 80 6m29s
[root@future kubernetes]#
配置host:
Ip1 saf-sample-dubbo-apollo-web.future.com
1.验证spring boot actuator组件
浏览器访问
返回:{“status”:”UP”,”details”:{“diskSpace”:{“status”:”UP”,”details”:{“total”:105552769024,”free”:54718111744,”threshold”:10485760}}}}
2.验证业务接口(dubboRPC)
返回:
{“code”:0,”msg”:”getShop success.”,”data”:{“id”:335566,”name”:null,”ownerId”:null,”address”:null}}
3.zookeeper验证
这里使用zkui,zkui容器化参见:

4.度量验证
service是9145端口,对应dubbo_requests_in:

web(consumer)是9146端口,对应dubbo_requests_out:
