目录
(1).关于saf
(2).saf-allinone-demo说明
(3).容器化部署环境准备
1.硬件要求
2.K8S单节点集群搭建
3.容器化相关基础组件
3.1.基础中间件容器化准备
3.2.zookeeper容器化部署
3.3.mysql容器化部署
3.4.redis-cluster容器化部署
3.5.rocketmq-cluster容器化部署
3.6.apollo容器化部署
3.7.ingress容器化
3.8.配置相关的ingress代理
4.数据准备
(4).编译saf
1.工程下载与编译顺序
2.编译saf
3.编译saf-boot-starter
4.编译saf-boot-starter-sample-allinone
(5).进行apollo配置
(6).容器化部署saf-boot-starter-sample-allinone-service
1.制作saf-boot-starter-sample-allinone镜像
2.容器化saf-boot-starter-sample-allinone
(7).容器化部署saf-boot-starter-sample-allinone-web
1.制作saf-boot-starter-sample-allinoe-web镜像
2.容器化saf-boot-starter-sample-allinoe-web
(8).验证服务
1.验证spring boot actuator组件
2.验证业务接口(redis-cluster,motanRPC)
3.验证jvmCache(guava)
4.验证rocketmq使用
5.通过saf-boot-starter-sample-allinone-service的日志打印验证
(9).相关文档
说明:
本文全部以容器化方式部署为例(主要是因为部署高效),非容器化类似。
注:
之前本文发过一次,但是由于近期对saf框架做了拆分,拆分为4个工程:saf, saf-sample, saf-boot-starter, saf-boot-starter-sample,所以需要重新修改部分内容。
详情参见:
(1).关于saf
项目地址:
https://github.com/saf-group
1.一个微服务框架,完全基于注解的方式开发。
2.适用于云原生(K8S)下的微服务体系搭建,为技术中台提供底层支撑。
3.解放业务,使业务方专注于业务逻辑本身:通过注解以搭积木方式引入各式资源,每个资源都是一行注解,极大提升业务方产出效率。
(2).saf-boot-starter-sample-allinone说明
工程地址:
https://github.com/saf-group/saf-boot-starter-sample/tree/master/saf-boot-starter-sample-allinone
saf-boot-starter-sample-allinone涉及到的组件
demo中使用了主要的中间件,如redis-cluster(分布式缓存),druid(数据库连接池),motan(rpc),rocketmq(消息队列),apollo(分布式配置中心)
saf-boot-starter-sample-allinone包含的工程:
saf-boot-starter-sample-allinone-api:定义motan(rpc)接口
saf-boot-starter-sample-allinone-service:rpc-provider
saf-boot-starter-sample-allinone-web:rpc-consumer
(3).容器化部署环境准备
1.硬件要求
理想配置是8core,32GB。
2.K8S单节点集群搭建
kubernetes-1:使用kubeadm搭建K8S单master节点集群
3.容器化相关基础组件
3.1.基础中间件容器化准备
由于PV适用的是local PV,所以先初始化本地pv目录,执行local pv目录初始化脚本:
https://github.com/hepyu/k8s-app-config/blob/master/yaml/init.sh
3.2.zookeeper容器化部署
https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/zookeeper-min
3.3.mysql容器化部署
https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/mysql-min
3.4.redis-cluster容器化部署
https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/redis-cluster-min
3.5.rocketmq-cluster容器化部署
https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/rocketmq-min
3.6.apollo容器化部署
https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/apollo-min
注意:使用容器化方式部署基础组件主要是为了快速构建allinone-demo的运行环境,实际生产中是需要权衡的,比如mysql不要放K8S里,而且上述基础组件的容器化都是最小资源防止超过硬件容量,比如rocketmq只有一组master/slave。
3.7.ingress容器化
https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/ingress-nginx-min
3.8.配置相关的ingress代理
https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/ingress-nginx-min/proxy
kubectl apply -f分别执行:
ingress-nginx-apollo-config.yaml
ingress-nginx-apollo-portal.yaml
ingress-nginx-rocketmq-min-c0-console.yaml
然后在本地PC配置host即可访问对应的apollo和rocketmq后台。
4.数据准备
saf-allinone数据库数据初始化:
获得mysql的root用户的登录密码:
kubectl get secret --namespace mysql-min mysql-min -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
root密码是:9ZeNk0DghH
暴露mysql端口到容器外(可以选择其他方式如nodeport等)方便访问:
我这里使用port-forward方式:
kubectl port-forward pod-name local-port:container-port
如:注意指定命名空间
kubectl port-forward mysql-min-6fdb6bb7bb-f5g9t -n mysql-min 3306:3306
登录mysql:
mysql -h 127.0.0.1 -uroot -p9ZeNk0DghH
执行初始化sql,位于:
https://github.com/hepyu/saf/blob/master/saf-samples/saf-sample-allinone/saf-sample-allinone-service/sql/allinone.sql.txt
由于apollo我们只支持dev环境,所以需要修改一下数据库记录:
use ApolloPortalDB
update ServerConfig set Value='dev' where id=1\G
否则apollo可能运行时出问题。
(4).编译saf-boot-starter-sample-allinone
1.工程下载与编译顺序
git clone https://github.com/saf-group/saf.git
git clone https://github.com/saf-group/saf-boot-starter.git
git clone https://github.com/saf-group/saf-boot-starter-sample.git
他们的依赖关系是:
saf-boot-starter-sample.git依赖saf-boot-starter依赖saf。
所以编译顺序是:saf -> saf-boot-starter -> saf-boot-starter-sample。
2.编译saf
由于saf-boot-starter使用的是saf-1.0.6,所以先下载这个tag。
git fetch origin tag saf-1.0.6
git checkout saf-1.0.6
mvn clean package install -Dmaven.test.skip=true
3.编译saf-boot-starter
cd saf-boot-starter
mvn clean package install -Dmaven.test.skip=true
4.编译saf-boot-starter-sample-allinone
cd saf-boot-starter-sample
mvn clean package install -Dmaven.test.skip=true
(5).进行apollo配置
进入目录:
saf-boot-starter-sample-allinone/apollo-config
将apollo-config目录中的配置文件配置到apollo配置中心:dev.apollo-portal.future.com
apollo默认用户名是apollo,默认密码是admin。
需要创建的项目/namespace,附带每个namespace的内容地址:
配置内容的主路径位于:
saf-boot-starter-sample-allinone/apollo-config
需要创建的apollo项目 | 需要创建的apollo namespace | 用途 | 内容相对地址 | |
---|---|---|---|---|
名称 | 类型 | |||
saf.base | saf.actuator | public | spring boot actuator相关配置。 | pulibc-namespaces/saf.actuator |
saf.base.registry | public | 注册中心配置,如zk等。 | pulibc-namespaces/saf.base.registry | |
saf.log.level | public | 日志级别。 | pulibc-namespaces/saf.log.level | |
saf.monitor | public | 监控配置。 | pulibc-namespaces/saf.monitor | |
saf.rocketmq | saf.rocketmq.rocketmq-c0 | public | rocketmq集群配置。 | pulibc-namespaces/saf.rocketmq.rocketmq-c0 |
demo.db | demo.db.mall | public | demo业务线的商场DB配置。 | pulibc-namespaces/demo.db.mall |
demo.db.user | public | demo业务线的用户服务DB配置。 | pulibc-namespaces/demo.db.user | |
demo.redis-cluster | demo.redis-cluster.user | public | demo业务线的用户服务的redis集群配置。 | pulibc-namespaces/demo.redis-cluster.user |
demo.redis-cluster.mall | public | demo业务线的商城服务的redis集群配置。 | pulibc-namespaces/demo.redis-cluster.mall | |
demo.public-config | demo.public-config.pay | public | demo业务线公共配置:支付相关 | pulibc-namespaces/demo.public-config.pay |
demo.public-config.sms | public | demo业务线公共配置:sms短信相关。 | pulibc-namespaces/demo.public-config.sms | |
demo.public-config.spide | public | demo业务线公共配置:爬虫相关。 | pulibc-namespaces/demo.public-config.spide | |
demo.motan.referer | demo.motan.referer.mall | public | demo业务线商城rpcReferer。 | pulibc-namespaces/demo.motan.referer.mall |
demo.motan.referer.user | public | demo业务线用户rpcReferer。 | pulibc-namespaces/demo.motan.referer.user | |
demo-allinone-service | application | private | port,logPath,rpcProvider等配置。 | private-namespace-by-app/demo-allinone-service.application |
demo-allinone-web | application | private | port,logPath等配置。 | private-namespace-by-app/demo-allinone-web.application |
从上表可以看到,我们是对apollo配置中心的使用制定了自定义规约的,本文重点不在这里,暂时不对此自定义规约进行详细描述,后续会做详细描述。
关于这部分,可以先参照文章:
里边有一张图描述了自定义规约。
(6).容器化部署saf-boot-starter-sample-allinone-service
1.制作saf-boot-starter-sample-allinone-service镜像
在目录saf-boot-starter-sample-allinone/saf-boot-starter-sample-allinone-service下执行脚本docker.build.sh 制作docker镜像:
sh docker.build.sh
如果失败检查下docker.build.sh和Dockerfile中的demo版本。
2.容器化saf-boot-starter-sample-allinone-service
进入目录saf-boot-starter-sample-allinone-service/kubernetes:
直接执行脚本deploy.sh,会顺次执行上述yaml文件,执行kubectl get pod -n inc查看Pod,
(7).容器化部署saf-sample-allinone-web
过程类似,这里简单描述。
进入目录:
saf-boot-starter-sample-allinone/saf-boot-starter-sample-allinone-web
1.制作saf-boot-starter-sample-allinoe-web镜像
在目录saf-boot-starter-sample-allinone/saf-boot-starter-sample-allinone-web下执行脚本docker.build.sh 制作docker镜像:
sh docker.build.sh
2.容器化saf-boot-starter-sample-allinoe-web
进入目录saf-boot-starter-sample-allinoe-web/kubernetes直接执行脚本deploy.sh。
这里有一个文件会把这个web服务挂到ingress上,从而将服务暴露到容器外部,供公网访问:
saf-boot-starter-sample-allinone-web-prod-ingress.yaml
(8).验证服务
我们先查看saf-boot-starter-sample-allinoe-web的域名:
[root@future kubernetes]# kubectl get ingress -n inc
NAME HOSTS ADDRESS PORTS AGE
pro-apollo-configservice002 pro-apollo-configservice002 ip1 80 10d
pro-apollo-configservice003 pro-apollo-configservice003 ip1 80 10d
saf-sample-allinone-web-prod saf-web-allinone.future.com ip1 80 21m
service-apollo-portal-server dev.apollo-portal.future.com ip1 80 10d
配置host:
Ip1 saf-web-allinone.future.com
1.验证spring boot actuator组件
浏览器访问http://saf-web-allinone.future.com:30834/actuator/health
返回:{"status":"UP","details":{"diskSpace":{"status":"UP","details":{"total":105552769024,"free":54718111744,"threshold":10485760}}}}
2.验证业务接口(redis-cluster,motanRPC)
业务接口使用了redis-cluster,motanRPC,jvmCache(guava),业务接口正常返回说明上述组件OK。
http://saf-web-allinone.future.com:30834/user/getUserDetail?userId=1
返回:
{"code":0,"msg":"getUserDetail success.","data":{"id":1,"name":"user1","shopList":[{"id":1,"name":"shop1","ownerId":1,"address":"address1"}]}}
http://saf-web-allinone.future.com:30834/shop/getShopDetail?shopId=1
返回:
{"code":0,"msg":"getShopDetail success.","data":{"id":1,"name":"shop1","ownerId":1,"address":"address1","owner":{"id":1,"name":"user1"}}}
http://saf-web-allinone.future.com:30834/config/getSMSConfig
返回:
{"code":0,"msg":"getSMSConfig success.","data":{"aliyunSMSUrl":"https://sms.aliyun.com/sendSMS","mobileSMSUrl":"https://sms.chinamobile.com/sendSMS","unicomSMSUrl":"https://sms.chinaunicom.com/sendSMS"}}
3.验证jvmCache(guava)
这个只能到saf-service-allinone的pod容器里看了,会定时打印guava的访问统计信息,这个在真实业务中其实是可以做成metrics,然后加监控的,因为一般这么用都是一个高访问高并发的场景。
framework.log-2019-11-28 22:09:00.001 [scheduling-1] [INFO] [-] [c.f.s.s.a.l.ShopModelSafWrapperLocalCache] - cache container current size is:5
framework.log-2019-11-28 22:09:00.001 [scheduling-1] [INFO] [-] [c.f.s.s.a.l.ShopModelSafWrapperLocalCache] - cache container: threadPool.queueInfo: size:0, remainingCapacity:2147483647
framework.log-2019-11-28 22:09:00.001 [scheduling-1] [INFO] [-] [c.f.s.s.a.l.ShopModelSafWrapperLocalCache] - cache container: threadPool.info: activeCount:0, corePoolSize:10, maximumPoolSize:10, poolSize:10, completedTaskCount:40, largestPoolSize:10, taskCount:40
framework.log-2019-11-28 22:09:00.001 [scheduling-1] [INFO] [-] [c.f.s.s.a.l.ShopModelSafWrapperLocalCache] - cache container: cache.stats: averageLoadPenalty:1.0904045166666666E7, evictionCount:0, hitCount:40, hitRate:0.8888888888888888, loadCount:42, loadExceptionCount:0, loadExceptionRate:0.0, loadSuccessCount:42, missCount:5, missRate:0.1111111111111111, requestCount:45, totalLoadTime:457969897,
4.验证rocketmq使用
到rocketmq-console后台查看:
http://pro-rocketmq-min-c0.console.future.com:30834/#/message
至此,验证通过了redis-cluster, rocketmq, jvmCache(guava), spring boot actuator, motanRPC的正确使用。
5.通过saf-boot-starter-sample-allinone-service的日志打印验证
对应的代码位于:
https://github.com/saf-group/saf-boot-starter-sample/blob/master/saf-boot-starter-sample-allinone/saf-boot-starter-sample-allinone-service/src/main/java/com/future/saf/sample/allinone/listener/AllinoneListener.java
(9).相关文档
1.saf框架的工程拓扑与解析