您的位置 首页 golang

微服务框架saf-3:saf-dubbo与demo的解析与体验与容器化部署

相关文章

目录

(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

  1. 编译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:

文章来源:智云一二三科技

文章标题:微服务框架saf-3:saf-dubbo与demo的解析与体验与容器化部署

文章地址:https://www.zhihuclub.com/91854.shtml

关于作者: 智云科技

热门文章

网站地图